K-均值聚类算法详解
一、什么是K-均值?
K-均值(K-Means) 是一种经典的无监督学习算法,主要用于数据聚类分析。它通过迭代将数据集划分为K个簇(clusters),使得每个数据点被分配到与其距离最近的簇中心(centroid)所代表的类别中。
核心思想
- 最小化簇内平方误差(SSE):使同一簇内数据点到其质心的距离平方和最小。
- 迭代优化:交替执行“分配”和“更新”步骤直至收敛。
二、算法流程
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
1. 初始化:随机选择K个初始质心
def initializecentroids(X, k):
indices = np.random.choice(len(X), size=k, replace=False)
return X[indices]
2. 分配步骤:计算每个点到所有质心的距离,并分配到最近的簇
def assignclusters(X, centroids):
distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
return np.argmin(distances, axis=1)
3. 更新步骤:重新计算每个簇的质心
def updatecentroids(X, labels, k):
newcentroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
return newcentroids
4. 主循环:重复分配与更新直到质心不再变化
def kmeansmanual(X, k, maxiters=100):
centroids = initializecentroids(X, k)
for _ in range(maxiters):
oldcentroids = centroids.copy()
labels = assignclusters(X, centroids)
centroids = updatecentroids(X, labels, k)
if np.allclose(centroids, oldcentroids):
break
return labels, centroids
三、关键特性
✅ 优点
- 实现简单高效:时间复杂度为 O(nkt),适合大规模数据。
- 可解释性强:结果直观,易于可视化。
- 适用于球形分布的数据集:对凸形簇效果良好。
❌ 局限性
- 需预先指定K值:缺乏自动确定最佳K的方法。
- 对初始质心敏感:不同初始化可能导致不同结果。
- 仅适用于数值型数据:需预处理分类变量。
- 假设簇大小相近且密度均匀:对非球形或不规则形状聚类效果差。
四、如何选择K值?
常用方法包括:
| 方法 | 原理 | 工具/公式 |
|------|------|----------|
| 肘部法则(Elbow Method) | 观察SSE随K变化的拐点 | inertia属性 |
| 轮廓系数(Silhouette Score) | 衡量样本聚类紧密度 | silhouettescore() |
from sklearn.metrics import silhouettescore
肘部法则示例
sse = []
krange = range(1, 11)
for k in krange:
kmeans = KMeans(nclusters=k, randomstate=42).fit(X)
sse.append(kmeans.inertia)
plt.plot(k
range, sse, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Sum of Squared Errors')
plt.title('Elbow Method')
plt.show()
轮廓系数
bestk = 2
bestscore = -1
for k in range(2, 11):
kmeans = KMeans(nclusters=k, randomstate=42).fit(X)
score = silhouettescore(X, kmeans.labels)
if score > bestscore:
bestk, bestscore = k, score
print(f"Best K: {bestk}, Silhouette Score: {bestscore:.3f}")
五、实际应用场景
- 客户分群:根据消费行为划分用户群体。
- 图像压缩:减少颜色数量时用像素值聚类。
- 文档聚类:按主题对文本进行分类。
- 异常检测:远离所有簇中心的点可能为异常值。
六、进阶技巧
1. K-Means++ 改进初始化
- 避免随机初始化导致的局部最优,通过概率加权选择更分散的初始质心。
2. 标准化预处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
Xscaled = scaler.fit_transform(X)
3. 评估指标对比
| 指标 | 适用场景 | 值域 | |------|--------|-----| | SSE | 比较不同K值 | [0, ∞) | | 轮廓系数 | 评估聚类质量 | [-1, 1] | | Calinski-Harabasz指数 | 簇间分离度 | (0, ∞) |七、总结
K-均值作为最基础的聚类算法,在理解数据结构和模式发现方面具有不可替代的作用。尽管存在局限性,但通过合理选择K值、结合领域知识进行结果验证,仍能在多数场景中提供有价值的洞察。
实践建议:
1. 始终检查数据是否需要标准化
2. 使用多种方法交叉验证K值
3. 可视化结果辅助业务解读
掌握K-均值是进入无监督学习的良好起点,也为后续学习谱聚类、DBSCAN等复杂模型打下基础。