如何使用PCA和scikit-learn进行归一化

15 投票
1 回答
28550 浏览
提问于 2025-04-18 18:23

我来简单说一下。基本上我想知道的是:我应该这样做,

pca.fit(normalize(x))
new=pca.transform(normalize(x))

还是这样做

pca.fit(normalize(x))
new=pca.transform(x)

我知道在使用PCA之前,我们应该先对数据进行标准化,但上面这两种做法,哪一种在sklearn中是正确的呢?

1 个回答

27

一般来说,你会想选择第一个选项。

你的数据标准化是把数据放到一个新的空间里,而PCA(主成分分析)会在这个新空间里工作,它的转换基本上是期待数据在同一个空间里。

Scikit-learn提供了一些工具,可以方便地通过将不同的处理步骤串联在一起,来实现这一点。你可以试试:

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline

import numpy as np

data = np.random.randn(20, 40)

pipeline = Pipeline([('scaling', StandardScaler()), ('pca', PCA(n_components=5))])

pipeline.fit_transform(data)

这样,前面的缩放器会在数据送到PCA对象之前,始终对数据进行处理。

正如@larsmans提到的,你可能想用sklearn.preprocessing.Normalizer来代替StandardScaler,或者类似地,通过传递参数with_mean=False来去掉StandardScaler中的均值中心化处理。

撰写回答