實操AI算法:K-Means用戶分群應用案例

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

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

從產品策劃的角度看,不同的用戶對產品可能有著不同的需求,所以需要針對不同的用戶設計不同的產品功能。從產品運營的角度看,不同的用戶對于產品的貢獻度不同,需要區別對待。于是我們需要對用戶進行分群,而在過去,我們通常采用某種規則來對用戶進行分群,例如經典的RFM模型。

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

一、算法背景

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

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

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

零編程實操AI算法:K-Means用戶分群應用案例

二、算法詳解

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

假定我們有以下4個數據需要進行分組:

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

第二步,對于樣本中的數據對象,根據點與點的距離公式計算他們與聚類中心的歐氏距離,按距離最近的準則將他們分到距離他們最近的聚類中心所對應的類。

零編程實操AI算法:K-Means用戶分群應用案例

計算后的結果如下,數據1和數據2距離A點更近,數據3和數據4距離B點更近,所以將數據1和2劃為A類,數據3和4劃為B類。

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

根據新的聚類中心,重復進行第二步的計算,計算后的結果如下:

零編程實操AI算法:K-Means用戶分群應用案例

我們發現數據與新的聚類中心點的距離變近了,但是分組的情況并沒有改變,依然是數據1和2為A組,數據3和4為B組,說明算法已經收斂,可以結束循環。如果在這一步的聚類結果與之前的結果還有差異,那么就還需要返回第二步繼續進行循環計算,直到結果不再改變為止。

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

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

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

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

三、實操案例

通過爬蟲獲取2018年2月1日到2019年2月1日,在人人都是產品經理社區上發表文章的作者及對應文章的閱讀量,收藏量和點贊量。

零編程實操AI算法:K-Means用戶分群應用案例

業務目標是使用K-Means算法對作者進行分群,使用的工具是Excel+SPSS,我們先在Excel中進行數據清洗,然后在SPSS中進行聚類。

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

我們新增一個sheet2,將作者列復制到sheet2中,然后選中復制后的作者列,點擊“數據”tab下的“刪除重復項”按鈕,每位作者只保留唯一數據。

零編程實操AI算法:K-Means用戶分群應用案例

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

SUMIF需要輸入3個參數,分別是條件區域,求和條件,實際求和區域。意思是在條件區域內如果發現了符合求和條件的數據,則對實際求和區域中的數值進行求和。

零編程實操AI算法:K-Means用戶分群應用案例

第三步,同樣運用SUMIF函數在C2和D2單元格計算匯總的收藏量和點贊量,然后框選B2到D2單元格,鼠標放在D2單元格的右下角雙擊,將公式填充至所有的單元格

零編程實操AI算法:K-Means用戶分群應用案例

第四步,數據歸一化,這是K-Means聚類分析中很重要的一步,因為閱讀量的數值遠遠大于收藏量和點贊量,如果直接求均值,會導致閱讀量的權重大于收藏量和點贊量,所以我們需要對數據做歸一化。

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

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

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

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

零編程實操AI算法:K-Means用戶分群應用案例

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

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

零編程實操AI算法:K-Means用戶分群應用案例

第二步,依次點擊“分析”-“分類”-“K-均值聚類”。

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

第五步,點擊彈窗中的保存按鈕,勾選“聚類成員”的選項,這樣算法在迭代完畢之后,就會生成一個新的列,用來標明聚類的結果,如果希望看到數據與聚類中心的距離也可以勾選第二個選項。

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

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

零編程實操AI算法:K-Means用戶分群應用案例

至此,我們的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值的選取》

 

本文由 @黃瀚星 原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議

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

    來自上海 回復
  2. 有操作,大贊

    來自廣東 回復
  3. 感覺這個很實用!

    來自江蘇 回復
    1. 謝謝支持

      來自廣東 回復