如何使用PCA和scikit-learn进行归一化
我来简单说一下。基本上我想知道的是:我应该这样做,
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
中的均值中心化处理。