You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:25