聚类分析:没有标签,让点自己站队
前面的算法都有老师(标签)盯着,现在把老师请走。K-Means 只做两件事:把每个点分给最近的质心,再把质心挪到簇的平均位置——交替执行,直到谁也不再动。你可以亲手往画布加数据点,或者生成三簇示例数据,逐轮观察「站队」如何形成。
聚类画布 · 点击添加数据点
数据点按所属簇着色(未分配时为灰色);× 为各簇质心。点击画布可继续加点。
控制台
原理:聚类分析与 K-means 算法
K-Means 想最小化簇内平方和(SSE)——每个点到自己簇质心的距离平方之和:
SSE = Σk Σxᵢ ∈ Cₖ ‖xᵢ − μₖ‖²
直接求解很难(组合优化),于是用两步交替的 Lloyd 迭代,每一轮恰好让 SSE 下降(或不变):
- 分配:把每个点归给距离最近的质心,形成 K 个簇。固定质心时,这样分配一定让 SSE 最小。
- 更新:把每个质心挪到自己簇内所有点的均值位置。固定分配时,均值是让 SSE 最小的质心位置(对 ‖·‖² 求导为零的点)。
- 检查:如果这一轮没有任何点换簇,算法收敛,停下来。
两步各自「局部最优」、合起来 SSE 单调下降且有下界——所以一定收敛;但只保证局部最优:谁开局离得近,就永远跟着谁。
初值敏感与 K-Means++
- 问题演示:同一份数据点「重置质心」多试几次,可能得到完全不同的最终分簇——糟糕的初始化把两个质心都放进了同一个真簇,另一个真簇被硬劈成两半。
- 工程解法:K-Means++——让后续质心以「离已有质心越远概率越大」的方式抽取,保证开局分散;再多跑几组取 SSE 最小的一组(scikit-learn 的默认姿势,n_init=10)。
K 怎么选:肘部法则与它的局限
K 增大 SSE 一定变小(K=点数时 SSE=0),所以不能只看数值挑 K。肘部法则:画 SSE-K 曲线,找下降明显变缓的「拐点」——再分下去只是把完好的簇对半劈开。肘部不明显时(真实数据常这样),用轮廓系数(样本与同簇的平均距离 vs 最近异簇的平均距离,越接近 1 越好)或业务含义定 K。
它的隐含假设,和翻车现场
- 假设簇是「球状」且大小相近:按欧氏距离分最近质心,天然切出凸形簇。遇到月牙、环形、长条形必然翻车——欧氏距离最短的方向根本不沿簇走。
- 必须先标准化:量纲大的特征垄断距离,聚类等于只按那一个特征分(和 KNN 同病)。
- 替代方案:层次聚类(不需要 K,产出树状图)、DBSCAN(按密度长簇,能挖任意形状、还能识别离群点)、GMM(软分配 + 椭圆簇,是本站朴素贝叶斯思想的聚类版)。
无监督的意义
整个过程中算法从没见过任何标签——簇是「发现」出来的,不是「学」出来的。现实中标签昂贵(要人肉标注),无监督先用结构组织数据:用户分群、异常初筛、半监督的预训练……都是这一页的延伸。
动手实验:生成示例数据后点「重置质心」五次,记录每次最终 SSE——你会看到至少两种截然不同的分簇结果,这就是「局部最优」最直观的形态。
知识点拆解:把聚类学扎实
为什么一定收敛
分配步和更新步都让 SSE 不升,SSE 有下界(≥0),单调有界必收敛——但收敛点取决于起点。这是「局部最优」的标准证明模板,考试可直接套。
对应演示:SSE 只降不升均值是最优质心,欧氏是隐形假设
更新步用均值,是因为距离用平方欧氏——换成曼哈顿距离质心变中位数(K-Medians),换成余弦相似度就是球面聚类。算法的每一步都由「距离定义」决定。
对应演示:拖一个离群点看质心被拉偏没有标签怎么评聚类好坏
内部指标:SSE、轮廓系数、DB 指数(簇内紧+簇间远);外部指标:有真标签时用 ARI / NMI 对比分簇与真类。评估聚类比评估分类难一档,因为「好」本身就有多种定义。
关键词:轮廓系数 s∈[−1,1]K-Means 家族图谱
K-Means++(好初始化)、K-Medoids(用真实样本当中心、抗离群)、Mini-Batch K-Means(大数据采样版)、GMM(软分配+椭圆簇)。核心都一样:给「分给谁、中心在哪」换个答案。
关键词:初始化 / 中心类型- 质心 — 簇内点的均值位置
- SSE — 簇内平方和,越小越紧
- Lloyd 迭代 — 分配↔更新交替循环
- K-Means++ — 分散初始化的策略
- 肘部法则 — SSE-K 曲线的拐点定 K
- 轮廓系数 — 簇内紧 vs 簇间远的得分
期末高频问答
- K-Means 是监督还是无监督?为什么?无监督——全程没有使用任何标签,目标函数 SSE 只关于样本自身几何结构。「分簇」是从数据结构中发现的,不是从标签学来的。
- 为什么 K-Means 对离群点敏感?均值会被极端值拉走,质心一歪整簇重排。对策:K-Medoids(中心必须是真实样本点)、先做离群检测、或用 DBSCAN 直接把离群点标成噪声。
- K-Means 和 KNN 名字像,是一回事吗?完全不同。KNN 是有监督分类:找 K 个最近邻投票(有标签);K-Means 是无监督聚类:K 是簇数,全程无标签。考试最爱考这个混淆。