我尝试使用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 endtrain_x=train_x*V(:, 1:lamda);
在这里,我简单地使用特征值矩阵重建训练集,特征的数量由描述原始数据集90%的 principal components 决定。
我找到的另一种方法几乎完全相同,只是最后一行改为:
train_x=U(:,1:lamda);
换句话说,我们将训练集视为原始训练集的 principal component 表示,直到某个特征 lambda 为止。
这两种方法似乎都产生了相似的结果(样本外测试误差),但确实存在差异,尽管这种差异可能非常微小。
我的问题是,哪一种是正确的方法?
回答:
答案取决于你的数据以及你想要做什么。
使用你的变量名。一般来说,可以期望 pca
的输出保持
U = train_x * V
但这仅在数据标准化的情况下才成立,具体来说,如果你已经从每个组件中移除了均值。如果没有,那么可以期望的是
U = train_x * V - mean(train_x * V)
在这种情况下,是否要在处理前移除或保留数据的均值,取决于你的应用。
还值得注意的是,即使你在处理前移除了均值,也可能会有一些小的差异,但这将接近于浮点精度误差
((train_x * V) - U) ./ U ~~ 1.0e-15
这种误差可以安全地忽略