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

4 評論 22082 瀏覽 51 收藏 17 分鐘

本文介紹了如何用AI聚類算法中的K-Means來對用戶進(jìn)行分群,以及在過程中需要留心的幾個K-Means算法注意點(diǎn)。

從產(chǎn)品策劃的角度看,不同的用戶對產(chǎn)品可能有著不同的需求,所以需要針對不同的用戶設(shè)計(jì)不同的產(chǎn)品功能。從產(chǎn)品運(yùn)營的角度看,不同的用戶對于產(chǎn)品的貢獻(xiàn)度不同,需要區(qū)別對待。于是我們需要對用戶進(jìn)行分群,而在過去,我們通常采用某種規(guī)則來對用戶進(jìn)行分群,例如經(jīng)典的RFM模型。

基于規(guī)則的分群方法都需要由專家來定義規(guī)則,但是當(dāng)用戶行為發(fā)生變化的時候,規(guī)則往往很難及時適應(yīng)。為了解決這個問題,我們可以嘗試使用Ai聚類算法中的K-Means來對用戶進(jìn)行分群。

一、算法背景

K-Means又稱為K均值聚類,在1967年由美國加州大學(xué)的詹姆斯·麥昆教授首次提出(James·B·MacQueen),但類似的算法思想可以追述到1957年的勞埃德算法(Lloydalgorithm)。

勞埃德算法的思想是先把所有需要分組的數(shù)據(jù)先隨機(jī)分為k個初始化組(K可以是任意不大于樣本數(shù)的正整數(shù)),然后計(jì)算每組的中心點(diǎn),根據(jù)中心點(diǎn)的位置把數(shù)據(jù)分到離它最近的中心點(diǎn),并根據(jù)最近原則重新分組。以此循環(huán)不斷的計(jì)算中心并重新分組,直到結(jié)果收斂,即數(shù)據(jù)不再改變分組為止。

K-Means算法則是在勞埃德算法的基礎(chǔ)上進(jìn)行的改良,將第一步隨機(jī)分為K個初始化組改為選取K個點(diǎn),點(diǎn)的位置可以隨機(jī),也可以為了減少計(jì)算量而人工指定某些特定的點(diǎn),后續(xù)流程沒有變化,依然是循環(huán)計(jì)算每個數(shù)據(jù)到中心點(diǎn)的距離并重新分組直到結(jié)果收斂,以下是算法的流程圖:

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

二、算法詳解

K-Means算法理論上可以支持任意維度的數(shù)據(jù),但為了方便作圖演示,我們用一個簡單的二維數(shù)據(jù)作為例子來看一下。

假定我們有以下4個數(shù)據(jù)需要進(jìn)行分組:

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

首先我們需要選擇K個點(diǎn)作為初始中心,每一個點(diǎn)代表一個聚類中心,從圖上我們可以看出應(yīng)該分成2類,所以K的值定義為2,分別是點(diǎn)A和點(diǎn)B。然后隨機(jī)給這兩個中心點(diǎn)賦值,我們就暫定為A(0,0)和B(9,12)。

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

第二步,對于樣本中的數(shù)據(jù)對象,根據(jù)點(diǎn)與點(diǎn)的距離公式計(jì)算他們與聚類中心的歐氏距離,按距離最近的準(zhǔn)則將他們分到距離他們最近的聚類中心所對應(yīng)的類。

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

計(jì)算后的結(jié)果如下,數(shù)據(jù)1和數(shù)據(jù)2距離A點(diǎn)更近,數(shù)據(jù)3和數(shù)據(jù)4距離B點(diǎn)更近,所以將數(shù)據(jù)1和2劃為A類,數(shù)據(jù)3和4劃為B類。

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

第三步,更新聚類中心位置,將每個類別中所有數(shù)據(jù)的均值作為該類別的聚類中心,那么A組的聚類中心為A=((2+1)/2,(2+4)/2)=(1.5,3),B組的聚類中心為B=((7+8)/2,(6+10)/2)=(7.5,8),如下圖所示。

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

根據(jù)新的聚類中心,重復(fù)進(jìn)行第二步的計(jì)算,計(jì)算后的結(jié)果如下:

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

我們發(fā)現(xiàn)數(shù)據(jù)與新的聚類中心點(diǎn)的距離變近了,但是分組的情況并沒有改變,依然是數(shù)據(jù)1和2為A組,數(shù)據(jù)3和4為B組,說明算法已經(jīng)收斂,可以結(jié)束循環(huán)。如果在這一步的聚類結(jié)果與之前的結(jié)果還有差異,那么就還需要返回第二步繼續(xù)進(jìn)行循環(huán)計(jì)算,直到結(jié)果不再改變?yōu)橹埂?/p>

在上面這個例子中,通過肉眼觀察,我們可以通過人工判斷K值為2比較合適,但是如果數(shù)據(jù)量非常龐大,人工就很難判斷了,這也是K-Means算法的一個缺點(diǎn)——需要由人工指定K的值。

那么是否有方法可以幫助我們判斷K應(yīng)該為多少比較合適呢,當(dāng)然有。我們可以通過手肘法來確定K的個數(shù),手肘法的核心指標(biāo)是SSE(Sum of the Squared Error,誤差平方和),計(jì)算公式如下:

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

SSE是計(jì)算每個數(shù)據(jù)與聚類中心的距離平方和,當(dāng)和越小說明聚類中心越接近分組真正的中心點(diǎn)。K當(dāng)分組數(shù)量越多時,SSE的值越小,所以當(dāng)分組數(shù)量接近最佳分組數(shù)之后,再增加K的數(shù)量會讓SSE下降幅度變小,隨著K的不斷增大而逐漸平緩,形成一個拐點(diǎn),拐點(diǎn)對應(yīng)的K值就是數(shù)據(jù)真實(shí)的分組數(shù),因?yàn)楹瘮?shù)的形狀非常像一個手肘,所以才稱為手肘法,如下圖所示,當(dāng)K取值為4之后的趨勢明顯變小。

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

接下來我們用一個實(shí)際的案例,來看一下在工作中如何應(yīng)用K-Means算法。

三、實(shí)操案例

通過爬蟲獲取2018年2月1日到2019年2月1日,在人人都是產(chǎn)品經(jīng)理社區(qū)上發(fā)表文章的作者及對應(yīng)文章的閱讀量,收藏量和點(diǎn)贊量。

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

業(yè)務(wù)目標(biāo)是使用K-Means算法對作者進(jìn)行分群,使用的工具是Excel+SPSS,我們先在Excel中進(jìn)行數(shù)據(jù)清洗,然后在SPSS中進(jìn)行聚類。

第一步,我們需要將作者去重,然后將每個作者1年內(nèi)發(fā)表的所有文章所獲得的閱讀量、收藏量、點(diǎn)贊量累加起來

我們新增一個sheet2,將作者列復(fù)制到sheet2中,然后選中復(fù)制后的作者列,點(diǎn)擊“數(shù)據(jù)”tab下的“刪除重復(fù)項(xiàng)”按鈕,每位作者只保留唯一數(shù)據(jù)。

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

第二步,將原始數(shù)據(jù)中完整的作者列和數(shù)據(jù)復(fù)制到新sheet的I到L列,并從B列開始分別創(chuàng)建匯總閱讀量,匯總收藏量和匯總點(diǎn)贊量3個新的數(shù)據(jù)列。選中B2單元格,在輸入框中輸入累加公式:=SUMIF(I:I,A2,J:J),然后按回車得到求和結(jié)果。

SUMIF需要輸入3個參數(shù),分別是條件區(qū)域,求和條件,實(shí)際求和區(qū)域。意思是在條件區(qū)域內(nèi)如果發(fā)現(xiàn)了符合求和條件的數(shù)據(jù),則對實(shí)際求和區(qū)域中的數(shù)值進(jìn)行求和。

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

第三步,同樣運(yùn)用SUMIF函數(shù)在C2和D2單元格計(jì)算匯總的收藏量和點(diǎn)贊量,然后框選B2到D2單元格,鼠標(biāo)放在D2單元格的右下角雙擊,將公式填充至所有的單元格

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

第四步,數(shù)據(jù)歸一化,這是K-Means聚類分析中很重要的一步,因?yàn)殚喿x量的數(shù)值遠(yuǎn)遠(yuǎn)大于收藏量和點(diǎn)贊量,如果直接求均值,會導(dǎo)致閱讀量的權(quán)重大于收藏量和點(diǎn)贊量,所以我們需要對數(shù)據(jù)做歸一化。

這里我們使用極差歸一化公式,將三列數(shù)據(jù)分別進(jìn)行歸一化,讓數(shù)值分布在0到1之間,極差歸一化公式如下:

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

先在E1到G1單元格分別填入歸一化閱讀量,歸一化收藏量和歸一化點(diǎn)贊量的表頭,然后選中E2單元格,輸入=(B2-MIN(B:B))/(MAX(B:B)-MIN(B:B)),然后參照第三步的方法,將所有歸一化的數(shù)據(jù)填充至表中。

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

第五步,數(shù)據(jù)整理,到這里,我們最開始復(fù)制過來的I到L列的原始數(shù)據(jù)就沒用了,為了看數(shù)據(jù)方便我們需要刪除他們。但前面匯總的數(shù)據(jù)和歸一化的數(shù)據(jù)都是基于原始數(shù)據(jù)計(jì)算得來的,如果直接刪除會導(dǎo)致公式?jīng)]有值,所以我們需要先將公式轉(zhuǎn)化為值,再將原始數(shù)據(jù)刪除。

框選A到G列,右鍵復(fù)制,然后點(diǎn)擊A1單元格,選擇“開始”tab下的粘貼按鈕,點(diǎn)擊粘貼的下拉菜單,選擇“粘貼值”的選項(xiàng),這樣就把公式轉(zhuǎn)化為了數(shù)值后,就可以把原始數(shù)據(jù)刪除了。

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

到這里,我們在Excel中完成了數(shù)據(jù)清洗的操作,接下來要用到SPSS進(jìn)行K-Means聚類。

首先通過SPSS打開剛才的Excel文件,選擇sheet2的數(shù)據(jù),注意勾選“從第一行數(shù)據(jù)中讀取變量名”的選項(xiàng)。

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

第二步,依次點(diǎn)擊“分析”-“分類”-“K-均值聚類”。

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

第三步,在彈出的彈窗中,分別將歸一化之后的三列數(shù)據(jù)通過穿梭框按鈕放在變量窗格里,將作者名放入個案標(biāo)注依據(jù)的窗格里,然后將聚類數(shù)設(shè)為4。

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

第四步,點(diǎn)擊彈窗中的迭代按鈕,設(shè)置迭代次數(shù),數(shù)據(jù)量越大,迭代次數(shù)最好設(shè)置得越多,這樣方便算法收斂。如果沒有達(dá)到最大迭代次數(shù)算法就收斂了,SPSS也能自動停止迭代,可以說是非常便利了。

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

第五步,點(diǎn)擊彈窗中的保存按鈕,勾選“聚類成員”的選項(xiàng),這樣算法在迭代完畢之后,就會生成一個新的列,用來標(biāo)明聚類的結(jié)果,如果希望看到數(shù)據(jù)與聚類中心的距離也可以勾選第二個選項(xiàng)。

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

最后,點(diǎn)擊確定,讓系統(tǒng)自動完成聚類迭代并輸出結(jié)果,我們可以在查看器以及新生成的變量列中查看最后的分類結(jié)果。

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

之前選擇K值為4的原因是根據(jù)SSE公式,在K為4的時候形成了拐點(diǎn),我們也可以嘗試不同的K值,看看分類的結(jié)果是否不同,在實(shí)際使用中不一定要局限于數(shù)學(xué)算法,也可以根據(jù)業(yè)務(wù)需要設(shè)定不同的分組數(shù)量。

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

至此,我們的K-Means聚類分析就結(jié)束了,我們可以根據(jù)分類的結(jié)果來對不同的用戶進(jìn)行用戶研究,形成用戶畫像,以及指導(dǎo)我們產(chǎn)品后續(xù)的功能規(guī)劃設(shè)計(jì)和運(yùn)營方案設(shè)計(jì)。

四、K-Means算法注意點(diǎn)

在使用K-Means算法時,有以下幾個注意點(diǎn)需要特別注意:

1. K-Means只能用于連續(xù)數(shù)據(jù),而不能用于分類數(shù)據(jù)

因?yàn)镵-Means算法的核心是計(jì)算空間坐標(biāo)中,點(diǎn)與點(diǎn)之間的平均值,而我們知道只有連續(xù)數(shù)據(jù)可以被計(jì)算,分類數(shù)據(jù)即使使用1234來表示,也只是作一個代稱,而不可以進(jìn)行數(shù)學(xué)計(jì)算。

2. 在計(jì)算之前,需先對數(shù)據(jù)進(jìn)行歸一化處理

對數(shù)據(jù)進(jìn)行歸一化處理是為了防止數(shù)據(jù)之間單位不一致,導(dǎo)致某些位數(shù)較大的參數(shù)擁有較高的權(quán)重,將所有的數(shù)據(jù)歸一化則可以將所有的參數(shù)權(quán)重調(diào)節(jié)成一致。當(dāng)然,如果因?yàn)闃I(yè)務(wù)特點(diǎn)而需要將某些參數(shù)的權(quán)重調(diào)高或者調(diào)低,也可以根據(jù)實(shí)際情況來,畢竟算法只是工具,真正起作用的還是使用算法的人。

3. K-Means算法對數(shù)據(jù)噪聲和離群值較為敏感

計(jì)算均值時需要所有的數(shù)據(jù)都參與,即使出現(xiàn)少量的離群數(shù)據(jù),也會對均值產(chǎn)生極大的影響,所以在實(shí)際工作中使用算法時,通常需要先對離群值進(jìn)行數(shù)據(jù)清洗,排除離群值對最終結(jié)果的影響,然后再進(jìn)行聚類計(jì)算。

總結(jié)

K-Means屬于十大經(jīng)典機(jī)器學(xué)習(xí)算法之一,原理簡單且應(yīng)用場景非常廣泛,例如用于人流量分群輔助實(shí)體店選址,自然語言處理領(lǐng)域中對話意圖識別,計(jì)算機(jī)視覺中對圖片進(jìn)行分類等等。

如果大家還想到什么應(yīng)用場景,可以在下方給我留言互動。

參考資料

WiKipedia《k-means clustering》

簡書《聚類、K-Means、例子、細(xì)節(jié)》

CSDN《K-means聚類最優(yōu)k值的選取》

 

本文由 @黃瀚星 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 你好,感謝分享。有個小問題,倒數(shù)第二張圖:無效的個案數(shù)目有6769個,是否意味著這些個案無效?又或者意味著K值太小了,沒有辦法將這些個案歸類?謝謝

    來自上海 回復(fù)
  2. 有操作,大贊

    來自廣東 回復(fù)
  3. 感覺這個很實(shí)用!

    來自江蘇 回復(fù)
    1. 謝謝支持

      來自廣東 回復(fù)