人工PCA逆变换

2024-05-16 20:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用scikit learn。我的应用程序的性质是这样的,我离线进行拟合,然后只能使用得到的系数在线(动态)手动计算各种目标。

转换很简单,它只是data * pca.components_,即简单的点积。但是,我不知道如何执行反变换。pca对象的哪个字段包含反变换的相关系数?如何计算反变换?

具体来说,我指的是sklearn.decomposition.PCA package中提供的PCA.inverse_transform()方法调用:如何使用PCA计算的各种系数手动重现其功能?


Tags: 对象应用程序目标datacomponents动态手动sklearn
1条回答
网友
1楼 · 发布于 2024-05-16 20:32:42

1)transform不是data * pca.components_

首先,*不是numpy数组的点积。这是元素相乘。要执行点积,需要使用np.dot

其次,PCA.components_的形状是(n个组件,n个特征),而要转换的数据形状是(n个样本,n个特征),因此需要对PCA.components_进行转置才能执行点积。

此外,变换的第一步是减去平均值,因此,如果手动进行,也需要首先减去平均值。

正确的转换方法是

data_reduced = np.dot(data - pca.mean_, pca.components_.T)

2)inverse_transform只是transform的逆过程

data_original = np.dot(data_reduced, pca.components_) + pca.mean_

如果您的数据在每一列中的平均值已经为零,那么您可以忽略上面的pca.mean_

import numpy as np
from sklearn.decomposition import PCA

pca = PCA(n_components=3)
pca.fit(data)

data_reduced = np.dot(data, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # inverse_transform

相关问题 更多 >