我长话短说。基本上我想知道的是:我应该这样做吗,
pca.fit(normalize(x))
new=pca.transform(normalize(x))
或
pca.fit(normalize(x))
new=pca.transform(x)
我知道我们应该在使用PCA之前对我们的数据进行规范化,但是上面哪一个程序对sklearn是正确的?
一般情况下,您会希望使用第一个选项。
你的归一化将你的数据放在一个新的空间,这是由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
的平均居中。