首页 > 解决方案 > sklearn 中的 PCA 实现是否有拦截?

问题描述

我正在使用 sklearn 的 PCA 实现,并希望从拟合模型中导出负载,这样我就可以在不使用 python 的情况下在其他任何地方进行转换。

但是,当我尝试验证数据集的点积与负载没有给出与转换函数相同的结果时,我遇到了一个问题。这是一个例子:

df = pd.DataFrame({'col1': [5,3,1,1,2,2,3,3,3],
                   'col2': [5,3,1,2,2,3,4,5,5],
                   'col3': [3,3,1,1,1,1,1,1,1]})

我从 sklearn 导入 PCA 并用一个组件拟合模型

from sklearn.decomposition import PCA
model = PCA(n_components=1)
model.fit(df)

使用拟合模型,我将 3 列数据集转换为一列

print(model.transform(df))
array([[ 3.13985669],
       [ 0.4068059 ],
       [-2.81207381],
       [-2.0684094 ],
       [-1.44554842],
       [-0.701884  ],
       [ 0.6646414 ],
       [ 1.40830581],
       [ 1.40830581]])

根据 sklearn 文档,我可以在 components_ 属性中访问加载。当我使用加载转换数据集时,我得到不同的输出。

print(df.dot(model.components_.T).values)
array([[7.56137036],
       [4.82831957],
       [1.60943986],
       [2.35310427],
       [2.97596525],
       [3.71962967],
       [5.08615507],
       [5.82981948],
       [5.82981948]])

但是,机器人输出之间的差异似乎是恒定的

print(model.transform(df) - df.dot(model.components_.T).values)
[[-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]
 [-4.42151367]]

我被告知 PCA 没有拦截,但这是否意味着 sklearn 中的 PCA 实现包括拦截?如果是这样,有没有一种方法可以访问这个截距而不调用转换函数和带有负载的数据的点积之间的差异?

注意:我知道数据规范化解决了截距的问题,但在这种情况下我不能使用它。

标签: pythonscikit-learnpca

解决方案


推荐阅读