k-means算法在人群聚類場景中,是一個非常實用的工具。(該算法的原理可以參考K-Means算法的Python實現)
常見調用方式
該算法常規的調用方式如下:
# 從sklearn引包
from sklearn import cluster
# 初始化並設定聚類數
k_means = cluster.KMeans(n_clusters=9)
# 指定聚類特征
df_pct = stat_score['feature_1', 'feture_2', 'feature_3']
k_means.fit(df_input.fillna(0))
# 計算聚類標簽
labels = k_means.labels_
# 獲得聚類的質心
C = k_means.cluster_centers_
異常現象
常規情況下,以上處理后,會根據dataframe上的索引列順序的label
(0~8的數值)。
但是,我們在執行代碼過程中,出現了raise ValueError('Length of values does not match length of ' 'index')
錯誤,該錯誤是由於對label值進行翻譯的時候出現了label
個數不到8個的情況。也就是說,k-means算法最后給出少於8個的聚類標簽。
打印中間信息,確認只得到了3個聚類標簽。
>>>>>>>>>>>>>>>>>>>>labels<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
[4 4 4 4 4 2 4 4 4 0 4 4 4 0]
14
{0, 2, 4}
異常原因
在對原數據進行下鑽維度上的聚類時,比如全公司下某個門店的訂單,存在一定時間內訂單過少的情況。上面異常就是因為在一個下鑽維度上只有28條特征記錄,造成k-means只得到3個標簽,最后出現了dataframe行數不匹配的情況。
處理方式
在對下鑽維度進行聚類前,對此維度的特征數量進行統計,若數量小於特定閾值則考慮:
- 使用特征分組聚類然后再對分組標簽進行組合;
- 考慮其它聚類算法,如Spectral clustering。