You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动