🙋
「聚类」就是把数据分组,对吧?但是没有标签的情况下,怎么决定「这些数据属于同一组」呢?
🎓
问得好。这正是「无监督学习」的妙处。k-means法核心思想很简单:「相近的东西归为一组」。步骤只有两个:先把每个点分配到最近的「质心」;然后把质心移到聚集在它周围的点的平均位置。重复这两步。看左边的动画,用k=3的设置,你会看到 ✕ 标记的质心逐渐被点群吸引向中心。
🙋
这样反复执行真的会停止吗?不会一直循环下去吗?
🎓
会停的,而且数学上有保证。关键是「WCSS(聚类内平方和)」这个数值。它是所有点到其质心距离的平方和,代表聚类的紧密度。无论是分配步骤还是更新步骤,WCSS都不会增加——只会减小或保持。既然在递减的值有下限,那早晚会停止。看右边的「WCSS收敛曲线」图,你能看到它阶梯状地下降然后平稳。默认设置下,通常7次迭代就收敛了。
🙋
那k应该设多少呢?一开始不知道数据有几个聚类啊。
🎓
这就需要「肘部法则」了。用k=1,2,3,...分别跑k-means,把每个k对应的最终WCSS画成图。k越大WCSS越小,但超过数据真实的聚类数后,下降速度明显放缓。图上就像肘部一样出现折点,那个位置就是最优的k。看右边的「肘部法则」图,真实聚类数3的地方你应该能看到折点。试试把「真实聚类数」改成5,折点位置也会跟着移动。
🙋
初始化方法里有「k-means++」和「随机」。这对结果有影响吗?
🎓
影响很大。k-means的最终结果取决于「初始质心放在哪里」。随机初始化可能导致质心聚集在一起,陷入坏的局部最优。k-means++更聪明:先随机选一个质心,然后选择距离已有质心最远的点作为新质心的概率与其距离的平方成正比。这样初始质心就会散布在整个数据空间,更容易找到好的解。用scikit-learn的时候默认就是k-means++。试试切换初始化方法,看收敛后的WCSS有什么不同。
k-means法(Lloyd算法)交替重复两个步骤。(1) 分配步骤:将每个数据点分配给最近的质心(聚类中心)所在的聚类。(2) 更新步骤:将每个聚类的质心移动到该聚类所有点的平均位置。重复这两个步骤直到没有点的分配改变为止。每次迭代都保证聚类内平方和WCSS单调递减,有限次迭代后必然收敛。
WCSS(Within-Cluster Sum of Squares)是所有数据点到其所属聚类质心距离平方和的总和。用公式表示为WCSS = Σ_j Σ_{x∈C_j} ‖x−μ_j‖²,是聚类紧密性的目标函数。数值越小表示各聚类聚集越紧密。k-means算法在每次迭代时都会使WCSS单调递减。
肘部法则的方法是:对k=1,2,3,...分别运行k-means算法,记录每个k对应的最终WCSS值,然后绘制WCSS与k的关系图。当k增加时WCSS必然下降,但超过真实聚类数后下降速度会明显放缓。图上出现「肘」形折点的地方就是最优的k值。本工具的右侧图表可直观展示这一折点。
随机初始化随意选择初始质心,容易陷入局部最优解。k-means++先随机选择一个质心,之后选择距离已有质心最远的点作为新质心的概率与其距离的平方(D²)成正比。这样使初始质心分散在数据空间中,收敛后的WCSS更小且稳定。本工具可切换初始化方法对比结果差异。
客户分割:市场营销中常用k-means按购买额、访问频率、最后购买日期等指标对客户分组,形成「优质客户」「流失风险」「新客」等分段。用肘部法则或轮廓系数确定最优分段数,然后针对不同分段实施差异化策略。涉及多个量纲的指标时,需要事先进行标准化。
图像色彩量化:一张图片包含数万种颜色,将每个像素的RGB值视为三维空间的点,用k-means聚类可以提取k种代表色。用于GIF调色板生成、图像压缩、海报化效果等。将k设为16或256能在几乎保持视觉效果的前提下大幅减小文件大小。
异常检测和预处理:先用正常数据训练k-means模型,然后将距所有质心都较远的点标记为「异常」。也可用k-means做矢量量化,将大规模数据先聚类到k个代表点,只用这些代表点进行后续高成本分析,作为数据预处理手段。传感器数据的状态分类是典型应用。
工程与CAE数据整理:对多个仿真案例的结果(应力、位移、固有频率等)进行k-means分类,可快速识别具有相似行为的案例组。在设计探索(DOE)中用来聚合大量结果到代表案例,或在网格上按物理量对单元分类以增强可视化。设计优化和参数研究中常见。
最大的误解是「k-means一定能找到最优聚类」。k-means只保证WCSS在每次迭代中递减并收敛到「某个局部最优解」,不保证是全局最优。初始质心的位置决定了最终结果。因此实务中要用不同初值多次运行,选WCSS最小的那次结果。k-means++虽然提供了更好的初值,但仍需多次尝试。本工具切换初始化方法就能看到,相同的k值下WCSS可能不同。
其次「k-means适用于任何形状的聚类」是错误的。k-means按距离最近的质心分配点,决策边界必然是直线(高维情况下是超平面),隐含假设聚类是球形且大小相近。新月形、环形、细条形的非凸聚类以及大小差异大的聚类会分割不好。遇到这类数据应改用DBSCAN、谱聚类或高斯混合模型等其他方法。
最后要注意「不需要预处理」是个陷阱。k-means基于欧氏距离,量纲大的特征会主导距离计算。比如「年收入(百万级)」和「年龄(十几到几十)」混用,聚类会被年收入控制。必须对每个特征进行标准化(均值0、方差1)。另外k-means对离群值很敏感,因为质心是用平均值计算,异常值会大幅拉偏。如果数据中有大量离群值,应该考虑用中位数的k-medoids(PAM算法)。