当前位置:  首页>> 技术小册>> Python机器学习基础教程(上)

3.5.1 k均值聚类

在Python机器学习的基础教程中,聚类分析作为一种无监督学习方法,占据着举足轻重的地位。它能够在没有标签信息的情况下,将数据集划分为多个组或“簇”,使得同一簇内的数据点相似度高,而不同簇之间的数据点相似度低。在众多聚类算法中,k均值(k-means)聚类因其简单、高效而被广泛应用。本章将深入探讨k均值聚类算法的原理、实现步骤、Python应用实例以及优化策略。

3.5.1.1 k均值聚类算法原理

k均值聚类算法的核心思想是:通过迭代的方式,将数据集中的样本点分配到最近的均值(即聚类中心)所代表的簇中,然后更新每个簇的均值作为新的聚类中心,直到满足某种终止条件(如聚类中心不再发生变化或达到预设的迭代次数)。

  1. 选择初始聚类中心:首先,需要从数据集中随机选择k个样本点作为初始的聚类中心。这些点的选择对最终聚类结果有很大影响,可能导致算法陷入局部最优解。

  2. 分配样本到簇:对于数据集中的每一个样本点,计算其与各个聚类中心的距离(常用欧氏距离),并将其分配到距离最近的聚类中心所属的簇中。

  3. 更新聚类中心:重新计算每个簇内所有样本点的均值,并将该均值作为新的聚类中心。

  4. 迭代:重复步骤2和步骤3,直到聚类中心不再发生变化或达到预设的迭代次数。

3.5.1.2 Python实现k均值聚类

在Python中,scikit-learn库提供了非常方便的k均值聚类实现。下面是一个简单的示例,展示了如何使用scikit-learn中的KMeans类来进行k均值聚类。

  1. from sklearn.cluster import KMeans
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. # 示例数据集(二维空间中的点)
  5. X = np.array([[1, 2], [1, 4], [1, 0],
  6. [4, 2], [4, 4], [4, 0],
  7. [4, 5], [0, 2], [0, 4],
  8. [2, 2], [2, 3], [3, 3]])
  9. # 指定聚类数k
  10. k = 3
  11. # 创建KMeans实例,设置聚类数为k
  12. kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
  13. # 聚类中心
  14. centers = kmeans.cluster_centers_
  15. # 每个样本的簇标签
  16. labels = kmeans.labels_
  17. # 可视化结果
  18. plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
  19. plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75);
  20. plt.title('K-Means Clustering')
  21. plt.xlabel('Feature 1')
  22. plt.ylabel('Feature 2')
  23. plt.show()

3.5.1.3 初始聚类中心的选择与优化

k均值聚类的一个主要问题是初始聚类中心的选择。不同的初始选择可能导致不同的聚类结果,甚至陷入局部最优解。为了缓解这个问题,可以采用以下几种策略:

  1. 多次运行,选择最优解:通过多次运行k均值算法,每次选择不同的初始聚类中心,然后选择具有最小总内平方和(Within-Cluster Sum of Square, WCSS)的聚类结果作为最终解。

  2. K-Means++scikit-learn中的KMeans类默认使用K-Means++算法来选择初始聚类中心。K-Means++通过考虑样本点之间的距离,使初始聚类中心尽可能分散,从而减少陷入局部最优的风险。

  3. 智能初始化方法:还可以使用更复杂的初始化策略,如基于密度的初始化方法,这些方法通常需要根据具体数据集的特性来设计。

3.5.1.4 聚类数的选择

在实际应用中,聚类数k通常不是已知的,需要通过某种方法来确定。常用的方法包括:

  1. 肘部法则:通过绘制WCSS随k值变化的曲线,选择“肘点”对应的k值作为最优聚类数。肘点是指曲线开始趋于平稳的点,表示增加更多的簇对总内平方和的减少贡献不大。

  2. 轮廓系数:轮廓系数结合了凝聚度和分离度两个指标,用于评估聚类效果的好坏。轮廓系数的值范围在-1到1之间,值越大表示聚类效果越好。通过计算不同k值下的轮廓系数,选择使轮廓系数最大的k值作为最优聚类数。

  3. 基于领域知识的选择:有时,聚类数的选择可以基于对数据集领域的了解。例如,在市场营销中,可能根据产品的不同特性或市场细分策略来预设聚类数。

3.5.1.5 k均值聚类的局限性与优化

尽管k均值聚类算法简单高效,但它也存在一些局限性:

  • 对初始聚类中心敏感。
  • 只能处理数值型数据,对于分类数据需要进行适当的预处理。
  • 聚类结果可能受到异常值的影响。
  • 需要事先指定聚类数k。

为了优化k均值聚类算法,可以采取以下措施:

  • 使用更稳健的距离度量或聚类中心更新策略。
  • 对数据进行预处理,如标准化或归一化,以减少异常值的影响。
  • 结合其他算法(如层次聚类、DBSCAN等)来辅助确定聚类数或处理特殊类型的数据。

3.5.1.6 结论

k均值聚类作为一种基础且广泛使用的聚类算法,在数据分析、图像处理、市场细分等多个领域发挥着重要作用。通过理解其原理、掌握Python实现方法以及了解优化策略,可以有效地利用k均值聚类算法解决实际问题。然而,也应注意到其局限性,并结合具体应用场景和数据特性选择合适的聚类算法和参数。


该分类下的相关小册推荐: