使用 PCA 降维 - MATLAB

Dimensionality reduction using PCA - MATLAB

我正在尝试使用 PCA 降低训练集的维度。 我遇到过两种方法。

[V,U,eigen]=pca(train_x);
eigen_sum=0;
for lamda=1:length(eigen)
     eigen_sum=eigen_sum+eigen(lamda,1);
     if(eigen_sum/sum(eigen)>=0.90)
           break;
     end    

end
train_x=train_x*V(:, 1:lamda);

在这里,我简单地使用特征值矩阵来重建训练集,其中较少的特征由描述原始集的90%的主成分确定。

我找到的替代方法几乎完全一样,保存最后一行,更改为:

train_x=U(:,1:lamda);

换句话说,我们将训练集作为原始训练集对某些特征lamda的主成分表示。

这两种方法似乎都产生了相似的结果(样本测试错误),但存在差异,无论差异多么微小。

我的问题是,哪一个是正确的方法?

答案取决于你的数据,以及你想做什么。

使用你的变量名。一般来说,很容易期望 pca 的输出保持

U = train_x * V

但这只有在您的数据被规范化时才是正确的,特别是如果您已经从每个组件中删除了均值。如果没有,那么可以期待的是

U = train_x * V - mean(train_x * V)

在这方面,您是否希望在处理数据之前删除或保留数据的平均值取决于您的应用程序。

另外值得注意的是,即使你在处理前去掉均值,也可能会有一些小的差异,但它会围绕浮点精度误差

((train_x * V) - U) ./ U ~~ 1.0e-15

并且可以安全地忽略此错误