手动PCA逆变换
PCA inverse transform manually
我正在使用 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_
进行点积.
另外,transform的第一步是减去均值,所以如果手动操作,也需要先减去均值。
正确的变换方式是
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
我正在使用 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_
进行点积.
另外,transform的第一步是减去均值,所以如果手动操作,也需要先减去均值。
正确的变换方式是
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