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

如何在Python中基于新数据计算主成分?附鸢尾花数据PCA示例

如何用训练好的PCA模型处理新数据

嘿,看起来你已经顺利完成了鸢尾花数据的PCA分析,现在想知道怎么把这套逻辑用到新数据上对吧?其实核心就是复用已经训练好的模型参数,而不是重新训练,我给你一步步捋清楚:

关键注意点先提

首先得纠正一个小细节:你之前用scale()函数做标准化,这个函数是一次性的,没法保存训练数据的均值和标准差——而新数据必须用训练数据的统计量来标准化,不然结果会偏差。所以更规范的做法是用StandardScaler类,它能帮你保存这些关键信息。

完整的训练+新数据处理流程

1. 重新整理你的训练代码(优化版)

先把之前的代码改成可复用的形式:

import pandas as pd
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 加载鸢尾花训练数据
iris = datasets.load_iris()
train_dat = pd.DataFrame(data=iris.data, columns=['sl', 'sw', 'pl', 'pw'])

# 初始化并拟合标准化器——保存训练数据的均值/标准差
scaler = StandardScaler()
std_train_dat = scaler.fit_transform(train_dat)

# 拟合PCA模型——保存主成分的特征向量等参数
pca = PCA(n_components=2)
train_pc = pca.fit_transform(std_train_dat)
train_pcdf = pd.DataFrame(data=train_pc, columns=['PC-1', 'PC-2'])
print("训练数据主成分:")
print(train_pcdf.head())

2. 处理新数据的步骤

现在假设你拿到了新的样本,只要按照下面两步来:

# 模拟新数据——特征列必须和训练数据完全一致(数量、顺序都要对)
new_dat = pd.DataFrame([
    [5.0, 3.2, 1.2, 0.2],
    [6.5, 3.0, 5.2, 2.0]
], columns=['sl', 'sw', 'pl', 'pw'])

# 步骤1:用训练好的scaler标准化新数据——千万不要用fit_transform!
std_new_dat = scaler.transform(new_dat)

# 步骤2:用训练好的pca转换新数据得到主成分——同样不要用fit_transform!
new_pc = pca.transform(std_new_dat)
new_pcdf = pd.DataFrame(data=new_pc, columns=['PC-1', 'PC-2'])
print("\n新数据主成分:")
print(new_pcdf)

为什么不能用fit_transform处理新数据?

  • fit()方法会重新计算数据的统计量(标准化时的均值/标准差,PCA时的协方差矩阵、主成分向量),这样新数据的转换就基于它自己的分布,和训练数据的主成分空间完全脱节了,这不是我们想要的。
  • 我们要的是把新数据投影到训练数据已经确定好的主成分空间里,所以只用transform()方法就够了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:09