K-means聚类混合数据时质心绘图位置异常的解决方法咨询
搞定K-means聚类中心画错位置的问题
嘿,我明白你现在的困扰——把季节转成哑变量跑K-means后,聚类中心居然跑到簇外面去了,这确实挺闹心的。咱们来拆解下问题,然后一步步解决:
为啥质心位置会错?
核心原因很简单:你是在包含哑变量的高维特征空间里做的聚类,但绘图只展示了chemical_1和chemical_2这两个数值特征的二维空间。直接从cluster_centers_里取前两列当二维质心,等于忽略了哑变量维度对聚类结果的影响,自然位置会偏。另外,如果你的数值特征和哑变量(0/1)尺度差得很大,K-means计算质心时会被数值特征带偏,也会导致这个问题。
具体解决步骤
1. 先给数值特征做标准化(关键!)
哑变量都是0或1,而chemical_1、chemical_2可能是几十上百的数值,尺度不统一会让K-means的权重偏向数值特征,聚类结果和质心都会失真。咱们先把数值特征标准化:
from sklearn.preprocessing import StandardScaler import pandas as pd # 单独拎出数值特征做标准化 scaler = StandardScaler() df[['chemical_1', 'chemical_2']] = scaler.fit_transform(df[['chemical_1', 'chemical_2']]) # 生成季节的哑变量,记得加drop_first避免多重共线性 df_transformed = pd.get_dummies(df, columns=['season'], drop_first=True)
2. 把高维质心映射回原始二维空间
聚类完成后,cluster_centers_是高维数组,咱们要提取其中对应数值特征的部分,再反标准化回原始尺度,这样才能和原始数据点对应上:
from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 跑K-means聚类 kmeans = KMeans(n_clusters=3, random_state=42) df['cluster_label'] = kmeans.fit_predict(df_transformed) # 提取质心中的数值特征部分,反标准化回原始尺度 centers_numeric = scaler.inverse_transform(kmeans.cluster_centers_[:, :2]) # 画原始数据点(用原始尺度的chemical_1、chemical_2) plt.scatter(df['chemical_1'], df['chemical_2'], c=df['cluster_label'], cmap='viridis', alpha=0.6) # 画修正后的质心,用醒目的红色叉号 plt.scatter(centers_numeric[:, 0], centers_numeric[:, 1], marker='x', color='red', s=200, label='聚类中心') plt.legend() plt.show()
3. 可选:按季节拆分看簇分布(更直观)
如果想搞清楚不同季节的点在簇里的分布,可以按季节分组绘图,同时标注质心:
# 按季节循环绘图 seasons = df['season'].unique() for season in seasons: subset = df[df['season'] == season] plt.scatter(subset['chemical_1'], subset['chemical_2'], c=subset['cluster_label'], cmap='viridis', alpha=0.6, label=f'季节:{season}') # 还是画反标准化后的质心 plt.scatter(centers_numeric[:, 0], centers_numeric[:, 1], marker='x', color='red', s=200, label='聚类中心') plt.legend() plt.show()
额外小提醒
- 生成哑变量时用
drop_first=True能减少特征维度,避免不必要的共线性问题,对K-means友好。 - 确保
df_transformed里的特征顺序是:先放chemical_1、chemical_2,再放季节的哑变量,这样cluster_centers_[:, :2]才是对应数值特征的质心部分。 - 如果实在不想做标准化,直接用原始数值特征聚类的话,质心的前两列可以直接画,但要做好心理准备——聚类结果可能会受尺度影响,不如标准化后的稳定。
内容的提问来源于stack exchange,提问作者samba
相关产品推荐
相关产品推荐

