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

使用Scikit-learn实现PCA时如何为数据点添加标注的技术咨询

解决PCA后数据点的标注问题

嘿,其实你不用纠结让Scikit-learn来做标注啦——它的本职是处理数据变换,绘图标注还是交给Matplotlib就好,而且完全不会丢失数据关联!核心原因很简单:Scikit-learn的PCA变换会严格保留样本的顺序,原始数据里的第i行,对应PCA结果里的第i行,所以只要把原始的标注信息和PCA后的数据按顺序对应,就能轻松给每个点加上标注。

下面给你具体的实现步骤和代码示例:

步骤1:完成PCA变换(保留样本顺序)

首先正常用Scikit-learn做PCA降维,不管你是先写PCA代码还是绘图代码,只要保证原始数据和PCA结果的行索引一一对应就行:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 假设你的原始数据是X,每行一个样本;labels是每个样本的标注(比如ID、类别名称)
# 示例数据(你可以替换成自己的数据)
X = np.random.rand(15, 5)  # 15个样本,每个样本5个特征
labels = [f"Sample_{i+1}" for i in range(15)]  # 每个样本的标注

# 执行PCA降维到2维(方便绘图)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

步骤2:绘图并添加标注

用Matplotlib的annotate函数循环每个样本,因为X_pca的第i行就是原始数据第i行的降维结果,所以直接用labels[i]对应标注即可:

plt.figure(figsize=(8, 6))
# 先绘制PCA后的散点图
plt.scatter(X_pca[:, 0], X_pca[:, 1], c="#1f77b4", alpha=0.7, s=60)

# 循环添加每个样本的标注
for idx, label in enumerate(labels):
    # annotate参数说明:
    # label:要显示的标注文本
    # xy:标注点的坐标(PCA后的坐标)
    # xytext:文本相对于点的偏移量(避免和点重叠)
    # textcoords:偏移量的单位(这里是像素点)
    plt.annotate(
        label,
        xy=(X_pca[idx, 0], X_pca[idx, 1]),
        xytext=(6, 6),
        textcoords="offset points",
        fontsize=9,
        color="#333333"
    )

# 添加图表标签和标题
plt.xlabel("Principal Component 1", fontsize=10)
plt.ylabel("Principal Component 2", fontsize=10)
plt.title("PCA Result with Sample Annotations", fontsize=12)
plt.grid(alpha=0.3)
plt.show()

关键说明

  • 样本顺序的一致性:Scikit-learn的所有变换(包括PCA)都会严格保留输入样本的顺序,所以原始数据的第i个样本,对应X_pca的第i行,这是不会出错的,完全不用担心丢失关联。
  • 标注优化:如果你的样本很多,标注容易重叠,可以调整xytext的偏移量,或者使用adjustText库来自动调整标注位置(需要先安装:pip install adjustText),用法也很简单:
    from adjustText import adjustText
    
    # 先收集所有标注对象
    texts = []
    for idx, label in enumerate(labels):
        text = plt.annotate(label, xy=(X_pca[idx,0], X_pca[idx,1]), xytext=(6,6), textcoords="offset points")
        texts.append(text)
    # 自动调整标注位置避免重叠
    adjust_text(texts, arrowprops=dict(arrowstyle="->", color='gray', lw=0.5))
    

内容的提问来源于stack exchange,提问作者theupandup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:22:41