从产品策划的角度看,不同的用户对产品可能有着不同的需求,所以需要针对不同的用户设计不同的产品功能。从产品运营的角度看,不同的用户对于产品的贡献度不同,需要区别对待。于是我们需要对用户进行分群,而在过去,我们通常采用某种规则来对用户进行分群,例如经典的RFM模型。基于规则的分群方法都需要由专家来定义规则,但是当用户行为发生变化的时候,规则往往很难及时适应。为了解决这个问题,我们可以尝试使用Ai聚类算法中的K-Means来对用户进行分群。
算法背景
K-Means又称为K均值聚类,在1967年由美国加州大学的詹姆斯·麦昆教授首次提出(James·B·MacQueen),但类似的算法思想可以追述到1957年的劳埃德算法(Lloydalgorithm)。
劳埃德算法的思想是先把所有需要分组的数据先随机分为k个初始化组(K可以是任意不大于样本数的正整数),然后计算每组的中心点,根据中心点的位置把数据分到离它最近的中心点,并根据最近原则重新分组。以此循环不断的计算中心并重新分组,直到结果收敛,即数据不再改变分组为止。
K-Means算法则是在劳埃德算法的基础上进行的改良,将第一步随机分为K个初始化组改为选取K个点,点的位置可以随机,也可以为了减少计算量而人工指定某些特定的点,后续流程没有变化,依然是循环计算每个数据到中心点的距离并重新分组直到结果收敛,以下是算法的流程图。
算法详解
K-Means算法理论上可以支持任意维度的数据,但为了方便作图演示,我们用一个简单的二维数据作为例子来看一下。
假定我们有以下4个数据需要进行分组
首先我们需要选择K个点作为初始中心,每一个点代表一个聚类中心,从图上我们可以看出应该分成2类,所以K的值定义为2,分别是点A和点B。然后随机给这两个中心点赋值,我们就暂定为A(0,0)和B(9,12)。
第二步,对于样本中的数据对象,根据点与点的距离公式计算他们与聚类中心的欧氏距离,按距离最近的准则将他们分到距离他们最近的聚类中心所对应的类。
计算后的结果如下,数据1和数据2距离A点更近,数据3和数据4距离B点更近,所以将数据1和2划为A类,数据3和4划为B类。
第三步,更新聚类中心位置,将每个类别中所有数据的均值作为该类别的聚类中心,那么A组的聚类中心为A=((2+1)/2,(2+4)/2)=(1.5,3),B组的聚类中心为B=((7+8)/2,(6+10)/2)=(7.5,8),如下图所示。
根据新的聚类中心,重复进行第二步的计算,计算后的结果如下
我们发现数据与新的聚类中心点的距离变近了,但是分组的情况并没有改变,依然是数据1和2为A组,数据3和4为B组,说明算法已经收敛,可以结束循环。如果在这一步的聚类结果与之前的结果还有差异,那么就还需要返回第二步继续进行循环计算,直到结果不再改变为止。
在上面这个例子中,通过肉眼观察,我们可以通过人工判断K值为2比较合适,但是如果数据量非常庞大,人工就很难判断了,这也是K-Means算法的一个缺点——需要由人工指定K的值。
那么是否有方法可以帮助我们判断K应该为多少比较合适呢,当然有。我们可以通过手肘法来确定K的个数,手肘法的核心指标是SSE(Sum of the Squared Error,误差平方和),计算公式如下。
SSE是计算每个数据与聚类中心的距离平方和,当和越小说明聚类中心越接近分组真正的中心点。K当分组数量越多时,SSE的值越小,所以当分组数量接近最佳分组数之后,再增加K的数量会让SSE下降幅度变小,随着K的不断增大而逐渐平缓,形成一个拐点,拐点对应的K值就是数据真实的分组数,因为函数的形状非常像一个手肘,所以才称为手肘法,如下图所示,当K取值为4之后的趋势明显变小。
接下来我们用一个实际的案例,来看一下在工作中如何应用K-Means算法。
实操案例
通过爬虫获取2018年2月1日到2019年2月1日,在人人都是产品经理社区上发表文章的作者及对应文章的阅读量,收藏量和点赞量。
业务目标是使用K-Means算法对作者进行分群,使用的工具是Excel+SPSS,我们先在Excel中进行数据清洗,然后在SPSS中进行聚类。
第一步,我们需要将作者去重,然后将每个作者1年内发表的所有文章所获得的阅读量、收藏量、点赞量累加起来
我们新增一个sheet2,将作者列复制到sheet2中,然后选中复制后的作者列,点击“数据”tab下的“删除重复项”按钮,每位作者只保留唯一数据。
第二步,将原始数据中完整的作者列和数据复制到新sheet的I到L列,并从B列开始分别创建汇总阅读量,汇总收藏量和汇总点赞量3个新的数据列。选中B2单元格,在输入框中输入累加公式:=SUMIF(I:I,A2,J:J),然后按回车得到求和结果。
SUMIF需要输入3个参数,分别是条件区域,求和条件,实际求和区域。意思是在条件区域内如果发现了符合求和条件的数据,则对实际求和区域中的数值进行求和。
第三步,同样运用SUMIF函数在C2和D2单元格计算汇总的收藏量和点赞量,然后框选B2到D2单元格,鼠标放在D2单元格的右下角双击,将公式填充至所有的单元格
第四步,数据归一化,这是K-Means聚类分析中很重要的一步,因为阅读量的数值远远大于收藏量和点赞量,如果直接求均值,会导致阅读量的权重大于收藏量和点赞量,所以我们需要对数据做归一化。
这里我们使用极差归一化公式,将三列数据分别进行归一化,让数值分布在0到1之间,极差归一化公式如下。
先在E1到G1单元格分别填入归一化阅读量,归一化收藏量和归一化点赞量的表头,然后选中E2单元格,输入=(B2-MIN(B:B))/(MAX(B:B)-MIN(B:B)),然后参照第三步的方法,将所有归一化的数据填充至表中。
第五步,数据整理,到这里,我们最开始复制过来的I到L列的原始数据就没用了,为了看数据方便我们需要删除他们。但前面汇总的数据和归一化的数据都是基于原始数据计算得来的,如果直接删除会导致公式没有值,所以我们需要先将公式转化为值,再将原始数据删除。
框选A到G列,右键复制,然后点击A1单元格,选择“开始”tab下的粘贴按钮,点击粘贴的下拉菜单,选择“粘贴值”的选项,这样就把公式转化为了数值后,就可以把原始数据删除了。
到这里,我们在Excel中完成了数据清洗的操作,接下来要用到SPSS进行K-Means聚类。
首先通过SPSS打开刚才的Excel文件,选择sheet2的数据,注意勾选“从第一行数据中读取变量名”的选项。
第二步,依次点击“分析”-“分类”-“K-均值聚类”
第三步,在弹出的弹窗中,分别将归一化之后的三列数据通过穿梭框按钮放在变量窗格里,将作者名放入个案标注依据的窗格里,然后将聚类数设为4。
第四步,点击弹窗中的迭代按钮,设置迭代次数,数据量越大,迭代次数最好设置得越多,这样方便算法收敛。如果没有达到最大迭代次数算法就收敛了,SPSS也能自动停止迭代,可以说是非常便利了。
第五步,点击弹窗中的保存按钮,勾选“聚类成员”的选项,这样算法在迭代完毕之后,就会生成一个新的列,用来标明聚类的结果,如果希望看到数据与聚类中心的距离也可以勾选第二个选项。
最后,点击确定,让系统自动完成聚类迭代并输出结果,我们可以在查看器以及新生成的变量列中查看最后的分类结果。
之前选择K值为4的原因是根据SSE公式,在K为4的时候形成了拐点,我们也可以尝试不同的K值,看看分类的结果是否不同,在实际使用中不一定要局限于数学算法,也可以根据业务需要设定不同的分组数量。
至此,我们的K-Means聚类分析就结束了,我们可以根据分类的结果来对不同的用户进行用户研究,形成用户画像,以及指导我们产品后续的功能规划设计和运营方案设计。
K-Means算法注意点
在使用K-Means算法时,有以下几个注意点需要特别注意:
K-Means只能用于连续数据,而不能用于分类数据
因为K-Means算法的核心是计算空间坐标中,点与点之间的平均值,而我们知道只有连续数据可以被计算,分类数据即使使用1234来表示,也只是作一个代称,而不可以进行数学计算。在计算之前,需先对数据进行归一化处理
对数据进行归一化处理是为了防止数据之间单位不一致,导致某些位数较大的参数拥有较高的权重,将所有的数据归一化则可以将所有的参数权重调节成一致。当然,如果因为业务特点而需要将某些参数的权重调高或者调低,也可以根据实际情况来,毕竟算法只是工具,真正起作用的还是使用算法的人。K-Means算法对数据噪声和离群值较为敏感
计算均值时需要所有的数据都参与,即使出现少量的离群数据,也会对均值产生极大的影响,所以在实际工作中使用算法时,通常需要先对离群值进行数据清洗,排除离群值对最终结果的影响,然后再进行聚类计算。
总结
K-Means属于十大经典机器学习算法之一,原理简单且应用场景非常广泛,例如用于人流量分群辅助实体店选址,自然语言处理领域中对话意图识别,计算机视觉中对图片进行分类等等。
如果大家还想到什么应用场景,可以在下方给我留言互动。
参考资料
WiKipedia《k-means clustering》
简书《聚类、K-Means、例子、细节》
CSDN《K-means聚类最优k值的选取》