從產(chǎn)品策劃的角度看,不同的用戶對產(chǎn)品可能有著不同的需求谒臼,所以需要針對不同的用戶設(shè)計不同的產(chǎn)品功能。從產(chǎn)品運營的角度看耀里,不同的用戶對于產(chǎn)品的貢獻度不同蜈缤,需要區(qū)別對待。于是我們需要對用戶進行分群冯挎,而在過去底哥,我們通常采用某種規(guī)則來對用戶進行分群,例如經(jīng)典的RFM模型房官≈夯眨基于規(guī)則的分群方法都需要由專家來定義規(guī)則,但是當用戶行為發(fā)生變化的時候,規(guī)則往往很難及時適應(yīng)翰守。為了解決這個問題孵奶,我們可以嘗試使用Ai聚類算法中的K-Means來對用戶進行分群。
算法背景
K-Means又稱為K均值聚類蜡峰,在1967年由美國加州大學(xué)的詹姆斯·麥昆教授首次提出(James·B·MacQueen)了袁,但類似的算法思想可以追述到1957年的勞埃德算法(Lloydalgorithm)。
勞埃德算法的思想是先把所有需要分組的數(shù)據(jù)先隨機分為k個初始化組(K可以是任意不大于樣本數(shù)的正整數(shù))湿颅,然后計算每組的中心點载绿,根據(jù)中心點的位置把數(shù)據(jù)分到離它最近的中心點,并根據(jù)最近原則重新分組油航。以此循環(huán)不斷的計算中心并重新分組崭庸,直到結(jié)果收斂,即數(shù)據(jù)不再改變分組為止谊囚。
K-Means算法則是在勞埃德算法的基礎(chǔ)上進行的改良冀自,將第一步隨機分為K個初始化組改為選取K個點,點的位置可以隨機秒啦,也可以為了減少計算量而人工指定某些特定的點熬粗,后續(xù)流程沒有變化,依然是循環(huán)計算每個數(shù)據(jù)到中心點的距離并重新分組直到結(jié)果收斂,以下是算法的流程圖余境。
算法詳解
K-Means算法理論上可以支持任意維度的數(shù)據(jù)驻呐,但為了方便作圖演示,我們用一個簡單的二維數(shù)據(jù)作為例子來看一下芳来。
假定我們有以下4個數(shù)據(jù)需要進行分組
首先我們需要選擇K個點作為初始中心含末,每一個點代表一個聚類中心,從圖上我們可以看出應(yīng)該分成2類即舌,所以K的值定義為2佣盒,分別是點A和點B。然后隨機給這兩個中心點賦值顽聂,我們就暫定為A(0肥惭,0)和B(9盯仪,12)。
第二步蜜葱,對于樣本中的數(shù)據(jù)對象全景,根據(jù)點與點的距離公式計算他們與聚類中心的歐氏距離,按距離最近的準則將他們分到距離他們最近的聚類中心所對應(yīng)的類牵囤。
計算后的結(jié)果如下爸黄,數(shù)據(jù)1和數(shù)據(jù)2距離A點更近,數(shù)據(jù)3和數(shù)據(jù)4距離B點更近揭鳞,所以將數(shù)據(jù)1和2劃為A類炕贵,數(shù)據(jù)3和4劃為B類。
第三步野崇,更新聚類中心位置称开,將每個類別中所有數(shù)據(jù)的均值作為該類別的聚類中心,那么A組的聚類中心為A=((2+1)/2舞骆,(2+4)/2)=(1.5,3),B組的聚類中心為B=((7+8)/2径荔,(6+10)/2)=(7.5督禽,8),如下圖所示总处。
根據(jù)新的聚類中心狈惫,重復(fù)進行第二步的計算,計算后的結(jié)果如下
我們發(fā)現(xiàn)數(shù)據(jù)與新的聚類中心點的距離變近了鹦马,但是分組的情況并沒有改變胧谈,依然是數(shù)據(jù)1和2為A組,數(shù)據(jù)3和4為B組荸频,說明算法已經(jīng)收斂菱肖,可以結(jié)束循環(huán)。如果在這一步的聚類結(jié)果與之前的結(jié)果還有差異旭从,那么就還需要返回第二步繼續(xù)進行循環(huán)計算稳强,直到結(jié)果不再改變?yōu)橹埂?/p>
在上面這個例子中,通過肉眼觀察和悦,我們可以通過人工判斷K值為2比較合適退疫,但是如果數(shù)據(jù)量非常龐大,人工就很難判斷了鸽素,這也是K-Means算法的一個缺點——需要由人工指定K的值褒繁。
那么是否有方法可以幫助我們判斷K應(yīng)該為多少比較合適呢,當然有馍忽。我們可以通過手肘法來確定K的個數(shù)棒坏,手肘法的核心指標是SSE(Sum of the Squared Error,誤差平方和)燕差,計算公式如下。
SSE是計算每個數(shù)據(jù)與聚類中心的距離平方和俊抵,當和越小說明聚類中心越接近分組真正的中心點谁不。K當分組數(shù)量越多時,SSE的值越小徽诲,所以當分組數(shù)量接近最佳分組數(shù)之后刹帕,再增加K的數(shù)量會讓SSE下降幅度變小,隨著K的不斷增大而逐漸平緩谎替,形成一個拐點偷溺,拐點對應(yīng)的K值就是數(shù)據(jù)真實的分組數(shù),因為函數(shù)的形狀非常像一個手肘钱贯,所以才稱為手肘法挫掏,如下圖所示,當K取值為4之后的趨勢明顯變小秩命。
接下來我們用一個實際的案例尉共,來看一下在工作中如何應(yīng)用K-Means算法。
實操案例
通過爬蟲獲取2018年2月1日到2019年2月1日弃锐,在人人都是產(chǎn)品經(jīng)理社區(qū)上發(fā)表文章的作者及對應(yīng)文章的閱讀量袄友,收藏量和點贊量。
業(yè)務(wù)目標是使用K-Means算法對作者進行分群霹菊,使用的工具是Excel+SPSS剧蚣,我們先在Excel中進行數(shù)據(jù)清洗,然后在SPSS中進行聚類旋廷。
第一步鸠按,我們需要將作者去重,然后將每個作者1年內(nèi)發(fā)表的所有文章所獲得的閱讀量饶碘、收藏量目尖、點贊量累加起來
我們新增一個sheet2,將作者列復(fù)制到sheet2中扎运,然后選中復(fù)制后的作者列卑雁,點擊“數(shù)據(jù)”tab下的“刪除重復(fù)項”按鈕,每位作者只保留唯一數(shù)據(jù)绪囱。
第二步测蹲,將原始數(shù)據(jù)中完整的作者列和數(shù)據(jù)復(fù)制到新sheet的I到L列,并從B列開始分別創(chuàng)建匯總閱讀量鬼吵,匯總收藏量和匯總點贊量3個新的數(shù)據(jù)列扣甲。選中B2單元格,在輸入框中輸入累加公式:=SUMIF(I:I,A2,J:J),然后按回車得到求和結(jié)果琉挖。
SUMIF需要輸入3個參數(shù)启泣,分別是條件區(qū)域,求和條件示辈,實際求和區(qū)域寥茫。意思是在條件區(qū)域內(nèi)如果發(fā)現(xiàn)了符合求和條件的數(shù)據(jù),則對實際求和區(qū)域中的數(shù)值進行求和矾麻。
第三步纱耻,同樣運用SUMIF函數(shù)在C2和D2單元格計算匯總的收藏量和點贊量,然后框選B2到D2單元格险耀,鼠標放在D2單元格的右下角雙擊弄喘,將公式填充至所有的單元格
第四步,數(shù)據(jù)歸一化甩牺,這是K-Means聚類分析中很重要的一步蘑志,因為閱讀量的數(shù)值遠遠大于收藏量和點贊量,如果直接求均值贬派,會導(dǎo)致閱讀量的權(quán)重大于收藏量和點贊量急但,所以我們需要對數(shù)據(jù)做歸一化。
這里我們使用極差歸一化公式搞乏,將三列數(shù)據(jù)分別進行歸一化波桩,讓數(shù)值分布在0到1之間,極差歸一化公式如下。
先在E1到G1單元格分別填入歸一化閱讀量查描,歸一化收藏量和歸一化點贊量的表頭软吐,然后選中E2單元格匙姜,輸入=(B2-MIN(B:B))/(MAX(B:B)-MIN(B:B)),然后參照第三步的方法封拧,將所有歸一化的數(shù)據(jù)填充至表中够庙。
第五步搪柑,數(shù)據(jù)整理笙僚,到這里梧宫,我們最開始復(fù)制過來的I到L列的原始數(shù)據(jù)就沒用了候衍,為了看數(shù)據(jù)方便我們需要刪除他們桥滨。但前面匯總的數(shù)據(jù)和歸一化的數(shù)據(jù)都是基于原始數(shù)據(jù)計算得來的窝爪,如果直接刪除會導(dǎo)致公式?jīng)]有值,所以我們需要先將公式轉(zhuǎn)化為值齐媒,再將原始數(shù)據(jù)刪除蒲每。
框選A到G列,右鍵復(fù)制喻括,然后點擊A1單元格邀杏,選擇“開始”tab下的粘貼按鈕,點擊粘貼的下拉菜單唬血,選擇“粘貼值”的選項望蜡,這樣就把公式轉(zhuǎn)化為了數(shù)值后唤崭,就可以把原始數(shù)據(jù)刪除了。
到這里脖律,我們在Excel中完成了數(shù)據(jù)清洗的操作谢肾,接下來要用到SPSS進行K-Means聚類。
首先通過SPSS打開剛才的Excel文件小泉,選擇sheet2的數(shù)據(jù)芦疏,注意勾選“從第一行數(shù)據(jù)中讀取變量名”的選項。
第二步膏孟,依次點擊“分析”-“分類”-“K-均值聚類”
第三步眯分,在彈出的彈窗中,分別將歸一化之后的三列數(shù)據(jù)通過穿梭框按鈕放在變量窗格里柒桑,將作者名放入個案標注依據(jù)的窗格里弊决,然后將聚類數(shù)設(shè)為4。
第四步魁淳,點擊彈窗中的迭代按鈕飘诗,設(shè)置迭代次數(shù),數(shù)據(jù)量越大界逛,迭代次數(shù)最好設(shè)置得越多昆稿,這樣方便算法收斂。如果沒有達到最大迭代次數(shù)算法就收斂了息拜,SPSS也能自動停止迭代溉潭,可以說是非常便利了。
第五步少欺,點擊彈窗中的保存按鈕喳瓣,勾選“聚類成員”的選項,這樣算法在迭代完畢之后赞别,就會生成一個新的列畏陕,用來標明聚類的結(jié)果,如果希望看到數(shù)據(jù)與聚類中心的距離也可以勾選第二個選項仿滔。
最后惠毁,點擊確定,讓系統(tǒng)自動完成聚類迭代并輸出結(jié)果崎页,我們可以在查看器以及新生成的變量列中查看最后的分類結(jié)果鞠绰。
之前選擇K值為4的原因是根據(jù)SSE公式,在K為4的時候形成了拐點飒焦,我們也可以嘗試不同的K值蜈膨,看看分類的結(jié)果是否不同,在實際使用中不一定要局限于數(shù)學(xué)算法,也可以根據(jù)業(yè)務(wù)需要設(shè)定不同的分組數(shù)量丈挟。
至此刁卜,我們的K-Means聚類分析就結(jié)束了,我們可以根據(jù)分類的結(jié)果來對不同的用戶進行用戶研究曙咽,形成用戶畫像蛔趴,以及指導(dǎo)我們產(chǎn)品后續(xù)的功能規(guī)劃設(shè)計和運營方案設(shè)計。
K-Means算法注意點
在使用K-Means算法時例朱,有以下幾個注意點需要特別注意:
K-Means只能用于連續(xù)數(shù)據(jù)孝情,而不能用于分類數(shù)據(jù)
因為K-Means算法的核心是計算空間坐標中,點與點之間的平均值洒嗤,而我們知道只有連續(xù)數(shù)據(jù)可以被計算箫荡,分類數(shù)據(jù)即使使用1234來表示,也只是作一個代稱渔隶,而不可以進行數(shù)學(xué)計算羔挡。在計算之前,需先對數(shù)據(jù)進行歸一化處理
對數(shù)據(jù)進行歸一化處理是為了防止數(shù)據(jù)之間單位不一致间唉,導(dǎo)致某些位數(shù)較大的參數(shù)擁有較高的權(quán)重绞灼,將所有的數(shù)據(jù)歸一化則可以將所有的參數(shù)權(quán)重調(diào)節(jié)成一致。當然呈野,如果因為業(yè)務(wù)特點而需要將某些參數(shù)的權(quán)重調(diào)高或者調(diào)低低矮,也可以根據(jù)實際情況來,畢竟算法只是工具被冒,真正起作用的還是使用算法的人军掂。K-Means算法對數(shù)據(jù)噪聲和離群值較為敏感
計算均值時需要所有的數(shù)據(jù)都參與,即使出現(xiàn)少量的離群數(shù)據(jù)昨悼,也會對均值產(chǎn)生極大的影響蝗锥,所以在實際工作中使用算法時,通常需要先對離群值進行數(shù)據(jù)清洗幔戏,排除離群值對最終結(jié)果的影響玛追,然后再進行聚類計算税课。
總結(jié)
K-Means屬于十大經(jīng)典機器學(xué)習(xí)算法之一闲延,原理簡單且應(yīng)用場景非常廣泛,例如用于人流量分群輔助實體店選址韩玩,自然語言處理領(lǐng)域中對話意圖識別垒玲,計算機視覺中對圖片進行分類等等。
如果大家還想到什么應(yīng)用場景找颓,可以在下方給我留言互動合愈。
參考資料
WiKipedia《k-means clustering》
簡書《聚類、K-Means、例子佛析、細節(jié)》
CSDN《K-means聚類最優(yōu)k值的選取》