用matlab做svm分类,用MatLab实现SVM分类

本文介绍了一位研究者如何基于林智仁教授的LibSVM代码,尝试自己用Matlab实现线性可分的支持向量机(SVM)。作者通过将SVM的对偶问题转化为有约束的非线性规划问题,最终在Matlab环境下成功构建了一个简单的SVM模型,用于解决给定的线性可分数据集分类问题。
摘要由CSDN通过智能技术生成

在当前数据挖掘和机器学习领域,最为热门的话题莫过于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;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值