聚类是数据分析中一种非常重要的无监督学习方法。它的厉害之处在于,能够在没有任何标签的情况下,自动从数据里发现隐藏的结构和规律。想象一下,你手头有一堆用户数据或者产品数据,事先并不知道怎么分类,这时候聚类就能派上用场——它会根据数据本身的特征,把相似的数据点归到同一类,让原本杂七乱八的数据变得有章可循。
比如你想了解一个产品网站的用户有哪些不同的行为类型。单纯靠猜测显然不靠谱,但用聚类的话,系统会根据用户的行为特征自动把他们分成几类,每类代表一种典型的用户群体。这样一来,后续就可以针对不同群体做精准推荐或者运营策略,这就很实用了。
说到聚类,最经典的方法要数K-means。它的目标很明确:给定n个数据点,把它们划分成k个聚类,让每个数据点都归到距离最近的中心点(质心)那里。算法会不断调整这种划分,直到所有数据点到各自质心的距离平方和最小为止。这个距离平方和也叫做组内平方和,是衡量聚类效果的一个关键指标。
理解距离怎么算,是掌握K-means的一个要点。说白了,两个数据点之间的距离,就是把它们的特征向量进行比较,最终映射成一个数值。数值越小,说明两个样本越相似。不同场景下用的距离计算方法也不同:欧几里得距离就是最直观的直线距离,计算简单,但数据维度特别高或者某个维度数值特别大的时候,容易被影响;曼哈顿距离就像在城市里开车,只能走水平和垂直方向,对异常值没欧几里得那么敏感;汉明距离专门用来处理分类变量;余弦距离则是看两个向量的夹角大小,适合那些结果更在意特征比例而不是绝对数值的情况。

K-means用的是欧几里得距离的平方,这跟算法本身的原理是分不开的。名字里就带了“means”(均值),算法每次迭代都会把质心移动到该聚类所有数据点的均值位置,本质上就是在最小化方差。而方差恰好就是欧几里得距离的平方。如果换成其他距离度量,同时还想最小化方差和,算法可能就收不了敛了。
整个算法的流程可以分为三步。第一步,先给数据做好归一化和异常值处理,然后随机挑选k个点作为初始质心。第二步,把所有数据点分配给距离最近的质心,形成k个聚类。第三步,计算每个聚类里所有数据点的均值,把质心移到均值位置。然后反复执行第二步和第三步,直到聚类结果不再变化,或者达到预设的迭代次数。
因为初始质心是随机选的,有时候结果可能掉进局部最优解。为了避免这个问题,通常会多跑几遍:用不同的随机种子初始化,分别运行算法,最后选损失最小的那次结果。
至于k值怎么选,这是K-means最让人头疼的地方。常用的办法有肘部法和轮廓系数。肘部法的思路是试着跑不同的k值,看看损失函数怎么变,把结果画成曲线。曲线通常是先快速下降,然后慢慢变平。在某个k值处会出现一个明显的拐点,弯得像人的肘部,这个拐点对应的k值就是比较合适的聚类数量。轮廓系数则是从紧凑度和分离度两个角度来衡量聚类好坏,取值在-1到1之间,越大说明聚得越好。

立即登录