python - 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 实现包括拦截?如果是这样,有没有一种方法可以访问这个截距而不调用转换函数和带有负载的数据的点积之间的差异?
注意:我知道数据规范化解决了截距的问题,但在这种情况下我不能使用它。
解决方案
推荐阅读
- python - 树莓派 - Python 部署 - Pipenv
- python - Pandas .idxmin(axis=1) 返回错误的列名值
- php - Laravel + 护照:面临问题 401 未经授权
- python - 在 Spark 上实现 Trie(或类似的数据结构)
- html - 当悬停在我的按钮上时,想要一个交易效果(按钮开始从左到右填充渐变颜色),
- git - 尝试将我的文件推送到仓库时出现此错误
- python - 我可以在 1-dim 数据帧上使用 apply() 或其他任何东西来构建数据帧列表吗?
- google-apps-script - 谷歌表单通知脚本
- c++ - 为什么缩放矩阵会导致顶点退出 QQuickItem 的边界?
- microsoft-teams - 如何从 POSTMAN 向 Microsoft Teams 发送消息