手动PCA逆变换

Bar*_*ich 7 python numpy pca scikit-learn

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

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

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

yan*_*jie 17

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)
Run Code Online (Sandbox Code Playgroud)

2)inverse_transform只是逆过程transform

data_original = np.dot(data_reduced, pca.components_) + pca.mean_
Run Code Online (Sandbox Code Playgroud)

例如,如果您的数据在每列中的均值为零,则可以忽略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
Run Code Online (Sandbox Code Playgroud)

  • 要手动执行此操作并截断维度,请使用“data_reduced = np.dot(data, pca.components_.T[:,:dim])”,然后返回“data_original = np.dot(data_reduced, pca.components_[:dim, :])` (2认同)