我有一个包含 60,000 张图像的训练数据集和一个包含 10,000 张图像的测试数据集。每个图像代表一个从 0 到 9 的整数。我的目标是使用 libsvm,它是一个支持向量机库,以便从训练数据集中学习数字,并使用生成的分类来预测测试数据集的图像。
每个图像都28x28
意味着它具有784
像素或特征。虽然功能似乎太多,但运行 SVM 应用程序并学习训练数据集只需要 5-10 分钟。给我的测试结果非常好93% success rate
。
我决定尝试使用 matlab 中的 PCA,以减少特征量,同时不丢失太多信息。
[coeff scores latent] = princomp(train_images,'econ');
我稍微玩了一下latent,发现前90个特征会导致10%
信息丢失,所以我决定只使用前90个。
在上面的代码中 train_images 是一个大小数组[60000x784]
从这段代码中我得到了分数,从分数中我简单地得到了我想要的特征数量,所以最后我有一个训练图像数组[60000x90]
问题1:将测试数据集投影到系数=> coeff的正确方法是什么?
我尝试使用以下内容:
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 网站,不缩放通常不是一个好主意,所以我认为这不是问题。
先感谢您