在数据挖掘和机器学习的领域中,聚类分析是一种重要的无监督学习方法,它能够将数据集中相似的数据对象划分为不同的组或簇。K - 均值聚类(K - Means Clustering)作为聚类算法中的经典代表,因其简单高效而被广泛应用。本文将深入探讨 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 个数据点作为初始质心 $\mu_1,\mu_2,\cdots,\mu_K$。
对于数据集中的每个数据点 $x$,计算它到 K 个质心的距离,并将其分配到距离最近的质心所在的簇中。
对于每个簇 $C_i$,计算该簇中所有数据点的均值,将其作为新的质心 $\mu_i$。
重复分配数据点和更新质心的过程,直到质心不再发生显著变化或达到最大迭代次数。
下面是使用 Python 实现 K - 均值聚类算法的示例代码:
import numpy as np
def kmeans(X, K, max_iterations=100):
# 初始化质心
centroids = X[np.random.choice(X.shape[0], K, replace=False)]
for _ in range(max_iterations):
# 分配数据点到最近的质心
distances = np.array([np.linalg.norm(X - centroid, axis=1) for centroid in centroids])
labels = np.argmin(distances, axis=0)
# 更新质心
new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])
# 判断质心是否不再变化
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
return labels, centroids
# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
K = 2
labels, centroids = kmeans(X, K)
print("聚类标签:", labels)
print("质心:", centroids)
假设我们有一个水果销售数据集,包含水果的重量和甜度两个特征。我们希望将这些水果分为不同的类别,以便进行更精准的市场推广。
水果编号 | 重量(克) | 甜度(百分比) |
---|---|---|
1 | 150 | 10 |
2 | 200 | 12 |
3 | 180 | 11 |
4 | 300 | 18 |
5 | 320 | 20 |
6 | 280 | 19 |
我们可以使用 K - 均值聚类算法将这些水果分为两类。以下是具体的 Python 代码:
import numpy as np
import matplotlib.pyplot as plt
# 水果数据
X = np.array([[150, 10], [200, 12], [180, 11], [300, 18], [320, 20], [280, 19]])
K = 2
# 调用 K - 均值聚类算法
labels, centroids = kmeans(X, K)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='X', s=200, c='red')
plt.xlabel('重量(克)')
plt.ylabel('甜度(百分比)')
plt.title('水果聚类结果')
plt.show()
通过运行上述代码,我们可以得到水果的聚类标签和质心,并将聚类结果可视化。从可视化结果中,我们可以直观地看到不同类别的水果分布情况,从而为市场推广提供参考。
K - 均值聚类算法是一种简单高效的聚类方法,在数据挖掘、机器学习等领域有着广泛的应用。通过本文的介绍,我们了解了 K - 均值聚类的原理、实现步骤,并通过实际例子展示了其具体应用。同时,我们也认识到了 K - 均值聚类算法的优缺点。在实际应用中,我们需要根据具体情况选择合适的聚类算法,并对数据进行预处理,以提高聚类结果的准确性。