【问题标题】:Scikit Learn transform method - manual calculation?Scikit Learn 变换方法 - 手动计算?
【发布时间】:2017-04-21 20:06:12
【问题描述】:

我对 Scikit-Learn 的 PCA transform 方法有疑问。代码位于 here - 向下滚动以找到 transform() 方法。

他们在这个simple example中展示了这个过程——这个过程是先拟合然后变换:

pca.fit(X) #step 1: fit()
X_transformed = fast_dot(X, self.components_.T) #step 2: transform()

我正在尝试手动执行此操作,如下所示:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.utils.extmath import fast_dot

iris = load_iris()
X = iris.data
y = iris.target

pca = PCA(n_components=3)

pca.fit(X)

Xm = X.mean(axis=1)
print pca.transform(X)[:5,:] #Method 1 - expected
X = X - Xm[None].T # or can use X = X - Xm[:, np.newaxis]
print fast_dot(X,pca.components_.T)[:5,:] #Method 2 - manual

预期:

[[-2.68420713 -0.32660731  0.02151184]
 [-2.71539062  0.16955685  0.20352143]
 [-2.88981954  0.13734561 -0.02470924]
 [-2.7464372   0.31112432 -0.03767198]
 [-2.72859298 -0.33392456 -0.0962297 ]]

手动

[[-0.98444292 -2.74509617  2.28864171]
 [-0.75404746 -2.44769323  2.35917528]
 [-0.89110797 -2.50829893  2.11501947]
 [-0.74772562 -2.33452022  2.10205674]
 [-1.02882877 -2.75241342  2.17090017]]

如您所见,这两个结果是不同的。 transform() 方法中是否缺少步骤?

【问题讨论】:

    标签: python scikit-learn transform pca


    【解决方案1】:

    我不是 PCA 方面的专家,但通过查看 sklearn 源代码,我发现了您的问题 - 您沿错误的轴取平均值。

    解决办法如下:

    Xm = X.mean(axis=0)  # Axis 0 instead of 1
    print pca.transform(X)[:5,:] #Method 1 - expected
    X = X - Xm  # No need for transpose now
    print fast_dot(X,pca.components_.T)[:5,:] #Method 2 - manual
    

    结果:

    [[-2.68420713  0.32660731 -0.02151184]
     [-2.71539062 -0.16955685 -0.20352143]
     [-2.88981954 -0.13734561  0.02470924]
     [-2.7464372  -0.31112432  0.03767198]
     [-2.72859298  0.33392456  0.0962297 ]]
    [[-2.68420713  0.32660731 -0.02151184]
     [-2.71539062 -0.16955685 -0.20352143]
     [-2.88981954 -0.13734561  0.02470924]
     [-2.7464372  -0.31112432  0.03767198]
     [-2.72859298  0.33392456  0.0962297 ]]
    

    【讨论】:

    • 谢谢。这是在某个地方发布的吗 - axis=0
    • 我在源码中看到了:self.mean_ = np.mean(X, axis=0) in sklearn.decomposition.pca
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2020-04-13
    • 2020-01-05
    • 2015-09-29
    • 2020-05-07
    • 2018-06-03
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多