求助关于libsvm的predict *** 的具体意义

中超04
求助关于libsvm的predict *** 的具体意义
导读:题主的问题一是如何使用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下,即可