机器学习之聚类算法K-means:原理、应用与实现

作者:暴富20212024.02.18 17:12浏览量:8

简介:本文将介绍聚类算法中的K-means算法,包括其工作原理、应用场景以及如何使用Python的sklearn库进行调用。此外,还将展示如何手动实现K-means算法,以帮助读者深入理解其工作机制。

机器学习中的聚类算法是一种无监督学习方法,用于将相似的对象分组在一起。K-means算法是最著名的聚类算法之一,其核心思想是通过迭代将数据划分为K个聚类,使得每个数据点与其所在聚类的质心之间的平方距离之和最小。

一、K-means算法原理

K-means算法的工作流程如下:

  1. 随机选择K个数据点作为初始聚类中心;
  2. 将每个数据点分配给最近的聚类中心,形成K个聚类;
  3. 对于每个聚类,重新计算其质心(即该聚类所有数据点的平均值);
  4. 重复步骤2和3,直到聚类中心不再发生显著变化或达到预设的迭代次数。

二、K-means算法的应用

K-means算法广泛应用于各种领域,如市场营销、生物信息学、图像处理等。例如,在市场营销中,企业可以将客户按照购买行为、兴趣爱好等因素进行聚类,以便更好地制定营销策略。在生物信息学中,基因表达数据可以通过K-means算法进行聚类,以发现具有相似功能的基因模块。

三、使用sklearn库调用K-means算法

Python的sklearn库提供了方便的接口来调用K-means算法。以下是一个简单的示例代码:

  1. from sklearn.cluster import KMeans
  2. import numpy as np
  3. # 生成随机数据
  4. data = np.random.rand(100, 2)
  5. # 创建KMeans对象并拟合数据
  6. kmeans = KMeans(n_clusters=3)
  7. kmeans.fit(data)
  8. # 打印聚类结果
  9. print(kmeans.labels_)
  10. print(kmeans.cluster_centers_)

在上面的代码中,我们首先导入了KMeans类和numpy库。然后,我们使用np.random.rand函数生成了100个随机数据点,每个数据点有2个特征。接下来,我们创建了一个KMeans对象,并指定要创建3个聚类。然后,我们使用fit方法拟合数据,并打印出每个数据点的聚类标签和聚类中心。

四、手动实现K-means算法

为了帮助读者深入理解K-means算法的工作机制,我们将手动实现该算法。以下是手动实现K-means算法的示例代码:

  1. import numpy as np
  2. def kmeans(X, K, max_iters=100):
  3. # 1. 随机选择K个数据点作为初始聚类中心
  4. centroids = X[np.random.choice(len(X), K, replace=False)]
  5. for i in range(max_iters):
  6. # 2. 将每个数据点分配给最近的聚类中心
  7. labels = np.argmin(np.linalg.norm(X[:, np.newaxis] - centroids, axis=2), axis=1)
  8. # 3. 对于每个聚类,重新计算其质心(即该聚类所有数据点的平均值)
  9. new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])
  10. # 4. 重复步骤2和3,直到聚类中心不再发生显著变化或达到预设的迭代次数
  11. if np.all(centroids == new_centroids):
  12. break
  13. centroids = new_centroids
  14. return labels, centroids

在上面的代码中,我们定义了一个名为kmeans的函数,该函数接受三个参数:数据集X、要创建的聚类数K和最大迭代次数max_iters。函数首先随机选择K个数据点作为初始聚类中心。然后,它通过迭代将每个数据点分配给最近的聚类中心,并重新计算每个聚类的质心。最后,函数返回每个数据点的聚类标签和最终的聚类中心。注意,我们使用np.linalg.norm函数计算数据点和聚类中心之间的欧几里得距离,并使用np.argmin函数找到最近的聚类中心。