MCM520 ← 资料站首页 K-Means 聚类 · 深度手册 打开交互阅读器 →

K-Means 聚类 · 深度手册

分类:聚类分类 | 难度:★☆☆ 入门 | 编号:kmeans

一、这是什么(一句话用途)

无标签数据分 k 组(客户分群 / 异常检测)

二、核心思想

K-Means 是最普及的聚类算法,假设数据可分成若干个"凸且等方差"的簇。它用一个极简的目标——最小化所有样本到其所属簇质心的平方距离之和——来驱动迭代:先随机放 kk 个质心,把每个点归到最近的质心,再重新计算每个簇的质心位置,如此反复直到质心不再明显移动。它快、易实现、对中等规模数据效果好;但对 kk 的选择、初始质心和离群点敏感,且只能发现球形簇。

三、数学原理与推导

目标函数(簇内平方误差和,SSE):

J=∑i=1N∑k=1Kzik∥xi−μk∥2,zik∈{0,1}, ∑kzik=1 J=\sum_{i=1}^{N}\sum_{k=1}^{K} z_{ik}\|x_i-\mu_k\|^2,\qquad z_{ik}\in\{0,1\},\ \sum_k z_{ik}=1

其中 μk\mu_k 为第 kk 簇质心,zik=1z_{ik}=1 表示样本 ii 属簇 kk。

Lloyd 算法交替优化(坐标下降):

  1. 固定 μk\mu_k,最优分配显然是把点分给最近质心:zik=1z_{ik}=1 当 k=arg⁡min⁡j∥xi−μj∥2k=\arg\min_j\|x_i-\mu_j\|^2;
  2. 固定 zikz_{ik},对 μk\mu_k 求导 ∂J/∂μk=2∑izik(xi−μk)=0\partial J/\partial\mu_k=2\sum_i z_{ik}(x_i-\mu_k)=0,得质心为簇内均值:

μk=∑izikxi∑izik \mu_k=\frac{\sum_i z_{ik}x_i}{\sum_i z_{ik}}

两步交替使 JJ 单调不增,收敛到局部极小。kk 常用肘部法(SSE 随 kk 下降的拐点)或轮廓系数选定。

四、建模 / 求解步骤

  1. 选 k
  2. 随机初始化质心
  3. 分配点到最近质心
  4. 重算质心
  5. 重复至收敛

五、关键公式速查

J=ΣΣ‖x−μ_c‖²,最小化簇内平方和中值

六、典型示例

用户消费数据 → 分高 / 中 / 低价值客群做差异化服务。

完整算例(数字演示,照着算一遍)

场景:8 个点 2 维,K=2。初心 (1,1),(5,5)。

迭代收敛:簇1={(1,1),(1,2),(2,1),(2,2)} 中心(1.5,1.5);簇2={(4,5),(5,4),(5,5),(6,5)} 中心(5,4.75)。

结论:收敛为左下、右上两类。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","kmeans.csv"))
X = df[["x","y"]].to_numpy(dtype=float)
rng=np.random.default_rng(6); K=3
mu=X[rng.choice(len(X),K,replace=False)]
for _ in range(50):
    c=np.argmin(((X[:,None]-mu)**2).sum(2),1)
    mu=np.array([X[c==k].mean(0) for k in range(K)])
print("簇中心:\n", np.round(mu,2))
print("簇大小:", np.bincount(c, minlength=K))

配套文件:py_kmeans.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% K-Means 示例(MATLAB/Octave)
df = readtable('..\datasets\kmeans.csv');
X = table2array(df(:,1:2));
rng(6); K=3; mu=X(randsample(height(X),K),:);
for i=1:50
  c=zeros(height(X),1);
  for k=1:height(X), d=sum((X(k,:)-mu).^2,2); [~,c(k)]=min(d); end
  for k=1:K, mu(k,:)=mean(X(c==k,:),1); end
end
disp(mu); tabulate(c)

配套文件:m_kmeans.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

60 个二维点(含 3 个自然簇的标签,仅供校验)。用于 K-Means 聚类并对比真实簇。

  • 字段:x, y, grp
  • 行数:60 行
  • 下载:kmeans.csv

十、常见误区与避坑清单

  • k 要预先定(肘部法)
  • 对初始质心 / 离群点敏感
  • 仅适合凸簇

十一、结果怎么解读

看簇大小与轮廓系数;异常小簇可能是离群。

十二、常与谁搭配

非凸用 DBSCAN。

十三、论文写作技巧(怎么把它写进论文)

把 K-Means 聚类 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

区分你要的是无监督划分(聚类)还是有监督判别(分类)。说明特征维度与样本量,以及为什么选 K-Means 聚类(如非线性边界用核方法、高维稀疏用线性、需概率输出用贝叶斯)。

2. 结果怎么写(图表与指标)

聚类给散点图着色 + 轮廓系数 / 肘部图;分类给混淆矩阵 + 准确率 / F1 / ROC 曲线。特征重要性图能加分。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 K-Means 聚类 进行无标签数据分 k 组(客户分群 / 异常检测)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt K-Means 聚类 to 无标签数据分 k 组(客户分群 / 异常检测). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

聚类要说明簇数怎么定(不是拍脑袋);分类要交代训练 / 测试划分与交叉验证,避免过拟合误报高精度。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

为揭示客户群体的内在结构,本文采用 K-Means 聚类 将 1,200 条样本划分为 4 类(轮廓系数=0.61),各类在消费频次与客单价上差异显著,为精准营销提供依据。

To reveal the intrinsic structure of customers, we apply K-Means 聚类 to partition 1,200 samples into 4 clusters (silhouette=0.61); the groups differ markedly in purchase frequency and average order value, supporting targeted marketing.

十四、相关手册(延伸阅读)

(暂无直接关联手册,可前往手册库浏览其它算法)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。