如今各行各业都在谈数据,分析方法也是层出不穷。但在实际业务中,我们往往不能一上来就急着建模型,而是得先对数据做个全局摸底。这时候,聚类分析就派上用场了。很多人觉得聚类听起来简单,但它其实是挖掘数据隐藏规律的关键一环。今天,我们就来聊聊最经典的聚类算法之一——K-means,看看它是怎么帮我们给数据“分门别类”的。
K-means是一种无监督学习算法。通俗来讲,就是面对一堆没有标签的数据,让算法自己去发现里面的结构和层次。在实际业务里,聚类不仅能直接用来做用户分群,还经常作为其他复杂分析的前置探索。比如,我们想弄清楚产品里有哪些不同社交行为的用户群体。一开始靠主观经验去定义,往往很难找准。这时候,就可以根据用户的属性和行为数据跑一个聚类,把特征相似的归为一类,每个类别自然就代表了一种社交群体。有了这些初步的标签,后续再做个性化推荐或精细化运营,目标就清晰多了。

K-means的核心目标,是把n个数据点划分成k个簇。怎么划?靠的是“相似性”。每个簇都有一个“质心”,也就是簇里所有点的平均位置。算法会把每个数据点分配给离它最近的质心,并不断调整,直到所有数据点到其所属质心的距离平方和最小。这个距离平方和,也就是我们常说的损失函数。这里有个硬性前提:特征变量必须是数值型的,因为我们需要计算距离。距离的本质,就是把多维特征之间的差异折算成一个具体的数字,数字越小,说明两个样本越像。
常见的距离计算方法各有特点。比如最直观的欧氏距离(直线距离),但它对高维数据不太友好,且容易受极端大值影响;曼哈顿距离(出租车距离)计算的是水平和垂直方向的轴距总和,对单一维度的大值差异没那么敏感;汉明距离主要用于分类值向量;余弦距离则通过计算向量夹角的余弦值来评估相似度,更关注方向差异,适合只关心特征比例而不关心绝对数值的场景。不过,虽然距离度量有这么多,K-means在本质上其实是基于最小化方差和的,而方差在数学上正好等价于欧氏距离的平方。如果你强行换成其他距离,却依然去最小化方差和,整个算法就会陷入无法收敛的死胡同。这就是为什么K-means默认且必须绑定欧氏距离的原因。

了解了底层逻辑,我们再来看看K-means具体是怎么运转的。整个过程其实就是一个不断迭代优化的循环。先对数据进行归一化和离群点处理,然后随机挑选k个点作为初始质心。接着,计算所有数据点到这k个质心的距离,把每个点分配给最近的质心,完成初步分簇。随后,重新计算每个簇的质心,也就是把质心移动到当前簇内所有点的中心位置。最后,不断重复“分配点”和“更新质心”这两步,直到所有点到质心的距离平方和不再变化,模型就算收敛了。
听起来挺顺理成章,但这里有个坑:初始质心是随机选的。如果运气不好,初始点选得太差,模型可能会掉进局部最优解,而不是找到全局最优。怎么解决这个问题?一个简单有效的方法就是多次随机初始化。我们可以设定一个迭代次数,每次用不同的随机初始质心跑一遍完整的聚类过程,最后在所有尝试中,挑出那个距离平方和最小的结果作为最终输出。
在K-means里,K值的选择绝对是重中之重。K定大了,簇分得太细,失去业务意义;K定小了,又会把差异明显的群体混为一谈。常见的K值选择方法有肘部法则、轮廓系数、Gap Statistic,当然还有最原始的凭业务经验直接拍脑袋。
这里重点聊聊最常用的肘部法则。思路很直观:我们可以尝试不同的K值,把每个K值对应的损失函数画成一张折线图。横轴是K值,纵轴是损失函数。随着K值增加,簇分得越来越细,损失函数自然会不断减小。但是,当K值增加到某个特定数值时,损失函数的下降幅度会突然断崖式变缓。在折线图上,这个位置看起来就像人的手肘一样,有一个明显的拐点。比如,当K=5时出现了这样一个肘部,就意味着从5开始,再增加聚类数量带来的边际收益已经很小了。因此,这个拐点对应的K值,通常就是我们要找的最佳聚类数。
除了肘部法则,轮廓系数也是个好帮手。它综合考量了簇内的凝聚度和簇间的分离度,取值在-1到1之间。轮廓系数越接近1,说明簇内越紧凑,簇间越分离,聚类效果就越好。在实际操作中,把肘部法则和轮廓系数结合起来看,往往能帮我们更稳妥地敲定K值。毕竟,算法只是工具,让数据分析的结果真正落地并产生业务价值,才是我们的最终目的。

Войти сейчас