超通俗讲透 K-Means 聚类算法
K-Means聚类算法是机器学习中最简单高效的无监督学习方法之一。本文用通俗易懂的方式全面讲解了K-Means的原理、公式、实现和应用。文章首先通过学生分组的例子形象说明算法过程,接着详细介绍了算法的四个步骤:初始化中心点、分配数据点、更新质心和迭代收敛。同时讲解了数学原理,包括目标函数和质心计算公式,并分析了算法的优缺点。实战部分提供了完整的Python代码示例,演示如何在鸢尾花数据集上应用K-
超通俗讲透 K-Means 聚类算法|原理+公式+代码+案例全解
K-Means 是机器学习里最简单、最常用、速度最快的无监督聚类算法,不管是本科实验、研究生论文、工业项目都高频使用。
我用最白话、最详细、最容易懂的方式,把原理、数学、代码、优缺点一次性讲全。
一、K-Means 到底是什么?
一句话:
K-Means = 把一堆数据分成 K 组,让每组内部尽量像,组之间尽量不像。
它做的事:
- 不需要标签(无监督)
- 你告诉它分几类(K)
- 它自动找中心点,自动分组
- 速度极快,百万数据也能跑
二、最通俗的例子:给学生分组
假设你要按身高、体重给学生分 3 组:
- 随便选 3 个人当“临时组长”(初始质心)
- 每个学生看自己离哪个组长最近,就归到那一组
- 每组算新组长:组里所有人身高体重的平均值
- 重复步骤 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=1∑Kx∈Ci∑∥x−μi∥2
- 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=∣Ci∣1x∈Ci∑x
就是簇内所有点的平均值。
五、K-Means 优点与缺点(面试必背)
优点
- 速度极快,适合大数据
- 原理简单,容易实现
- 球状数据效果极好
- 可解释性强
缺点
- 必须手动指定 K
- 对初始中心点敏感
- 对异常点(噪声)非常敏感
- 只能分球状簇,复杂形状不行
六、完整实战代码(鸢尾花数据集)
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% 的场景都能搞定。
更多推荐


所有评论(0)