网站管理系统怎么做,北京网站推广营销服务电话,网站建设对接模版,代理记账报税#x1f4d8; Python无监督学习中的聚类#xff1a;K均值与层次聚类实现详解
无监督学习是一类强大的算法#xff0c;能够在没有标签的数据集中发现结构与模式。聚类作为无监督学习的重要组成部分#xff0c;在各类数据分析任务中广泛应用。本文将深入讲解聚类算法中的两种… Python无监督学习中的聚类K均值与层次聚类实现详解
无监督学习是一类强大的算法能够在没有标签的数据集中发现结构与模式。聚类作为无监督学习的重要组成部分在各类数据分析任务中广泛应用。本文将深入讲解聚类算法中的两种常见方法K均值聚类和层次聚类结合Python代码详细介绍它们的实现与应用帮助理解不同聚类方法的优劣与使用场景。
目录 聚类的核心思想与应用场景 K均值聚类快速高效的聚类方法 层次聚类基于层次结构的灵活聚类 K均值与层次聚类的比较 实践如何选择合适的聚类方法 拓展结合轮廓系数评估聚类效果
1. 聚类的核心思想与应用场景
聚类是一种将数据划分为多个组或称为簇的技术每个簇内的数据点具有较高的相似性而簇间的数据点则差异较大。聚类的核心目标是寻找数据的潜在模式和结构而不依赖于标签信息。
应用场景
市场细分根据顾客的购买行为将其划分为不同的细分市场便于进行精准营销。图像分割将图像分割为多个区域用于图像处理与分析。异常检测通过聚类发现异常数据点这些数据点通常位于簇的边界之外。
2. K均值聚类快速高效的聚类方法
K均值聚类是最常用的聚类算法之一。它通过不断迭代来将数据集分成K个簇并使得每个簇的中心与其成员数据点之间的距离最小化。K均值算法的主要步骤包括
随机选择K个初始中心点即质心。将每个数据点分配给距离最近的质心。重新计算每个簇的质心。重复步骤2和3直到质心不再发生显著变化。 实现K均值聚类
在Python中使用KMeans类可以轻松实现K均值聚类。以下代码展示了如何应用K均值对二维数据进行聚类并可视化结果。
# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成示例数据
X, y make_blobs(n_samples300, centers4, random_state42, cluster_std0.60)# 创建K均值聚类模型设定K4
kmeans KMeans(n_clusters4)# 训练模型并获取聚类标签
kmeans.fit(X)
y_kmeans kmeans.predict(X)# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], cy_kmeans, s50, cmapviridis)# 可视化质心
centers kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], cred, s200, alpha0.75)
plt.title(K均值聚类结果)
plt.show()K均值的特点
效率高K均值算法的时间复杂度较低能够在较大数据集上快速运行。易于实现K均值算法简单直观并且能够在多数任务中表现良好。局限性K均值依赖于初始质心的选择容易陷入局部最优解此外K的值需要预先设定不适用于所有数据集。
代码中使用make_blobs生成了一个包含4个簇的模拟数据集并通过KMeans类对数据进行聚类。最终我们使用Matplotlib可视化了聚类结果其中红色点表示每个簇的质心。
3. 层次聚类基于层次结构的灵活聚类
层次聚类是一种通过创建簇的嵌套层次来进行聚类的算法分为自底向上凝聚型和自顶向下分裂型两种方法。自底向上的层次聚类开始时将每个数据点视为一个单独的簇逐渐合并相似簇直到达到指定的簇数或某一停止条件。它能够生成一棵聚类树称为树状图。 实现层次聚类
在Python中可以使用AgglomerativeClustering类实现凝聚型层次聚类并利用dendrogram函数可视化树状图。
# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs# 生成示例数据
X, y make_blobs(n_samples300, centers4, random_state42, cluster_std0.60)# 使用凝聚层次聚类
agg_clustering AgglomerativeClustering(n_clusters4)
y_agg agg_clustering.fit_predict(X)# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], cy_agg, cmapviridis)
plt.title(层次聚类结果)
plt.show()# 计算层次聚类的树状图数据
linked linkage(X, ward)# 绘制树状图
plt.figure(figsize(10, 7))
dendrogram(linked, orientationtop, distance_sortdescending, show_leaf_countsTrue)
plt.title(层次聚类树状图)
plt.show()层次聚类的特点
无需预设簇数层次聚类不需要预先设定K值能够自动生成簇的层次结构。结果直观树状图能够清晰展示数据的聚类层次便于理解和分析。计算代价高层次聚类的时间复杂度较高在大数据集上表现不如K均值高效。
通过AgglomerativeClustering实现了层次聚类代码中的dendrogram函数生成了对应的树状图从图中可以清楚地看到聚类的层次结构。在实际应用中层次聚类非常适合于数据点较少的场景或需要对聚类结果进行深入分析的任务。
4. K均值与层次聚类的比较
K均值和层次聚类在应用场景和算法特点上各具优势以下是两者的比较
特点K均值聚类层次聚类计算复杂度低适合大数据集高适合小数据集需要预设簇数是需要预设K值否可生成层次结构簇的形状适用于球状簇能处理复杂的簇形对噪声和异常点的敏感性对异常点敏感相对不敏感结果可解释性结果较简单树状图提供丰富的解释性
在选择聚类方法时需要考虑数据集的大小、簇的形状、计算资源以及对聚类结果的要求等因素。K均值在大规模数据上的表现优异而层次聚类则提供了更多分析层次和解释性。
5. 实践如何选择合适的聚类方法
选择聚类方法时应从以下几个维度进行考量
数据规模K均值算法适合大规模数据集层次聚类更适合小规模数据集。簇的形状如果簇的形状复杂且非球形层次聚类往往能给出更合理的划分结果。簇数的确定如果聚类数未知或希望获取层次结构信息层次聚类是更好的选择而K均值需要预设K值。计算资源K均值算法在大数据集上的速度优势明显适合资源有限的情况。
6. 拓展结合轮廓系数评估聚类效果
为了客观评估聚类结果的质量可以
使用轮廓系数。轮廓系数通过比较每个数据点与簇内其他点的距离与其与最近簇的距离给出聚类效果的度量。 实现轮廓系数评估
from sklearn.metrics import silhouette_score# K均值聚类模型
kmeans KMeans(n_clusters4)
kmeans_labels kmeans.fit_predict(X)# 计算K均值的轮廓系数
kmeans_silhouette silhouette_score(X, kmeans_labels)
print(fK均值轮廓系数: {kmeans_silhouette})# 层次聚类模型
agg_clustering AgglomerativeClustering(n_clusters4)
agg_labels agg_clustering.fit_predict(X)# 计算层次聚类的轮廓系数
agg_silhouette silhouette_score(X, agg_labels)
print(f层次聚类轮廓系数: {agg_silhouette})通过计算轮廓系数可以量化聚类的紧密程度与分离度从而辅助选择最佳的聚类方法。