Numpy sklearn';s PCA.fit_变换结果不';t匹配产品PCA.components和输入数据

Numpy sklearn';s PCA.fit_变换结果不';t匹配产品PCA.components和输入数据,numpy,scikit-learn,linear-algebra,pca,Numpy,Scikit Learn,Linear Algebra,Pca,我正试图使用sklearn的PCA功能将我的数据减少到二维。但是,我注意到,当我使用fit_transform()函数执行此操作时,结果与将components_属性与输入数据相乘的结果不匹配 为什么这些不相配?哪个结果是正确的 def test_pca_fit_transform(self): from sklearn.decomposition import PCA input_data = np.matrix([[11,4,9,3,2,2], [7,2,8,2,0,2],

我正试图使用sklearn的PCA功能将我的数据减少到二维。但是,我注意到,当我使用fit_transform()函数执行此操作时,结果与将components_属性与输入数据相乘的结果不匹配

为什么这些不相配?哪个结果是正确的

def test_pca_fit_transform(self):
    from sklearn.decomposition import PCA
    input_data = np.matrix([[11,4,9,3,2,2], [7,2,8,2,0,2], [3,1,2,5,2,9]])
    #each column of input data is an observation, each row is a dimension

    #method1
    pca = PCA(n_components=2)
    data2d = pca.fit_transform(input_data.T)

    #method2
    component_matrix = np.matrix(pca.components_)
    data2d_mult = (component_matrix * input_data).T

    np.testing.assert_almost_equal(data2d, data2d_mult)
    #FAILS!!!

您缺少的唯一步骤(sklearn内部处理)是数据中心。为了执行PCA,您的数据需要居中,如果不是,sklearn的PCA拟合方法的第一行是:

X -= X.mean(axis=0) 
使数据沿第一个轴居中

为了获得与sklearn相同的结果(这是正确的结果),您只需在拟合之前或在
方法2
之前将数据居中即可

在这里可以找到一个工作示例:

X = np.array([[11,4,9,3,2,2], [7,2,8,2,0,2], [3,1,2,5,2,9]])
X = X.T.copy()

# PCA
pca = PCA(n_components=2)
data = pca.fit_transform(X)

# Your method 2
data2 = X.dot(pca.components_.T)

# Centering the data before method 2
data3 = X - X.mean(axis=0)
data3 = data3.dot(pca.components_.T)

# Compare
print np.allclose(data, data2) # prints False
print np.allclose(data, data3) # prints True
请注意,我在标准numpy数组中使用
.dot
,而不是在numpy矩阵中使用
*
,因为我希望尽可能避免使用
矩阵
,但结果是相同的