Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab和支持向量机:为什么';主成分分析的实现是否能给出良好的预测结果?_Matlab_Svm_Libsvm_Pca - Fatal编程技术网

Matlab和支持向量机:为什么';主成分分析的实现是否能给出良好的预测结果?

Matlab和支持向量机:为什么';主成分分析的实现是否能给出良好的预测结果?,matlab,svm,libsvm,pca,Matlab,Svm,Libsvm,Pca,我有一个包含60000张图像的训练数据集和一个包含10000张图像的测试数据集。每个图像表示一个从0到9的整数。我的目标是使用libsvm,这是一个支持向量机库,以便从训练数据集中学习数字,并使用生成的分类预测测试数据集的图像 每个图像都是28x28,这意味着它具有784像素或特征。虽然这些特性似乎太多,但运行SVM应用程序和学习训练数据集只需5-10分钟。测试结果非常好,给了我93%的成功率 我决定尝试使用matlab中的PCA,以减少特征量,同时又不会丢失太多信息 [coeff scores

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

每个图像都是
28x28
,这意味着它具有
784
像素或特征。虽然这些特性似乎太多,但运行SVM应用程序和学习训练数据集只需5-10分钟。测试结果非常好,给了我93%的成功率

我决定尝试使用matlab中的PCA,以减少特征量,同时又不会丢失太多信息

[coeff scores latent] = princomp(train_images,'econ');
我稍微玩了一下潜在功能,发现前90个功能会导致
10%
信息丢失,所以我决定只使用前90个功能

在上述代码序列中,图像是一个大小为
[60000x784]

从这段代码中我得到了分数,从分数中我只得到了我想要的功能的数量,所以最后我得到了一个训练图像数组
[60000x90]

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

我尝试使用以下方法:

test_images = test_images' * coeff;
test_images = test_images(:,(1:number_of_features))';
请注意,相应地,测试图像是一个大小为
[784x1000]
的数组,而系数是一个大小为
[784x784]
的数组

然后,我通过执行以下操作,仅获取了90个功能:

test_images = test_images' * coeff;
test_images = test_images(:,(1:number_of_features))';
这似乎是正确的。然而,在进行了训练和预测之后,我获得了
60%的成功率
,这比我完全不使用PCA时获得的成功率要低得多

问题2:为什么我的成绩这么低?

PCA后,我像往常一样缩放数据,我想这是正确的做法。根据libsvm的网站,不缩放通常不是一个好主意,所以我认为这不是一个问题


提前感谢您

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

所以,如果你有很好的结果和完整的功能,为什么要减少尺寸


您可能想尝试使用不同的主组件。如果取91:180的分量会发生什么?那可能是一个有趣的实验…

我看不出你所做的有什么特别的错误。。在这种情况下,PCA可能不是最好的方法,因为生成的特征可能对分类没有用处。这是Kaggle数字识别比赛的数据吗?PCA也是我尝试的第一件事,结果也很差。当你看到代表每个数字的前几个特征向量时,它们看起来是否非常模糊(这就是我看到的)?我更幸运的是,直接在784像素的向量上训练SVM,甚至没有提取任何特征。PCA对我来说唯一有效的方法是不将测试数据集投影到训练数据集的系数上(在对其运行PCA之后)但是,当我创建一个新数组时,它同时包含训练数据集和测试数据集,因此系数是整体计算的,最终没有进行任何预测。然而,尽管我得到了一个非常好的结果,大约95%的成功率,但我不认为这是一件好事,因为测试数据集是未知的。。然而,我没想到在做投影时会有这么低的成功率……是的,它们看起来确实很模糊