最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

用MatLab实现SVM分类

来源:动视网 责编:小OO 时间:2025-09-29 21:43:40
文档

用MatLab实现SVM分类

在当前数据挖掘和机器学习领域,最为热门的话题莫过于SVM和Boosting方法了。只要是涉及到这两个主题,那么论文就会容易被杂志和会议接受了。看来不管做什么,都讲究眼球效应啊。搞研究其实也有点类似超级女声,呵呵。 以前我的论文中用的SVMCode都来自于的林智仁教授的LibSVM。真的是佩服有些大家,自己做出了重要的发现和成果,想到的不是把自己的成果保密起来(像C4.5一样),让自己独享自己的成果;而是让自己的成果最大程度的被人所利用,给后来的研究人员打下一个坚实的基础。说实话,他的代码很
推荐度:
导读在当前数据挖掘和机器学习领域,最为热门的话题莫过于SVM和Boosting方法了。只要是涉及到这两个主题,那么论文就会容易被杂志和会议接受了。看来不管做什么,都讲究眼球效应啊。搞研究其实也有点类似超级女声,呵呵。 以前我的论文中用的SVMCode都来自于的林智仁教授的LibSVM。真的是佩服有些大家,自己做出了重要的发现和成果,想到的不是把自己的成果保密起来(像C4.5一样),让自己独享自己的成果;而是让自己的成果最大程度的被人所利用,给后来的研究人员打下一个坚实的基础。说实话,他的代码很
在当前数据挖掘和机器学习领域,最为热门的话题莫过于SVM和Boosting方法了。只要是涉及到这两个主题,那么论文就会容易被杂志和会议接受了。看来不管做什么,都讲究眼球效应啊。搞研究其实也有点类似超级女声,呵呵。

 

以前我的论文中用的SVM Code都来自于的林智仁教授的LibSVM。 真的是佩服有些大家,自己做出了重要的发现和成果,想到的不是把自己的成果保密起来(像C4.5一样),让自己独享自己的成果;而是让自己的成果最大程度的被人所利用,给后来的研究人员打下一个坚实的基础。 说实话,他的代码很好,用起来很方便,而且不同的语言版本实现都有,即使是对于初学者都很容易掌握。不过用的久了,我就想自己也实现SVM,现在的数学计算工具太多了,而且功能齐全,用起来方便。今天鼓捣了一会,终于用Matlab实现了第一个SVM。虽然比较简单,但是包含了大多数SVM的必要步骤。

 

这个实现是线性可分支持向量分类机,不考虑非线性分类引入核函数的情况,也不考虑推广条件下引入Penalty Loss的情况。

 

问题描述: 平面上有如下点A = [1 1.5;2 1.5;3 1.5;4 1.5;1 0.5;2 0.5;3 0.5;4 0.5]及其对应的标号flag = [1 1 1 1 -1 -1 -1 -1];用SVM方法构造一个决策函数实现正确分类。

 

如果我们在二维坐标上描点,就会发现这是个很简单的线性可分问题。实现方法,用SVM的对偶问题,转换为Matlab的有约束非线性规划问题。

构建m文件:

function f = ffsvm(x)

A = [1 1.5;2 1.5;3 1.5;4 1.5;1 0.5;2 0.5;3 0.5;4 0.5];

flag = [1 1 1 1 -1 -1 -1 -1];

for i=1:1:length(A)

    for j=1:1:length(A)

        normA(i,j) = A(i,:)*A(j,:)';

        normFlag(i,j) = flag(1,i)*flag(1,j);

    end

end

f = 0;

for i=1:1:length(A)

    for j=1:1:length(A)

       f = f + 1/2*(normA(i,j)*x(i)*x(j)*normFlag(i,j));

    end

    f = f - x(i);

end

 

在命令窗口输入:

Aeq = [1 1 1 1 -1 -1 -1 -1];

beq = 0;

lb = [ 0     0     0     0     0     0     0     0];

 

调用MatLab内置优化函数fmincon;

[x,favl,exitflag] = fmincon(@ffsvm,x0,[],[],Aeq,beq,lb,[])

 

得到如下结果:

Optimization terminated successfully:

 Magnitude of directional derivative in search direction

  less than 2*options.TolFun and maximum constraint violation

  is less than options.TolCon

Active Constraints:

     1

x =

    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000

favl =

   -2.0000

exitflag =

     1

 

x的分量都不为0,说明这些点都是支持向量;

计算w;

w = [0 0];

for i = 1:1:length(A)

w = w + flag(i)*x(i)*A(i,:);

end

结果:

w =[0,2];

 

计算b;

 b = 0;

for i=1:1:8

b = b-flag(i)*x(i)*normA(i,1);

end

b = flag(1) + b;

结果:

b = -2;

 

最终的决策函数为:

f = sign([0, 2]*xT-2)

可以验证,这个学习到的决策函数能够对这些平面上的点实现很好的分类;

 

基本思路是这样的,如果要考虑引入核函数和Penalty Loss的情况,只需要修改优化函数和约束就可以实现。而且自己可以根据需求任意构造自己的SVM目标函数,然后用Lagrange方法转换为对偶形式,然后当作一个有约束线性规划问题用Matlab来解。 至于有约束线性规划问题,这是个大概半个世纪前就解决的问题,学过OR的人都知道它的解决方法。网上也有很多的Open Source来解决这个问题,直接Call那些代码就可以了。虽然林智仁教授也提供Source Code,是C++风格的,可读性不是太好。

文档

用MatLab实现SVM分类

在当前数据挖掘和机器学习领域,最为热门的话题莫过于SVM和Boosting方法了。只要是涉及到这两个主题,那么论文就会容易被杂志和会议接受了。看来不管做什么,都讲究眼球效应啊。搞研究其实也有点类似超级女声,呵呵。 以前我的论文中用的SVMCode都来自于的林智仁教授的LibSVM。真的是佩服有些大家,自己做出了重要的发现和成果,想到的不是把自己的成果保密起来(像C4.5一样),让自己独享自己的成果;而是让自己的成果最大程度的被人所利用,给后来的研究人员打下一个坚实的基础。说实话,他的代码很
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top