Matlab和支持向量机:为什么PCA的实现不能提供良好的预测结果?

时间:2012-12-14 23:17:34

标签: matlab svm libsvm pca

我有一个包含60,000张图像的训练数据集和一个包含10,000张图像的测试数据集。每个图像代表一个从0到9的整数。我的目标是使用libsvm这是一个支持向量机的库,以便从训练数据集中学习数字,并使用生成的分类来预测测试数据集的图像。 / p>

每张图片均为28x28,表示它有784像素或要素。虽然功能似乎太多,但只需5-10分钟即可运行SVM应用程序并学习训练数据集。测试结果非常好,给了我93% success rate

我决定尝试使用matlab中的PCA来减少功能量,同时不会丢失太多信息。

[coeff scores latent] = princomp(train_images,'econ');

我稍微玩了一下,发现前90个功能会导致10%信息丢失,所以我决定只使用前90个。

在上面的代码中train_images是一个大小为[60000x784]

的数组

从这段代码中我得到了分数,从得分中我简单地得到了我想要的功能数量,所以最后我为训练图像提供了[60000x90]

的数组

问题1:将测试数据集投影到系数=>的正确方法是什么?系数_吗

我尝试使用以下内容:

test_images = test_images' * coeff;

请注意,test_images相应地是一个大小为[784x10000]的数组,而coeff是一个大小为[784x784]的数组

然后再通过以下方式我只采用了90个功能:

test_images = test_images(:,(1:number_of_features))';

似乎是正确的。然而,在运行训练然后进行预测之后,我得到60% success rate,这比我在没有使用任何PCA时获得的成功率低得多。

问题2:为什么我会得到如此低的结果?

在PCA之后,我一如既往地缩放数据,这是我猜的正确的事情。根据libsvm网站,不缩放通常不是一个好主意,所以我不认为这是一个问题。

提前谢谢

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,我相信MarkV已经为你提供了答案。 关于第二个问题:PCA确实保留了数据的大部分差异,但并不一定意味着它维护了数据的信息的90%。有时,成功分类所需的信息实际上位于您被淘汰的10%。可以找到一个很好的例子here,特别是那里的图1。

因此,如果您对完整功能有良好的效果,为什么要缩小尺寸?

您可能想尝试使用不同的主要组件。如果你采取组件91:180会发生什么?这可能是一个有趣的实验...