返回列表

K-均值聚类算法详解

发布于 ·

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 assign
clusters(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 kmeans
manual(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

三、关键特性

✅ 优点

  1. 实现简单高效:时间复杂度为 O(nkt),适合大规模数据。
  2. 可解释性强:结果直观,易于可视化。
  3. 适用于球形分布的数据集:对凸形簇效果良好。

❌ 局限性

  1. 需预先指定K值:缺乏自动确定最佳K的方法。
  2. 对初始质心敏感:不同初始化可能导致不同结果。
  3. 仅适用于数值型数据:需预处理分类变量。
  4. 假设簇大小相近且密度均匀:对非球形或不规则形状聚类效果差。

四、如何选择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(krange, 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. 客户分群:根据消费行为划分用户群体。
  2. 图像压缩:减少颜色数量时用像素值聚类。
  3. 文档聚类:按主题对文本进行分类。
  4. 异常检测:远离所有簇中心的点可能为异常值。

六、进阶技巧

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等复杂模型打下基础。