K-means缩放后如何用原始变量绘制带质心的散点图
解决方法
你当前得到的质心是标准化后的坐标,和原始数据的Wn、LL量纲不匹配,只需要将质心通过StandardScaler的inverse_transform方法转换回原始尺度即可。
完整修改代码
import numpy as np import seaborn as sns import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans # 你原有的标准化代码 scaler = StandardScaler() X1_scaled = pd.DataFrame(scaler.fit_transform(X1),columns = X1.columns) # 你原有的K-means聚类代码 kmeans = KMeans( init="random", n_clusters=3, n_init=10, max_iter=300, random_state=123) X1['label'] = kmeans.fit_predict(X1_scaled[['Wn', 'LL']]) # 获取标准化后的质心 centroids = kmeans.cluster_centers_ # ==========新增:将标准化质心转换为原始尺度========== # 构造和X1列数匹配的数组,填充质心对应的Wn、LL列数值 centroids_scaled_full = np.zeros((len(centroids), X1.shape[1])) wn_idx = X1.columns.get_loc('Wn') ll_idx = X1.columns.get_loc('LL') centroids_scaled_full[:, wn_idx] = [i[0] for i in centroids] centroids_scaled_full[:, ll_idx] = [i[1] for i in centroids] # 反变换得到原始尺度的质心 centroids_original = scaler.inverse_transform(centroids_scaled_full) cen_x_original = centroids_original[:, wn_idx] cen_y_original = centroids_original[:, ll_idx] # ==========绘图使用原始尺度质心========== g = sns.scatterplot(x=X1.Wn, y= X1.LL, hue=X1.label, data=X1, palette='colorblind', legend='full') g = sns.scatterplot(x=cen_x_original, y=cen_y_original, s=80, color='black')
简化方案(推荐)
如果你后续只需要对Wn和LL两列做聚类,建议标准化时仅针对这两列拟合StandardScaler,反变换会更简单:
# 仅对需要用到的两列做标准化 scaler = StandardScaler() X1_scaled_2cols = scaler.fit_transform(X1[['Wn', 'LL']]) # 聚类直接用两列的标准化结果 X1['label'] = kmeans.fit_predict(X1_scaled_2cols) # 反变换质心无需补全其他列 centroids_original = scaler.inverse_transform(kmeans.cluster_centers_) cen_x_original = centroids_original[:,0] cen_y_original = centroids_original[:,1]
内容的提问来源于stack exchange,提问作者JCV
相关产品推荐
相关产品推荐

