跳到主要内容

K-means

一、直观理解:先定中心,再把点分给最近的中心,然后重算中心​

K-means 把 nn 个点分成 KK 个簇,使每个点到其簇中心的平方距离之和尽量小。算法像两步舞蹈:

  1. 分配:每个点投靠最近的中心;
  2. 更新:每个中心挪到本簇点的均值。

反复直到归属不再变或目标函数稳定。它假设簇大致是球状、大小相近,中心用均值表示——因此对离群点敏感:一个极端值就能把中心拽偏。

二、适用场景与优缺点​

类型说明
适用场景大规模数值数据;簇近似凸且球状;需要快速分群与中心画像;作为更复杂方法的基线。
核心优点原理简单、极快;实现成熟;中心可解释;易与肘部法/轮廓系数配合选 KK。
局限与缺点要预先指定 KK;对初值敏感;非球状簇(月牙、环)表现差;离群点影响大;只能硬分配。

使用前:标准化、去极端异常、多次随机初始化、准备轮廓系数等验证。

三、核心原理​

目标函数(SSE / 惯性):

J=∑k=1K∑xi∈Ck∥xi−μk∥22,μk=1∣Ck∣∑xi∈CkxiJ=\sum_{k=1}^{K}\sum_{x_i\in C_k}\|x_i-\mu_k\|_2^2,\quad \mu_k=\frac{1}{|C_k|}\sum_{x_i\in C_k}x_i

Lloyd 迭代在“分配固定时最优中心是均值、中心固定时最优分配是最近中心”之间交替,使 JJ 单调不增,收敛到局部最优。全局最优是 NP 难的,故需多初值。

距离默认欧氏;若用其他 Bregman 散度,仍有类似中心更新形式。

四、关键决策​

决策点建议
KK肘部法 + 轮廓系数 + 业务可解释性
初值kmeans++(MATLAB 默认常见)或多随机重启
标准化量纲不同时必须
离群点先检测,或改 K-medoids/GMM/DBSCAN
空簇重新初始化或降低 KK
评价轮廓系数、CH 指数、稳定性(多次结果 ARI)

五、MATLAB 示例​

% 三团模拟数据
rng(1);
X = [randn(30,2)+[0 0]; randn(30,2)+[4 0]; randn(30,2)+[2 3]];
Xz = zscore(X);

% 基本 K-means
K = 3;
[idx, C, sumd, D] = kmeans(Xz, K, ...
"Replicates", 10, ...
"MaxIter", 300, ...
"Distance", "sqeuclidean");

figure; gscatter(Xz(:,1), Xz(:,2), idx); hold on;
plot(C(:,1), C(:,2), "kx", "MarkerSize", 12, "LineWidth", 2);
title("K-means 结果"); legend("Location","best");

fprintf("总 SSE = %.3f\n", sum(sumd));

% 肘部法
Ks = 1:6;
sse = zeros(size(Ks));
for i = 1:numel(Ks)
[~, ~, sumd] = kmeans(Xz, Ks(i), "Replicates", 5);
sse(i) = sum(sumd);
end
figure; plot(Ks, sse, "-o");
xlabel("K"); ylabel("SSE"); title("肘部法");

% 轮廓系数
eva = evalclusters(Xz, "kmeans", "silhouette", "KList", 2:6);
fprintf("轮廓系数建议 K = %d\n", eva.OptimalK);
figure; plot(eva);

% 簇画像(在原始尺度上解释更直观)
for k = 1:K
fprintf("簇 %d 样本量 %d, 原始均值:", k, sum(idx==k));
disp(mean(X(idx==k,:), 1));
end

六、如何解释结果​

  1. 中心坐标:还原到原始量纲后描述“典型成员”;
  2. 规模:各簇人数是否符合业务;
  3. SSE/轮廓:分离度与紧致度;
  4. 稳定性:不同随机种子 ARI 是否高;
  5. 命名:用 2–4 个突出特征命名,避免过度故事化。

七、常见误区​

1. 不标准化​

大尺度特征垄断距离。

2. 只看肘部一点折就定 KK​

肘部常不明显,需多指标与解释。

3. 把局部最优当唯一真相​

Replicates 必须加大。

4. 对月牙形数据硬上 K-means​

应改谱聚类或 DBSCAN。

5. 用分类准确率评价无标签聚类​

没有标签时用内部指标;有标签用 ARI/NMI,但那是验证不是训练目标。

附:建模论文中的写法要点​

  1. 问题对应:用一两句话说明为何该方法匹配题目数据结构与目标(分类/分群/排序/效率)。
  2. 符号与步骤:按“输入 → 预处理 → 核心计算 → 输出指标”列出编号步骤,公式与代码变量名一致。
  3. 参数表:列出全部可调参数、取值、选取依据(CV、信息准则、业务约束或灵敏度)。
  4. 结果呈现:主结果用表格;辅以 1–2 张图(边界、树状图、得分条形图、效率分解等)。
  5. 稳健性:至少做一种扰动——删点、换权重、换距离、换初值或换阈值,观察结论是否保持。
  6. 局限:主动写明假设(球状簇、线性可分、CRS、完全补偿等)及适用边界,避免被质询时被动。

若主方法结论与合理基线(如 K-means 对 GMM、加权和对 TOPSIS、CCR 对 BCC)严重冲突,应回到数据质量与指标方向检查,而不是只报告“更好看”的一种结果。

附:计算检查清单​

在提交结果前,建议按下列清单快速自检:

  1. 输入矩阵:行/列含义是否与正文一致,有无缺失、重复行、单位混用。
  2. 方向与尺度:极小型是否已正向化;聚类/距离类是否已标准化;评价类权重是否归一。
  3. 参数来源:所有阈值、簇数、核宽、理想解定义能否在正文找到依据。
  4. 数值稳定:协方差/相关是否接近奇异;DEA 线性规划是否全部求解成功;对数/除零是否加保护。
  5. 随机性:涉及随机初值的算法是否固定种子并报告多次结果的稳定性。
  6. 验证协议:分类任务是否严格隔离测试集;重采样/SMOTE 是否仅用于训练折。
  7. 图表编号:主结论表与图在正文中被引用,而不是只放附录。
  8. 可复现:给出软件版本(如 MATLAB R20xx)与关键函数名,使读者能重跑最小示例。

不满足清单中任一项时,优先修正流程,再讨论“方法先进性”。对综合评价题,额外检查:更换一种合理权重后,前三名是否大体稳定;若剧烈跳动,应降低对精细名次的措辞强度。

八、小结​

K-means 通过交替分配与均值更新最小化簇内平方误差,是最快、最常用的球状簇算法。

它是聚类的默认起点:标准化、多初值、选 KK、做画像。形状一复杂或噪声一多,就升级到 K-medoids、GMM 或密度方法。