超通俗讲透 K-Means 聚类算法|原理+公式+代码+案例全解

K-Means 是机器学习里最简单、最常用、速度最快的无监督聚类算法,不管是本科实验、研究生论文、工业项目都高频使用。

我用最白话、最详细、最容易懂的方式,把原理、数学、代码、优缺点一次性讲全。


一、K-Means 到底是什么?

一句话:
K-Means = 把一堆数据分成 K 组,让每组内部尽量像,组之间尽量不像。

它做的事:

  • 不需要标签(无监督)
  • 你告诉它分几类(K)
  • 它自动找中心点,自动分组
  • 速度极快,百万数据也能跑

二、最通俗的例子:给学生分组

假设你要按身高、体重给学生分 3 组:

  1. 随便选 3 个人当“临时组长”(初始质心)
  2. 每个学生看自己离哪个组长最近,就归到那一组
  3. 每组算新组长:组里所有人身高体重的平均值
  4. 重复步骤 2、3,直到分组不再变

这就是 K-Means。


三、算法步骤(最清晰版)

步骤 1:选 K 个初始中心

随机选 K 个点当“质心”(centroid)。

步骤 2:分配点到最近的质心

每个点算到每个质心的距离,归到最近的那一类。

步骤 3:更新质心

每一类的新质心 = 这一类所有点的平均值。

步骤 4:重复直到收敛

质心几乎不动了,就停止。


四、数学原理(看得懂的公式)

1. 目标函数(要最小化)

每一类内部点到中心的距离总和越小越好

J=∑i=1K∑x∈Ci∥x−μi∥2 J = \sum_{i=1}^K \sum_{x \in C_i} \| x - \mu_i \|^2 J=i=1KxCixμi2

  • CiC_iCi:第 i 个簇
  • μi\mu_iμi:第 i 个簇的中心

2. 质心计算公式

μi=1∣Ci∣∑x∈Cix \mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x μi=Ci1xCix

就是簇内所有点的平均值


五、K-Means 优点与缺点(面试必背)

优点

  1. 速度极快,适合大数据
  2. 原理简单,容易实现
  3. 球状数据效果极好
  4. 可解释性强

缺点

  1. 必须手动指定 K
  2. 对初始中心点敏感
  3. 对异常点(噪声)非常敏感
  4. 只能分球状簇,复杂形状不行

六、完整实战代码(鸢尾花数据集)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

# 加载数据
iris = load_iris()
X = iris.data

# 1. 肘部法找最佳 K
inertia = []
K_range = range(2, 11)
for k in K_range:
    model = KMeans(n_clusters=k, random_state=42)
    model.fit(X)
    inertia.append(model.inertia_)

plt.plot(K_range, inertia, 'o-')
plt.xlabel('K')
plt.ylabel('惯性(距离总和)')
plt.title('肘部法找最佳K')
plt.show()

# 2. 训练 K-Means
k = 3
model = KMeans(n_clusters=k, init='k-means++', random_state=42)
labels = model.fit_predict(X)

# 3. PCA 降维画图
X_pca = PCA(2).fit_transform(X)
plt.scatter(X_pca[:,0], X_pca[:,1], c=labels, cmap='viridis')
plt.title('K-Means 聚类结果')
plt.show()

# 4. 输出评分
score = silhouette_score(X, labels)
print(f'轮廓系数 = {score:.3f}')

七、怎么选最好的 K?(两种方法)

1. 肘部法(Elbow Method)

看折线图的“拐弯点”。

2. 轮廓系数(Silhouette Score)

越接近 1 越好。


八、怎么优化 K-Means?(必看)

1. 使用 k-means++ 选初始中心

KMeans(init='k-means++')

2. 数据标准化(非常重要)

from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(X)

3. 多跑几次取最优

KMeans(n_init=10)

九、K-Means 适合什么时候用?

✅ 数据量大
✅ 簇形状接近球形
✅ 已知要分几类
✅ 追求速度与简单

❌ 不适合:

  • 形状奇怪的簇
  • 噪声很多
  • 不知道 K 是几

十、总结(最精炼)

K-Means 是最简单、最高速、最经典的聚类算法。
核心就是三句话:
选中心 → 分组 → 更新中心 → 重复。

只要你会用肘部法选 K、会标准化、会用 k-means++,基本 90% 的场景都能搞定。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐