零编程实操AI算法:K-Means用户分群应用案例

从产品策划的角度看,不同的用户对产品可能有着不同的需求,所以需要针对不同的用户设计不同的产品功能。从产品运营的角度看,不同的用户对于产品的贡献度不同,需要区别对待。于是我们需要对用户进行分群,而在过去,我们通常采用某种规则来对用户进行分群,例如经典的RFM模型。基于规则的分群方法都需要由专家来定义规则,但是当用户行为发生变化的时候,规则往往很难及时适应。为了解决这个问题,我们可以尝试使用Ai聚类算法中的K-Means来对用户进行分群。

算法背景

K-Means又称为K均值聚类,在1967年由美国加州大学的詹姆斯·麦昆教授首次提出(James·B·MacQueen),但类似的算法思想可以追述到1957年的劳埃德算法(Lloydalgorithm)。

James·B·MacQueen

劳埃德算法的思想是先把所有需要分组的数据先随机分为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算法时,有以下几个注意点需要特别注意:

  1. K-Means只能用于连续数据,而不能用于分类数据
    因为K-Means算法的核心是计算空间坐标中,点与点之间的平均值,而我们知道只有连续数据可以被计算,分类数据即使使用1234来表示,也只是作一个代称,而不可以进行数学计算。

  2. 在计算之前,需先对数据进行归一化处理
    对数据进行归一化处理是为了防止数据之间单位不一致,导致某些位数较大的参数拥有较高的权重,将所有的数据归一化则可以将所有的参数权重调节成一致。当然,如果因为业务特点而需要将某些参数的权重调高或者调低,也可以根据实际情况来,毕竟算法只是工具,真正起作用的还是使用算法的人。

  3. K-Means算法对数据噪声和离群值较为敏感
    计算均值时需要所有的数据都参与,即使出现少量的离群数据,也会对均值产生极大的影响,所以在实际工作中使用算法时,通常需要先对离群值进行数据清洗,排除离群值对最终结果的影响,然后再进行聚类计算。

总结

K-Means属于十大经典机器学习算法之一,原理简单且应用场景非常广泛,例如用于人流量分群辅助实体店选址,自然语言处理领域中对话意图识别,计算机视觉中对图片进行分类等等。

如果大家还想到什么应用场景,可以在下方给我留言互动。

参考资料

WiKipedia《k-means clustering》
简书《聚类、K-Means、例子、细节》
CSDN《K-means聚类最优k值的选取》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容