K-means 聚类模型详解
K-means 是一种常用的无监督学习算法,用于将数据集分成 K 个簇。其目标是最小化各个簇内数据点到簇中心的距离平方和。K-means 广泛应用于图像压缩、市场细分、模式识别等领域。
算法步骤
- 初始化: 随机选择 K 个初始簇中心(质心)。
- 分配: 将每个数据点分配给距离最近的簇中心。
- 更新: 重新计算每个簇的质心。
- 重复: 重复步骤 2 和 3,直到簇中心不再变化或达到预设的迭代次数。
公式推导
目标函数: 最小化各个簇内的平方误差和(Sum of Squared Errors, SSE)。
设
(
X
=
{
x
1
,
x
2
,
.
.
.
,
x
n
}
)
( X = \{x_1, x_2, ..., x_n\} )
(X={x1,x2,...,xn}) 为数据集, $ C = {c_1, c_2, …, c_K} $ 为簇中心, $S_i $ 为第 i 个簇中的数据点集合。目标函数为:
J
=
∑
i
=
1
K
∑
x
∈
S
i
∥
x
−
c
i
∥
2
J = \sum_{i=1}^{K} \sum_{x \in S_i} \|x - c_i\|^2
J=i=1∑Kx∈Si∑∥x−ci∥2
其中, ∥ x − c i ∥ \|x - c_i\| ∥x−ci∥ 表示数据点 x x x 到簇中心 $ c_i $ 的欧氏距离。
算法步骤
步骤 1: 初始化 C = { c 1 , c 2 , . . . , c K } C = \{c_1, c_2, ..., c_K\} C={c1,c2,...,cK}(随机选择 K 个数据点作为初始簇中心)。
步骤 2: 对每个数据点 $ x_j $,分配到最近的簇中心:
S
i
=
{
x
j
:
∥
x
j
−
c
i
∥
2
≤
∥
x
j
−
c
k
∥
2
,
∀
k
,
1
≤
k
≤
K
}
S_i = \{x_j : \|x_j - c_i\|^2 \leq \|x_j - c_k\|^2, \forall k, 1 \leq k \leq K\}
Si={xj:∥xj−ci∥2≤∥xj−ck∥2,∀k,1≤k≤K}
步骤 3: 重新计算每个簇的簇中心:
c
i
=
1
∣
S
i
∣
∑
x
∈
S
i
x
c_i = \frac{1}{|S_i|} \sum_{x \in S_i} x
ci=∣Si∣1x∈Si∑x
步骤 4: 重复步骤 2 和 3,直到簇中心不再变化。
运用示例
下面是一个使用 K-means 算法进行数据聚类的 Python 示例,使用 sklearn 库。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42, cluster_std=0.60)
# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.title("Generated Data")
plt.show()
# 使用 K-means 进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
# 获取簇中心
centers = kmeans.cluster_centers_
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title("K-means Clustering")
plt.show()
解释
- 生成数据: 使用
make_blobs
生成 300 个样本点,分成 4 个簇,标准差为 0.60。 - 可视化数据: 使用
plt.scatter
绘制生成的数据。 - K-means 聚类: 创建
KMeans
对象,设置簇数为 4,并拟合数据。 - 获取聚类结果: 使用
predict
方法获取每个数据点的簇标签。 - 获取簇中心: 使用
cluster_centers_
属性获取簇中心坐标。 - 可视化聚类结果: 绘制聚类后的数据点,并标记出簇中心。
优缺点
优点:
- 简单易理解,实现和解释都很直观。
- 计算效率高,适用于大规模数据集。
缺点:
- 需要预先指定簇的数量 K K K。
- 对初始值敏感,不同的初始值可能导致不同的结果。
- 适用于球形簇,不适用于非球形簇或密度不均匀的簇。
总结
K-means 是一种高效的聚类算法,通过迭代优化簇内距离平方和实现数据的自动分组。尽管有一些限制,如需要预先指定簇数和对初始值敏感,但在许多实际应用中仍然非常有用。通过结合实际数据集进行聚类分析,可以更好地理解数据的结构和模式。