k-means可以说是聚类分析中最“接地气”的算法之一了。原理不复杂,但做起事来相当靠谱——用户分群、图像压缩、市场细分,很多实际场景里都能看到它的身影。如果你刚接触无监督学习,从k-means入手是个不错的选择。本文会把它的工作原理拆开来讲清楚,同时聊聊实际使用时需要注意的那些事儿。
先说说k-means想干什么。简单来讲,就是给一堆没有标签的数据,让算法自动把相似的样本归到同一组里。这里的“相似”怎么判断呢?主要看距离。两个数据点离得越近,就越可能被分到同一个簇;离得越远,说明差异越大。听起来很直观对吧?没错,这就是k-means的核心思路。
不过“距离”这个词在不同场景下有不同的算法。最常用的是欧几里得距离,也就是我们平常说的直线距离,算起来最简单,但它对高维数据和极端值不太友好。曼哈顿距离模拟的是城市里打车拐弯抹角走的路,对极端值的敏感度低一些。余弦距离关注的是方向而不是绝对数值,适合那些特征比例比较重要的场景。还有一种叫汉明距离的,专门用来处理分类数据。k-means默认用欧几里得距离,这跟算法背后的数学推导有关——后面会讲到。

接下来看算法具体怎么跑。它其实就是一个反复调整的过程。第一步,先随便挑k个点作为初始中心(也叫质心),可以是随机选的,也可以用一些技巧来选得聪明一点。第二步,把所有数据点都分配给离它最近的那个质心。第三步,重新算每个簇的质心——就是把这个簇里所有点的坐标取平均值。这三个步骤反反复复做,直到质心不再移动为止。
为什么要这么折腾呢?目标很明确:让所有点到各自所属簇质心的距离平方和尽可能小。选择欧几里得距离不是随便定的,因为在最小化平方和这件事上,均值恰好就是最优解,计算起来特别方便。
不过这里有个坑:算法对初始质心的选择挺敏感的。随机选的话,不同的起点可能跑出完全不同的结果。解决思路也不复杂——多跑几次呗。每次用不同的随机初始点,取结果中距离平方和最小的那次作为最终输出。代价是计算量会大一些,但能有效避免结果太离谱。
说完初始化的门道,再来看看k值该怎么定。这大概是使用k-means时最重要的决策了。k太大了,每个簇都挤得满满的,特征反而模糊;k太小了又把不该分在一起的样本硬凑到一块。常用的方法有两个:肘部法则和轮廓系数。
肘部法则的做法是尝试不同的k值,画出损失函数随k变化的曲线。曲线通常会出现一个明显的拐点——就像手肘一样——过了这个点后,继续增加k带来的收益急剧下降,这个拐点就是比较合适的k。轮廓系数则是衡量聚类质量的一把尺子,它同时考虑了簇内有多紧簇间有多远,取值范围在-1到1之间,越接近1说明分得越好。把不同k值对应的轮廓系数算一算,选最大的那个,基本不会出错。

说了这么多原理,再看看它能派上什么用场。电商平台可以用它给用户画像,把消费习惯、浏览偏好相似的用户归为一类,然后精准推送不同的营销方案。社交平台可以通过聚类发现行为模式相近的用户,为推荐系统提供参考。文本处理领域也能用k-means做文档归类,快速从海量文本中找出主题脉络。
不过用的时候也有几个前提。数据得是数值型的才行,分类变量需要提前转成数字。还有个容易被忽略的问题:量纲不统一的话,数值大的特征会主导距离计算,导致结果失真,所以归一化很重要。另外,如果数据里有明显的异常值,质心会被带偏,最好先处理掉。
总的来说,k-means虽然简单,但相当实用。理解透距离是怎么度量的、迭代是怎么进行的、k值该怎么选,在实际工作中就能灵活运用这个工具,从数据里挖出有价值的信息。

立即登录