KMeans聚类质心远离数据点的原因排查(Python实现)
KMeans聚类质心偏离数据点的问题解决
问题原因
你对数据做了标准化处理后训练KMeans模型,但绘制质心时用的是标准化后的坐标,而散点图展示的是原始的Polarity(极性)和Subjetivity(主观性)值,两者尺度完全不匹配,导致红色叉号标记的质心远离数据点。
解决方法
需要将KMeans输出的标准化质心,通过StandardScaler的逆变换转换回原始数据的尺度,再与原始数据一同绘图。
修正后的完整代码
from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 提取特征数据 data = df[['Polarity', 'Subjetivity']].values # 标准化处理 scaler = StandardScaler() scaled_data = scaler.fit_transform(data) # 训练KMeans模型 k = 3 kmeans = KMeans(n_clusters=k).fit(scaled_data) # 给原始数据添加聚类标签 df['Cluster'] = kmeans.labels_ # 获取标准化后的质心,并逆变换回原始尺度 centroides_scaled = kmeans.cluster_centers_ centroides_original = scaler.inverse_transform(centroides_scaled) # 转换为DataFrame用于绘图 df_kmeans_center = pd.DataFrame( { 'x1': centroides_original[:, 0], 'x2': centroides_original[:, 1] } ) # 绘制散点图和质心 sns.scatterplot(x='Polarity', y='Subjetivity', hue='Cluster', data=df, palette="flare") sns.scatterplot(data=df_kmeans_center, x='x1', y='x2', marker='X', size=500, color='red') plt.title('推文聚类结果') plt.xlabel('极性(Polarity)') plt.ylabel('主观性(Subjetivity)') plt.show()
关键说明
scaler.inverse_transform(centroides_scaled):将标准化后的质心坐标转换回原始数据的取值范围,确保质心与原始散点处于同一尺度空间。- 修正后,红色叉号标记的质心会准确落在对应聚类的中心位置,与数据点对齐。
内容的提问来源于stack exchange,提问作者Nana
相关产品推荐
相关产品推荐

