聚类算法解析:K均值聚类

聚类算法是将相似数据分组在一起的过程,属于无监督学习的一种,即输入数据没有标签响应。聚类算法在金融、医疗和电子商务等多个领域都有应用。例如,在电子商务中,可以根据顾客的购买习惯将相似的客户群体分组,以便提供优惠或折扣。

在聚类中,每个数据点都属于某个聚类,但单个数据点不能同时存在于多个聚类中。聚类算法的性能可以通过诸如Dunn指数(DI)等指标来衡量。DI值较高的聚类具有较大的类间距离(良好分离)和较小的类内距离(紧凑)。

根据数据集的不同,可以采用不同的聚类方法,如基于质心的聚类、层次聚类/基于连接的聚类和基于密度的聚类。本文将重点介绍基于质心的聚类。

基于质心的聚类

K均值算法是众多基于质心的聚类算法之一。这里的K代表聚类的数量,是算法的一个超参数。算法的核心思想是找到K个质心,然后根据点与质心的接近程度将点分组,使得聚类中点到质心的平方距离之和最小化。这是一个非常困难的优化问题,因此通常使用近似方法来解决。Lloyd算法就是这样一种近似方法,其实现如下:

  1. 随机选择K个点作为质心/聚类中心。
  2. 根据欧几里得距离将数据点分配给最近的聚类。
  3. 计算聚类中所有点的质心。
  4. 重复迭代直到收敛(即连续迭代中点的聚类分配不变)。

然而,这种实现方式存在初始化敏感性问题。在初始化阶段选择不同的质心会导致生成不同的聚类。解决这个问题的方法是多次重复K均值算法,并选择最佳结果。

除了随机初始化外,还可以使用智能初始化过程,如K均值++算法。在某些情况下,质心难以解释,例如处理文本数据时,质心就无法解释。解决这个问题的方法是使用K中值算法。它会选择数据中最中心的成员作为聚类中心,并且通常比其他方法更能抵抗异常值。

可能会好奇如何选择K的最佳值。肘部法则或膝盖法则用于确定最佳K值。尝试对多个K值实施K均值算法,并将它们与质心的平方距离之和(损失函数)作图。曲线的肘部(明显弯曲处)被选为最优K值。

  • 在大多数情况下,算法运行时间为线性。
  • 简单直观,易于理解。
  • 需要事先知道聚类的数量。
  • 对异常值不够健壮。
  • 对于非凸形状的数据集效果不佳。
  • 尝试生成等大小的聚类。

下面是一个K均值算法的代码示例。将使用sklearn库中的K均值实现这个示例。

from sklearn.datasets import make_blobs from matplotlib import pyplot from pandas import DataFrame # 生成数据集 X, y = make_blobs(n_samples=100, n_features=2) df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y)) colors = {0:'red', 1:'blue', 2:'green'} fig, ax = pyplot.subplots() grouped = df.groupby('label') # 绘制数据点 for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key]) # 打印数据框和列名 print(df) print("Columns \n\n") print(df.columns) df_X = df[['x','y']] df_X # 导入K均值聚类库 import sklearn.cluster kmeans = sklearn.cluster.KMeans(n_clusters=3, init='k-means++', random_state=0).fit(df_X) # 打印聚类中心和标签 print("\n\n 聚类中心: \n\n ") print(kmeans.cluster_centers_) print("\n\n 标签") print(kmeans.labels_)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485