导读:题主的问题一是如何使用LIBSVM工具,二是对模式识别、机器学习中的一些概念不清楚。下面以matlab版libsvm为例:训练命令:model = svmtrain(train_label, train_data, ['libsvm_opt
题主的问题一是如何使用LIBSVM工具,二是对模式识别、机器学习中的一些概念不清楚。下面以matlab版libsvm为例:
训练命令:
model = svmtrain(train_label, train_data, ['libsvm_options']);
测试命令:
[predict_label, accuracy, dec_values] = svmpredict(test_label, test_data, model);
0 “使用svm-train训练完成后,将一行数据作为测试样本,运行svm-predict。测试数据的首位label值我是随意写的,结果predict出来一个accuracy=0% (0/1),如果我修改首位label值为训练样本中的某类别编号,则accuracy=100% (1/1)。”
首先, 如果测试样本的label在训练样本里没出现过,那accuracy肯定是0 想想这个类别之前都没训练学习过,机器怎么可能把它预测出来。
其次,用训练样本当作测试样本,这个意义不大。即使在训练样本上测试的结果是100%,这也并不说明问题,更可能的是过拟合。
1 “我想要知道单个测试样本最有可能属于哪一个类别(训练时用的是多类别分类),该如何做?”
单个样本预测的类别,就是上述测试命令中的返回值predict_label,它是一个列向量,第i个元素代表第i个测试样本的预测类别。
2 “我看见不少人在训练完成后,用另一个样本集做predict,返回一个介于0%和100%之间的accuracy值。我想这个值只能解释为测试样本中正确的类别编号所占的百分比,但这又有何意义?这个accuracy到底是什么意义?”
这个accuracy非常有意义。想想你训练了一个模型,如何评价这个模型的好坏?当然是找一组新的测试数据来进行预测,如果预测的准确率非常高,100%,那说明之前训练的模型是比较好的。当然前提是测试样本也要足够多。
libsvm虽然支持多类分类,但是其本质是基于“一对一”法的多类分类,因此究其其本质其实是个二分类svm。
既然是二分类,肯定有属于之一类-1的支持向量,属于第二类+1的支持向量,它肯定应该是个二维数组。
libsvm训练输出model中的参数有一个是sv_coef,它表示的是支持向量在决策函数中:
的系数a,而b是model里的rho。
最后说下model里全有啥参数:
model =
Parameters: svm的类型参数
nr_class: 有多少个类别
totalSV: 支持向量总个数
rho: 就是决策函数里那个b
Label: 类标
ProbA:
ProbB: 这两个是但svm 选-b是用到的参数
nSV: 每类有多少个支持向量
sv_coef: 决策函数那个a
SVs: 里面装的是所以支持向量
菜鸟个人愚见,如有错误望指正!共同学习
这个问题其实非常地简单。
1、在Matlab里面先做这样一小段处理:
data = [
05 2 12 26 2 00476890000000000
05 3 14 28 4 00792965000000000
05 4 16 30 6 0106723000000000
05 5 18 32 8 0112500000000000
1 2 14 30 8 0487650000000000
1 3 12 32 6 00955300000000000
1 4 18 26 4 0336150000000000
1 5 16 28 2 0202830000000000
15 2 16 32 4 118260000000000
15 3 12 30 2 0273390000000000
15 4 18 28 8 0784670200000000
15 5 14 26 6 0487695000000000
2 2 18 28 6 141230000000000
2 3 16 26 8 0934150000000000
2 4 14 32 2 0181100000000000
2 5 12 30 4 108280000000000
];
x = data(:,1:end-1);
y = data(:,end);
% 上述处理即是将最后一列作为输出,前n-1列全部作为输入
2 将 x, y 分别作为输入和输出放入svmtrain函数中训练
3 再在svmpredict函数中输入x即可得出各个x对应的预测值y
注:这里的原理其实十分简单,在libsvm中其实也是将所有变量都默认为了向量(或矩阵),所以你只管输入的数据结构即可。
你好!
1
1
v
1
实现的多分类(一对一法(one-versus-one,简称1-v-1
SVMs)。)
Libsvm中的多类分类就是根据这个 *** 实现的。
2
在工具箱里面可以找到
svmtrain
3
看视频。里面有讲解怎么弄成matlab格式的数据~
仅代表个人观点,不喜勿喷,谢谢。
您好,很高兴为您解答。
a(1)=0;for i=2:220
a(i)=06a(i-1)+randn;
end
train_t = 1:200;
train = a(train_t);
train_t = train_t';
train = train';
test_t = 1:203;
test=a(test_t);
test_t = test_t';
test = test';
[bestmse,bestc,bestg] = SVMcgForRegress(train,train_t,-3,11,-7,1,3,05,05,01);
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -p 001 -s 3'];
model = svmtrain(train,train_t,cmd);
[trainpre,trainmse] = svmpredict(train,train_t,model);
figure;
hold on;
plot(train);
plot(trainpre,'r');
title('原来的训练数据的拟合1-200');
legend('原来的训练数据','训练数据预测拟合数据');
hold off
[testpre,testmse] = svmpredict(test,test_t,model);
figure;
hold on;
plot(test);
plot(testpre,'r');
title('测试数据的预测1-203');
legend('测试数据','测试数据预测拟合数据');
hold off
如若满意,请点击右侧采纳答案,如若还有问题,请点击追问
希望我的回答对您有所帮助,望采纳!
~ O(∩_∩)O~
以下两种 *** ,我已经亲测可用 *** 1:可以在其他朋友的电脑上进行编译,编译完后直接把libsvmreadmexw64、libsvmwritemexw64、svmpredictmexw64、svmtrainmexw64复制到你自己的程序中即可运行。这种 *** 的弊端是不同的算法程序中均需要复制一次。 *** 2:把编译完后的libsvmreadmexw64、libsvmwritemexw64、svmpredictmexw64、svmtrainmexw64这几个文件添加到F:\MATLAB2015aanzhuang\toolbox\libsvm-322\matlab下,即可