通俗易懂:K-means聚类算法及其手动实现

作者:rousong2024.02.18 07:03浏览量:79

简介:K-means聚类算法是一种无监督学习方法,通过将数据划分为K个聚类,以最小化每个聚类内部数据的方差。本文将介绍K-means算法的基本原理、实现步骤以及手动实现方法,帮助您深入理解这一强大而简单的机器学习技术。

K-means聚类算法是一种无监督学习方法,通过将数据划分为K个聚类,以最小化每个聚类内部数据的方差。与有监督学习方法不同,无监督学习方法不需要事先标记的训练数据,而是通过数据自身的特征进行分类。本文将介绍K-means算法的基本原理、实现步骤以及手动实现方法,帮助您深入理解这一强大而简单的机器学习技术。

一、K-means算法基本原理

K-means算法的核心思想是迭代更新聚类中心和聚类结果,直到满足终止条件。具体来说,算法将数据集划分为K个聚类,每个聚类由一个中心点代表。在每次迭代中,算法会根据每个样本点与聚类中心的距离,将其分配给最近的聚类中心,然后重新计算每个聚类的中心点,并更新聚类结果。这一过程会不断重复,直到聚类中心不再发生明显变化或者达到预设的迭代次数。

二、K-means算法实现步骤

  1. 随机初始化类簇中心:根据需求假设由K个类簇中心k∈N,K<M(样本数量),随机选择K个样本点作为初始的类簇中心点。
  2. 分配样本点到最近的类簇中心:遍历数据集中的每个样本点,计算它到K个类簇中心的距离,并将其分配给最近的类簇中心。这一过程可以使用欧几里得距离、曼哈顿距离等度量方式。
  3. 重新计算类簇中心:对于每个已分配的聚类,计算其中所有样本点的均值,并将该均值作为新的类簇中心点。
  4. 迭代更新聚类结果:重复步骤2和3,直到满足终止条件,如聚类中心不再发生明显变化或者达到预设的迭代次数。

三、K-means算法手动实现

下面是一个简单的Python代码示例,演示如何手动实现K-means算法:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 随机生成数据集
  4. data = np.random.rand(100, 2)
  5. # 假设要创建3个聚类
  6. k = 3
  7. # 随机初始化聚类中心
  8. centers = data[np.random.choice(np.arange(len(data)), k, replace=False)]
  9. # 迭代更新聚类结果
  10. iterations = 100
  11. for i in range(iterations):
  12. # 计算每个样本点到聚类中心的距离,并分配给最近的聚类中心
  13. labels = np.argmin(np.linalg.norm(data - centers, axis=1), axis=0)
  14. # 重新计算聚类中心
  15. new_centers = np.array([data[labels == k].mean(axis=0) for k in range(k)])
  16. # 如果聚类中心不再发生变化,则停止迭代
  17. if np.all(centers == new_centers):
  18. break
  19. centers = new_centers
  20. # 绘制聚类结果
  21. plt.scatter(data[:, 0], data[:, 1], c=labels)
  22. plt.scatter(centers[:, 0], centers[:, 1], s=100, c='red') # 用红色标记聚类中心点
  23. plt.show()

这个代码示例使用了NumPy和Matplotlib库来生成数据集和绘制结果。首先随机生成了一个包含100个样本点的数据集,然后指定要创建3个聚类。接下来随机初始化3个聚类的中心点,并开始迭代更新聚类结果。在每次迭代中,计算每个样本点到每个聚类中心的距离,并将其分配给最近的聚类中心。然后重新计算每个聚类的中心点,并更新聚类结果。如果聚类中心不再发生变化,则停止迭代。最后,使用Matplotlib库绘制出聚类的结果,其中不同的颜色表示不同的聚类,红色的点表示聚类的中心点。通过这个简单的示例代码,您可以深入了解K-means算法的工作原理和实现方法。需要注意的是,在实际应用中,数据集通常很大并且维度较高,因此需要使用更加高效的数据结构和算法来加速K-means算法的运算过程。