網頁

2014年8月2日 星期六

unsupervised clustering --- 讓資料自己物以類聚:k-means

讓資料物以類聚可以用來區隔出不同類型的顧客,找出之前未曾注意到的顧客類型。比如說酒商可以透過分析顧客的購買紀錄找出有一群顧客特別喜歡某個產地的紅酒,另一群客戶喜歡打折的香檳...知道這些資訊就可設計出更合適的銷售活動。

這聽起來相當神奇的技術其實用的是你國中就學過的數學:計算平面上二點的距離。




這張圖很明顯地有三群資料,但是要如何讓電腦知道有三群資料(三個cluster)?如果能找出每一群資料的中心點用來代表該群體,那就太好了。

一群資料的中心點就像圖中紅色的點這樣。這些紅點(cluster centroid)有個特徵(有點像是圓心到圓上的任何一點的距離都是最短的):

sum( cluster裡的點到cluster center的距離 ) = 最小值

由這個特徵進一步推出:

sum( 每一個點到最接近的紅點的距離 ) = 最小值

可以藉由嘗試不同的cluster center座標找出最小值,當確定找出最小值時,也就找出了cluster center。最後計算一個點到各個cluster center的距離,找出距離最近的cluster center,就可以得知這個點是屬於哪一個cluster了。於是資料找到了它的歸宿,幸福快樂的生活下去。

那何需大費周章的用電腦找出cluster呢,這圖看起來不是一目了然嗎?假設圖中的X軸為購買餅乾的數量,Y軸為購買汽水的數量。這時尚可用眼睛分別不同的cluster;那再加入一個Z軸代表購買雜誌的數量,這時圖型變成立體的,要用眼睛判別就有點吃力了;如果再考慮顧客的帳戶餘額,要看出有幾個cluster就頗有難度了。但若用k-means,就可以這樣表示:

客戶(餅乾,汽水,雜誌,帳戶餘額)
A客戶可以用( 0, 0, 1, 200 )來表示
B客戶可以用( 2, 1, 1, 1200 )來表示
C客戶可以用( 10, 5, 0, 50000 )來表示
D
E ......

我想把這些資料分為2群(這就是k-means的k的。k是一個自訂值,決定你要把資料分成幾群,可以是2可以是4可以是5),於是我建立二個cluster center,並給他們初始值。

cluster center I ( 0, 0, 0, 0 )
cluster center II ( 0, 0, 0, 0 )

透過最佳化(如evolutionary algorithm)找到cluster center的座標最小值

cluster center I ( 1, 1, 1, 1500 )
cluster center II ( 20, 10, 0, 30000 )

從這些center可以知道有一群客戶帳戶餘額較少,購買少量的商品;另一群客戶帳戶餘額較多,一次購買較為大量的商品。

最後決定哪一個客戶屬於哪一個cluster:A距離I比較近,屬於I;B距離II比較近,屬於II...

到這裡大致完成了k-means,但還有一些問題:

分成二個cluster到底好不好,還是k=3會更準確,那就要看看silhouette (計算每給點跟自己群組裡的點比較近,或是跟別的群組裡的點比較近)。

這裡又有另一個問題:金錢所造成的距離遠大於汽水數量造成的距離,這是你所預期的嗎?如果不是的話可以試試讓數值標準化

還有一個問題:一家店裡的商品這麼多,購買一個商品的意義遠大於不購買一個商品的意義。所以最好只採計有購買的商品。這時可以採用cos distance


沒有留言:

張貼留言