我正在关注此页面上的示例:Example of 10-fold SVM classification in MATLAB。
基本上,我按照这个例子来执行我的分类。我面临的问题是,pred总是积极的。它无法检测到负面数据。
clear all;
clc;
load('C:\Users\HP\Documents\MATLAB\TrainLabel');
load('C:\Users\HP\Documents\MATLAB\TrainVec');
cvFolds = crossvalind('Kfold', TrainLabel, 10);
cp = classperf(TrainLabel);
for i = 1:10
testIdx = (cvFolds == i);
trainIdx = ~testIdx;
% Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx),'showplot',true);
Model = svmtrain(TrainVec(trainIdx,:), TrainLabel(trainIdx), ...
'Autoscale',true, 'Showplot',false, 'Method','QP', ...
'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);
pred = svmclassify(Model, TrainVec(testIdx,:),'Showplot',false);
cp = classperf(cp, pred, testIdx);
end
cp.CorrectRate
cp.CountingMatrix
pred的值是[1; 1; 1; 1; 1; 1],但我的正确率是0.65(65%),而TrainLabel是<60x1 double&gt;和TrainVec是&lt; 60x5900 double&gt;。
另外两个qns:
TrainLabel的值必须为0和1吗?如果它是-1或1
TrainVec使得图像中的每个要素都放在一行中。下一个图像的功能放在下一行。它是否正确?或者每项功能必须放在不同的栏目中吗?
需要一些帮助...谢谢
答案 0 :(得分:4)
你需要很多功能。
您正在尝试仅使用60个训练点找到分离的5899维超平面。由于Curse of dimensionality(又名休斯效应),这根本不起作用。
您需要先提取相关功能,然后才能处理这些功能。这称为Feature Extraction。
这样做的一种简单方法是使用pcacov
使用Principle Component Analysis转换数据,然后只保留一定比例(使用第三个EXPLAINED
结果来保持k PC的解释一种证据等级差异,如98%)。这将缩短你的问题的维度,并很可能改善你的结果。
请记住转换所有您的数据,而不仅仅是培训集。
除此之外,你的方法对我来说似乎是正确的。不同的样本分为不同的行,其特征跨越列。
标签向量可以是您想要的任何内容:
Y是分组变量,即它可以是a 分类,数字或逻辑向量;字符串的单元格向量;或者a 字符矩阵,每行代表一个类标签(请参阅帮助 groupingvariable)
答案 1 :(得分:-1)
将值缩放到0到1之间。这将解决问题