有关Matlab中的SVM的一些问题的讨论 下载本文

内容发布更新时间 : 2024/6/20 19:55:53星期一 下面是文章的全部内容请认真阅读。

近来就有关SVM的一些细节上的问题和版主hehaiwanghui做了一次讨论,征得同意我把这次邮件往来贴出来,好让有类似问题的朋友可以方便解决问题.O(∩_∩)O

hehaiwanghui视频看的真的是太仔细了.SVM研究的也蛮深刻的..很是强大.呵呵...

Q&A: Q:

--兄:

你好!我是论坛中的hehaiwanghui(--),学了你的SVM视频,讲的很好,非常感谢。 学习过程,遇到几个疑问,有时间劳烦你看一下: 1、svmtrain和svmpredict的m源码打开是乱码(svmtrain.mexw32和svmpredict.mexw32), 对应的.c文件可以打开,问一下,有什么方式可以看到m源码,想研究一下算法,c学的不大好。 2、当使用交互验证方式训练时,输出变成为准确率了,同时在command window中输出Cross Validation Accuracy,我尝试把.c中的

//mexPrintf(\注释掉了,可以做到不显示,但是感觉不方便,,能不能像神经网络那样设置不显示和显示。不显示

做起来会快很多。

3、训练得到的model里参数: model =

Parameters: [5x1 double]

nr_class: 3 %分成3类

totalSV: 85 %总的支持向量数 rho: [3x1 double] %

Label: [3x1 double] %训练集的标签 ProbA: [] ProbB: []

nSV: [3x1 double] sv_coef: [85x2 double] %

SVs: [85x13 double] %支持向量

我也看了readme,感觉比较抽象,有些不理解(那些没注释的)。 4、当在找最佳-c、-g时,循环里你用了 log2c = -10:10 log2g = -10:10

-c为2^log2c,-g为2^log2g,是不是说-c和-g要是2的指数次方的数? 或者说你这样取值是不是有什么优势?这样取值感觉就是把范围拉大了,间隔也大了,很多值都取不

到了。-c和-g有没有范围限制?

我的理解是没有必要,在wine_SVM2中我做了相应的变化: for c = 0.1:0.1:2

for g = 0.1:0.1:2

cmd = ['-v 5 -c ', num2str(c), ' -g ', num2str(g)];%参数

cv = svmtrain(train_wine_labels, train_wine, cmd); %训练,输出交互验证的准确率

if (cv > bestcv),

bestcv = cv; bestc = c; bestg = g; end end end 得到:

(best c=0.8, g=0.6, rate=98.8764)

Accuracy = 95.5056% (85/89) (classification) 结果还不错。

5、在做二分类时,能不能在图上把超平面画出来?也就是要知道y=wx+b方程?

6、在做多分类时,能不能在图上画出相应的超平面,这个时候是不是已经不是平面了,而是超曲面了?

麻烦你了,O(∩_∩)O~。

A:

本帖隐藏的内容

--兄: 你好!

你看的真的真的是太仔细了.现在我一一跟你作答.

[有的我会给你很明确的答复,有的我无法给你明确答复,因为有几个问题也是我 正在思考的.anyway.你很强大.O(∩_∩)O]

1.想看SVM的源码你就只能看C的,因为:libsvm最初就是用C写的,里面的svmtrain.mexw32 和svmpredict.mexw32仅仅是matlab把原来的c语言的代码转成Matlab可识别的一个接口文

件,所以当然是那种编译类的乱码.

即没有m源码,可看,要想看你只能看c的源码,其实c的也不是很难的.呵呵.

2.这个我没有重点考虑过,也没试过如何更显示不显示,这些显示类的东西我不太看重,感 觉挺虚幻的. 3.Parameters

我也不知道它记录的是什么[看帖子后面.已弄清楚].. rho=-b 即 -rho 就是 wx+b中的那个b ProbA ProbB

是和回归相关的东西.我也没仔细研究过. nSV

每一类的支持向量的个数 sv_coef

在决策函数[wx+b]中每一个支持向量的系数

4.c和g那样取值是为了通用性,因为你并不知道到底c和g在哪个范围内是好的.

当然这个问题你可以那样取值,但你不能确定你找到的c和g能使得最终测试集合的分类准确

率最高,我后来又发了个帖子你可以看看到底怎样寻找最佳的c和g,可以先粗范围找再细范 围找,你那样找对于此问题可以,但不能保证通用性..

那个帖子是:http://www.ilovematlab.cn/thread-47819-1-1.html 5.可以的.理论上那个 y=wx+b方程是可以表示.:

% w = model.SVs' * model.sv_coef; % b =

-model.rho;

但我曾试过低维的情况画出来.但画出来的并不靠谱.我也不知道为什么... 6.画超平面我还没试过.不知道能不能画出..应该就是超曲面了..

color=#ff0000>PS: 咱俩的这封邮件交往.可否让我在论坛里发个帖子.让有类似问题的朋友也看看...O(∩_∩)O

祝 学习工作顺利. 交流

互相提高...O(∩_∩)O

==========

Parameters 记录的是SVM所采用的模型参数,就是那些 -c -g -s 这些参数内容的..

其中Parameters是结构体 svm_parameter 类型数据.定义如下: struct svm_parameter {

int svm_type; int kernel_type;

int degree; /* for poly */

double gamma; /* for poly/rbf/sigmoid */ double coef0; /* for poly/sigmoid */

/* these are for training only */ double cache_size; /* in MB */

double eps; /* stopping criteria */

double C; /* for C_SVC, EPSILON_SVR and NU_SVR */ int nr_weight; /* for C_SVC */

int *weight_label; /* for C_SVC */ double* weight; /* for C_SVC */

double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */ double p; /* for EPSILON_SVR */

int shrinking; /* use the shrinking heuristics */ int probability; /* do probability estimates */ };