微信登录

聚类算法 - K - 均值聚类 - K均值聚类的实现

聚类算法 - K - 均值聚类 - K 均值聚类的实现

一、引言

在数据挖掘和机器学习的领域中,聚类分析是一种重要的无监督学习方法,它能够将数据集中相似的数据对象划分为不同的组或簇。K - 均值聚类(K - Means Clustering)作为聚类算法中的经典代表,因其简单高效而被广泛应用。本文将深入探讨 K - 均值聚类算法的原理、实现步骤,并结合实际例子展示其具体应用。

二、K - 均值聚类算法原理

K - 均值聚类的核心思想是通过迭代的方式,将数据集划分为 K 个不同的簇,使得每个数据点到其所属簇的质心(均值)的距离之和最小。这里的 K 是用户预先指定的簇的数量。

(一)距离度量

在 K - 均值聚类中,常用的距离度量方法是欧几里得距离。对于两个 n 维向量 $x=(x1,x_2,\cdots,x_n)$ 和 $y=(y_1,y_2,\cdots,y_n)$,它们之间的欧几里得距离 $d(x,y)$ 定义为:
[d(x,y)=\sqrt{\sum
{i = 1}^{n}(x_i - y_i)^2}]

(二)目标函数

K - 均值聚类的目标是最小化以下目标函数:
[J=\sum{i = 1}^{K}\sum{x\in C_i}||x - \mu_i||^2]
其中,$K$ 是簇的数量,$C_i$ 表示第 $i$ 个簇,$\mu_i$ 是第 $i$ 个簇的质心,$||x - \mu_i||$ 表示数据点 $x$ 到质心 $\mu_i$ 的欧几里得距离。

三、K - 均值聚类算法实现步骤

(一)初始化

随机选择 K 个数据点作为初始质心 $\mu_1,\mu_2,\cdots,\mu_K$。

(二)分配数据点

对于数据集中的每个数据点 $x$,计算它到 K 个质心的距离,并将其分配到距离最近的质心所在的簇中。

(三)更新质心

对于每个簇 $C_i$,计算该簇中所有数据点的均值,将其作为新的质心 $\mu_i$。

(四)重复步骤(二)和(三)

重复分配数据点和更新质心的过程,直到质心不再发生显著变化或达到最大迭代次数。

下面是使用 Python 实现 K - 均值聚类算法的示例代码:

  1. import numpy as np
  2. def kmeans(X, K, max_iterations=100):
  3. # 初始化质心
  4. centroids = X[np.random.choice(X.shape[0], K, replace=False)]
  5. for _ in range(max_iterations):
  6. # 分配数据点到最近的质心
  7. distances = np.array([np.linalg.norm(X - centroid, axis=1) for centroid in centroids])
  8. labels = np.argmin(distances, axis=0)
  9. # 更新质心
  10. new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])
  11. # 判断质心是否不再变化
  12. if np.allclose(centroids, new_centroids):
  13. break
  14. centroids = new_centroids
  15. return labels, centroids
  16. # 示例数据
  17. X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
  18. K = 2
  19. labels, centroids = kmeans(X, K)
  20. print("聚类标签:", labels)
  21. print("质心:", centroids)

四、K - 均值聚类的应用实例

假设我们有一个水果销售数据集,包含水果的重量和甜度两个特征。我们希望将这些水果分为不同的类别,以便进行更精准的市场推广。

水果编号 重量(克) 甜度(百分比)
1 150 10
2 200 12
3 180 11
4 300 18
5 320 20
6 280 19

我们可以使用 K - 均值聚类算法将这些水果分为两类。以下是具体的 Python 代码:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 水果数据
  4. X = np.array([[150, 10], [200, 12], [180, 11], [300, 18], [320, 20], [280, 19]])
  5. K = 2
  6. # 调用 K - 均值聚类算法
  7. labels, centroids = kmeans(X, K)
  8. # 可视化结果
  9. plt.scatter(X[:, 0], X[:, 1], c=labels)
  10. plt.scatter(centroids[:, 0], centroids[:, 1], marker='X', s=200, c='red')
  11. plt.xlabel('重量(克)')
  12. plt.ylabel('甜度(百分比)')
  13. plt.title('水果聚类结果')
  14. plt.show()

通过运行上述代码,我们可以得到水果的聚类标签和质心,并将聚类结果可视化。从可视化结果中,我们可以直观地看到不同类别的水果分布情况,从而为市场推广提供参考。

五、K - 均值聚类的优缺点

(一)优点

  1. 简单高效:算法原理简单,实现容易,计算复杂度较低,适用于大规模数据集。
  2. 收敛速度快:通常能够在较短的时间内收敛到局部最优解。
  3. 可扩展性强:可以很容易地扩展到高维数据。

(二)缺点

  1. 需要预先指定 K 值:K 值的选择对聚类结果影响较大,但在实际应用中往往难以确定合适的 K 值。
  2. 对初始质心敏感:不同的初始质心选择可能会导致不同的聚类结果,甚至可能陷入局部最优解。
  3. 对噪声和离群点敏感:噪声和离群点可能会影响质心的计算,从而导致聚类结果不准确。

六、总结

K - 均值聚类算法是一种简单高效的聚类方法,在数据挖掘、机器学习等领域有着广泛的应用。通过本文的介绍,我们了解了 K - 均值聚类的原理、实现步骤,并通过实际例子展示了其具体应用。同时,我们也认识到了 K - 均值聚类算法的优缺点。在实际应用中,我们需要根据具体情况选择合适的聚类算法,并对数据进行预处理,以提高聚类结果的准确性。