聚类与降维
无监督学习没有标准答案,这既是它的用处,也是它最容易出问题的地方。同一份数据,换个算法、换个参数,甚至只换个随机种子,就能给出完全不同的分组——而每一种看上去都挺有道理。这一页想让你亲手把这些"合理的不同答案"都调出来,然后再决定要不要相信其中某一个。
本页实验台
LAB 01
K-means 迭代
逐轮显示指派与更新,初值不同结果不同
当前 SSE—
第几轮收敛—
换 20 个随机初值:SSE 的最好 / 最差—
各簇规模—
把初始化方式设成"随机挑 K 个点",然后只改随机种子。这里有一个和直觉相反的结果:最容易踩坑的,恰恰是看起来最好聚的那一组。三团分得清清楚楚的高斯,20 个随机初值的 SSE 最好与最差差 8.7%;换成"两个月牙"反而只差 1.5%;"大小悬殊的三团"几乎一点不差(0.0%)。道理不难想:三团高斯有一个非常典型的坏局部最优——两个簇心掉进同一团,剩下一个簇心横跨另外两团,这种配置的 SSE 明显更高,而且一旦落进去就再也出不来;月牙被 k=3 切开时,怎么切都是把两条细长的形状分成三段,各种切法的 SSE 差不多,于是它"稳定地一起错"。所以「初值敏不敏感」和「聚得对不对」是两件完全不同的事:月牙上每次都收敛到差不多的 SSE,而每一次都是错的。K-means 收敛只保证到局部最优,不保证到全局最优。换成 K-means++ 再看,还有一个更值得记住的反例。它让初始簇心尽量互相远离,在有的数据上确实管用("密度不均"那组:随机初值差 18.2%,K-means++ 降到 11.1%);可在月牙上它反而把差距从 1.5% 推到 10.7%——因为"尽量散开"会把两个簇心甩到同一条月牙的两个远端去。这是启发式的典型脾气:平均而言更好,但对任何具体一次都没有保证。真正可靠的做法是多跑几个初值取 SSE 最小的那次(正经实现默认就跑 10 次),而不是相信某一次运行,也不是相信某个更聪明的初始化。再换成"两个月牙":无论初值怎么选,K-means 都分不对。因为它的目标函数是"到簇心的平方距离最小",这等价于假设每个簇是各向同性的球——月牙不是球,所以它只能横着切一刀。换成"大小悬殊的三团"也一样:真实比例是 140 / 40 / 20,K-means 切出来是 122 / 49 / 29——大团被切走一块去补小团,因为平方距离对大簇的惩罚太重。这些都不是 bug,是目标函数写成那样的必然结果。
LAB 02
层次聚类
树状图与切割高度联动
当前切割高度—
各簇规模—
最后一次合并的高度—
最大簇占比—
层次聚类不需要事先指定 K——它把所有 K 的答案一次性算出来,装在那棵树里。你要做的只是决定在什么高度横着切一刀。树状图上纵轴是合并时两簇的距离,所以一个"好切"的位置就是纵向留白很大的那一段:说明再往上合并要跨越很远的距离,那大概是真的不同组。连接方式的影响比想象中大。单连接只看两簇最近的一对点,因此擅长发现细长、弯曲的形状,但也容易出现"链式效应"——两团之间只要有几个点搭成一条链,就会被连成一簇。把数据换成"两个月牙"、连接方式选单连接试试,它往往能分对,而 K-means 永远分不对;再换成全连接,月牙又被拦腰切开了。全连接偏爱紧凑的球形簇,平均连接介于两者之间,也是最常用的默认值。
LAB 03
DBSCAN
密度参数一调,噪声点与非球形簇的处理优势立刻显现
找到几个簇—
噪声点数—
核心点数—
从拐点估计的 ε—
DBSCAN 的两个优点在"两个月牙"和"密度不同的两团 + 噪声"上一眼可见:它不假设簇是球形的,而且它明确地承认有些点就是噪声。K-means 必须把每个点都塞进某个簇里,DBSCAN 不必。代价是 ε 很难定。右下那张图是标准做法:把每个点到它第 minPts 个近邻的距离排序画出来,曲线开始明显上翘的那个拐点,就是 ε 的合理取值(读数里给了一个自动估计,横线是你当前的选择)。ε 太小,所有点都成了噪声;ε 太大,所有簇连成一片。这个区间有时很窄。再选"密度不同的两团":会发现一个 ε 很难同时照顾两种密度——稀疏那团被判成噪声,或者稠密那团和别的连起来。这是 DBSCAN 最实在的局限,也是 HDBSCAN 被发明出来的原因。
LAB 04
PCA 与 t-SNE
主成分方向就是数据最「长」的方向;t-SNE 的困惑度参数怎么改变结构
前两个主成分的解释方差—
嵌入图上的轮廓系数—
原始高维空间里的轮廓系数—
当前方法—
先在"10 维空间里的 4 团高斯"上比较两种方法。PCA 是线性的:它找的是数据方差最大的那几个方向,所以主成分本身有明确含义(是原始特征的加权组合),而且新来的点可以直接投影进去。t-SNE 是非线性的,它只保留"谁离谁近",结果通常更好看、轮廓系数更高,但代价也很实在:它没有可复用的映射(新点必须重跑),簇与簇之间的距离没有意义,簇的大小也没有意义。t-SNE 图上两团离得远,不代表它们在原空间里真的离得远。把困惑度从 5 拖到 60 看一遍:同一份数据能被画成"很多小团"或者"几个大团",而困惑度并没有一个客观正确的取值。最后对比两个轮廓系数读数:原始空间里的那个才是数据本身的性质,嵌入图上的那个有相当一部分是降维算法自己造出来的。用 t-SNE 看结构可以,用它下结论要非常小心。
这一页想说的
无监督方法给出的从来不是"数据的真实分组",而是"在某个相似度定义和某组参数下,数据会被分成这样"。所以写结论的时候,把算法、距离度量、参数一起写出来,和写出结果同样重要。另外有两件小事很值得养成习惯:一是先跑几个不同的算法,看结论是不是稳;二是先把数据降到二维看一眼,很多时候一张散点图就能省掉一整轮参数搜索。