K-means分析中质心未位于簇中心的原因咨询
为什么K-Means质心不在簇中心?常见排查方向
嘿,这个问题我之前踩过好几个坑!K-Means的质心理论上应该是对应簇的样本均值,但视觉上错位通常是这些原因导致的,你可以挨个排查:
- 数据没做标准化/归一化
K-Means是基于距离计算的算法,如果你的特征之间量纲差得特别大(比如一个特征是0-1的比例,另一个是0-1000的销售额),欧氏距离会被数值大的特征完全主导,训练出的质心会偏向这个特征的方向,视觉上就不在簇的“中心”了。
解决办法:先对数据做标准化处理,比如用sklearn的工具:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_data = scaler.fit_transform(your_data) # 用标准化后的数据训练K-Means kmeans = KMeans(n_clusters=3, n_init=10) kmeans.fit(scaled_data)
- 绘图时混用了原始数据和标准化数据
如果你训练时用了标准化数据,但绘图时用的是未处理的原始数据,而质心是标准化后的坐标,两者不在同一尺度,自然看起来错位。
解决办法:要么把质心反转换回原始尺度:
centroids = scaler.inverse_transform(kmeans.cluster_centers_)
要么直接用标准化后的数据来绘制簇和质心。
- K-Means收敛到了局部最优
K-Means的结果依赖初始质心的选择,哪怕用了k-means++初始化,也可能碰到特殊数据分布导致收敛到局部最优,这时候质心就不是全局最优的簇中心了。
解决办法:增加n_init参数的数值(比如设为10或20),让算法多次初始化后选惯性最小的结果:
kmeans = KMeans(n_clusters=3, n_init=20, random_state=42)
固定random_state还能保证结果可复现。
可视化时降维导致信息丢失
如果你的数据是高维的,用PCA/t-SNE降维到2D/3D绘图时,可能会因为降维过程丢失了部分信息,导致视觉上质心不在簇中心,但在高维空间里其实是对的。
解决办法:检查降维后的方差保留率(比如PCA的explained_variance_ratio_),如果保留的方差太低,可以尝试调整降维参数;或者直接对比每个簇的样本均值和质心坐标,确认数值上是否一致——如果数值一致,那就是可视化的问题。代码里的绘图逻辑出错
比如你提取质心时用错了变量,绘图时把x轴和y轴搞反了,或者簇的颜色和质心的对应关系不匹配。
解决办法:先打印每个簇的样本均值和K-Means输出的质心,看看数值上是否一致:
import pandas as pd df = pd.DataFrame(your_data) df['cluster'] = kmeans.labels_ # 对比每个簇的均值和质心 for cluster in range(kmeans.n_clusters): print(f"簇{cluster}样本均值:", df[df['cluster']==cluster].mean()) print(f"簇{cluster}质心:", kmeans.cluster_centers_[cluster])
如果数值一致,那就是绘图代码的问题,检查坐标轴、数据匹配是否正确。
内容的提问来源于stack exchange,提问作者titusAdam




