我有一个包含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网站,不缩放通常不是一个好主意,所以我不认为这是一个问题。
提前谢谢
答案 0 :(得分:1)
关于你的第一个问题,我相信MarkV已经为你提供了答案。 关于第二个问题:PCA确实保留了数据的大部分差异,但并不一定意味着它维护了数据的信息的90%。有时,成功分类所需的信息实际上位于您被淘汰的10%。可以找到一个很好的例子here,特别是那里的图1。
因此,如果您对完整功能有良好的效果,为什么要缩小尺寸?
您可能想尝试使用不同的主要组件。如果你采取组件91:180会发生什么?这可能是一个有趣的实验...