基于CSV文件的PCA分析:按预计算聚类着色并标记质心
实现PCA降维+聚类可视化(带质心标记)
完全可以实现这个需求,下面是基于Python的实操方案,用scikit-learn做PCA,matplotlib/seaborn完成绘图:
1. 依赖库安装(未安装时执行)
pip install pandas scikit-learn matplotlib seaborn
2. 完整代码示例
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 加载数据,分离特征与聚类标签 df = pd.read_csv("your_data.csv") # 排除cluster_id列,其余作为特征列(若有其他非特征列如ID,需一并排除) feature_cols = [col for col in df.columns if col != "cluster_id"] X = df[feature_cols] y = df["cluster_id"] # 特征标准化(PCA对尺度敏感,必须执行) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # PCA降维到2维(适配可视化需求) pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) # 转换为DataFrame方便后续绘图 pca_df = pd.DataFrame(X_pca, columns=["PC1", "PC2"]) pca_df["cluster_id"] = y # 计算聚类质心并转换到PC空间 # 先算原始特征空间的质心均值 cluster_centers = df.groupby("cluster_id")[feature_cols].mean() # 用同一标准化器和PCA模型转换质心,保证坐标匹配 centers_scaled = scaler.transform(cluster_centers) centers_pca = pca.transform(centers_scaled) centers_df = pd.DataFrame(centers_pca, columns=["PC1", "PC2"]) centers_df["cluster_id"] = cluster_centers.index # 可视化绘图 plt.figure(figsize=(10, 8)) # 绘制聚类数据点 sns.scatterplot(data=pca_df, x="PC1", y="PC2", hue="cluster_id", palette="tab10", alpha=0.6, s=60) # 绘制质心,用特殊标记区分 sns.scatterplot(data=centers_df, x="PC1", y="PC2", hue="cluster_id", palette="tab10", marker="X", s=200, edgecolor="black", legend=False) # 添加标注信息 plt.title("PCA Visualization with Cluster Centroids") plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%} variance)") plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%} variance)") plt.legend(title="Cluster ID") plt.grid(True, alpha=0.3) plt.show()
关键细节说明
- 特征标准化:PCA结果受特征尺度影响极大,数值范围大的特征会主导主成分,因此必须用
StandardScaler将所有特征缩放到均值0、方差1的范围。 - 质心转换:质心是原始特征空间的均值,必须使用同一标准化器和PCA模型转换到PC空间,否则坐标会不匹配。
- 降维维度调整:示例降到2维是为了可视化,若需保留更多方差,可修改
n_components(比如设为0.95保留95%方差,或设为3做3D可视化)。 - 绘图自定义:可根据需求调整调色板
palette、点大小s、质心标记marker等参数。
内容的提问来源于stack exchange,提问作者Giano
相关产品推荐
相关产品推荐

