K-means多次运行的聚类中心数组如何正确计算均值与中位数中心
问题根因
代码返回单个标量结果由两个numpy用法错误导致:
- 调用
np.mean(center_array)时未指定axis参数,numpy默认将输入所有元素展平为一维数组计算全局平均值,仅返回单个数值 - 对标量形式的全局均值结果调用
np.vectorize(np.mean)属于无效操作,无法输出按维度、按聚类划分的中心结果
计算前需先解决两个前置问题,否则即使修正numpy参数也会得到错误结果:
- 数组结构不规则:从给出的样例看,第一次K-means运行输出3个12维聚类中心,第二次仅输出1个,需先确认K值设置固定,排查是否存在运行时聚类收敛异常、聚类数不一致的问题
- 聚类标签未对齐:K-means每次运行输出的聚类序号为随机排列,单次运行输出的0号聚类中心,在其他次运行中可能对应2号聚类,直接跨运行计算均值/中位数会完全失真,需先用匈牙利算法等匹配方法,将每次运行的聚类中心与基准中心做最小距离匹配,保证同序号中心对应同一真实聚类
正确计算流程
- 规整数组结构:将100次对齐后的聚类中心整理为形状为
(n_runs, n_clusters, n_features)的三维numpy数组,若固定K=3、特征数12、共运行100次,数组标准形状为(100, 3, 12) - 计算平均中心:沿运行次数维度(第0轴)计算均值,代码如下:
# centers_all为对齐规整后的三维聚类中心数组 mean_centers = np.mean(centers_all, axis=0)
输出结果mean_centers形状为(3,12),对应3个聚类各特征维度的平均中心。
3. 计算中位数中心:沿第0轴计算中位数即可,代码如下:
median_centers = np.median(centers_all, axis=0)
输出结果median_centers形状为(3,12),每个位置的数值为对应聚类对应特征在100次运行结果中的中位数,即目标中位数中心。
内容的提问来源于stack exchange,提问作者Fábio Pires
相关产品推荐
相关产品推荐

