2

我有一个包含 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 网站,不缩放通常不是一个好主意,所以我认为这不是问题。

先感谢您

4

1 回答 1

1

关于您的第一个问题,相信 MarkV 已经为您提供了答案。至于第二个问题:PCA确实保留了你数据的大部分方差,但并不一定意味着它保留了你数据90%的信息。有时,成功分类所需的信息实际上位于您敲掉的这 10% 上。可以在这里找到一个很好的例子,尤其是那里的图 1。

所以,如果你在完整的功能上得到了很好的结果,为什么要减少维度呢?

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

于 2012-12-15T20:34:23.367 回答