零編程實操AI算法:K-Means用戶分群應(yīng)用案例

從產(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)。

James·B·MacQueen

勞埃德算法的思想是先把所有需要分組的數(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算法時例朱,有以下幾個注意點需要特別注意:

  1. K-Means只能用于連續(xù)數(shù)據(jù)孝情,而不能用于分類數(shù)據(jù)
    因為K-Means算法的核心是計算空間坐標中,點與點之間的平均值洒嗤,而我們知道只有連續(xù)數(shù)據(jù)可以被計算箫荡,分類數(shù)據(jù)即使使用1234來表示,也只是作一個代稱渔隶,而不可以進行數(shù)學(xué)計算羔挡。

  2. 在計算之前,需先對數(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ù)實際情況來,畢竟算法只是工具被冒,真正起作用的還是使用算法的人军掂。

  3. 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值的選取》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末益老,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寸莫,更是在濱河造成了極大的恐慌捺萌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘茎,死亡現(xiàn)場離奇詭異桃纯,居然都是意外死亡,警方通過查閱死者的電腦和手機披坏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門态坦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棒拂,你說我怎么就攤上這事伞梯。” “怎么了帚屉?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵壮锻,是天一觀的道長。 經(jīng)常有香客問我涮阔,道長猜绣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任敬特,我火速辦了婚禮掰邢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伟阔。我一直安慰自己辣之,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布皱炉。 她就那樣靜靜地躺著怀估,像睡著了一般。 火紅的嫁衣襯著肌膚如雪合搅。 梳的紋絲不亂的頭發(fā)上多搀,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音灾部,去河邊找鬼康铭。 笑死,一個胖子當著我的面吹牛赌髓,可吹牛的內(nèi)容都是我干的从藤。 我是一名探鬼主播催跪,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夷野!你這毒婦竟也來了懊蒸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤悯搔,失蹤者是張志新(化名)和其女友劉穎榛鼎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖孤,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡者娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苏揣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黄鳍。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖平匈,靈堂內(nèi)的尸體忽然破棺而出框沟,到底是詐尸還是另有隱情,我是刑警寧澤增炭,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布忍燥,位于F島的核電站,受9級特大地震影響隙姿,放射性物質(zhì)發(fā)生泄漏梅垄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一输玷、第九天 我趴在偏房一處隱蔽的房頂上張望队丝。 院中可真熱鬧,春花似錦欲鹏、人聲如沸机久。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膘盖。三九已至,卻和暖如春尤误,著一層夾襖步出監(jiān)牢的瞬間侠畔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工袄膏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留践图,地道東北人掺冠。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓沉馆,卻偏偏與公主長得像码党,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斥黑,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容