k-means算法处理聚类标签不足的异常

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行数不匹配的情况。

处理方式

在对下钻维度进行聚类前,对此维度的特征数量进行统计,若数量小于特定阈值则考虑:

  1. 使用特征分组聚类然后再对分组标签进行组合;
  2. 考虑其它聚类算法,如Spectral clustering。

posted on 2019-08-27 22:06  camash  阅读(1673)  评论(0编辑  收藏  举报

导航