手动进行PCA逆变换



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

变换很简单,它只是data * pca.components_,即简单点积。然而,我不知道如何进行逆变换。pca对象的哪个场包含逆变换的相关系数?如何计算逆变换?

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

1) transform不是data * pca.components_

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

其次,PCA.components_的形状是(n_components, n_features),而待变换数据的形状是(n_samples, n_features),所以需要对PCA.components_进行转置进行点积。

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

正确的转换方法是

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

2) inverse_transformtransform的逆过程

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

相关内容

  • 没有找到相关文章

最新更新