【问题标题】:sklearn's PCA.fit_transform results don't match product PCA.components_ and input datasklearn 的 PCA.fit_transform 结果与产品 PCA.components_ 和输入数据不匹配
【发布时间】:2016-01-03 21:34:04
【问题描述】:

我正在尝试使用 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!!!

【问题讨论】:

    标签: numpy scikit-learn linear-algebra pca


    【解决方案1】:

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

    X -= X.mean(axis=0) 
    

    使您的数据沿第一个轴居中。

    为了获得与 sklearn 相同的结果(这是正确的结果),您只需在 fit 之前或 method2 之前将数据居中。

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

    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 矩阵中使用 *,因为我希望尽可能避免使用 matrix,但结果是相同的。

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 2021-12-26
      • 2021-09-21
      • 2021-06-20
      • 2017-08-15
      • 2021-01-13
      • 2021-05-23
      • 2022-11-07
      相关资源
      最近更新 更多