监督学习SVM(暂时只学习到线性)

文章目录

  • SVM算法(Support Vector Machine)
    • 定义及介绍
    • 线性可分支持向量机(硬间隔)
      • MATLAB代码实例
    • 线性支持向量机(软间隔)
      • MATLAB代码实例

SVM算法(Support Vector Machine)

定义及介绍

SVM算法是基于统计学习理论的一种机器学习方法,通过寻求结构化风险最小化来提高学习器泛化能力。常用于对小样本、非线性及高维数据进行模式识别、分类以及回归分析。

正例与反例,SVM是个二分类的分类模型。正例和反例分别对应正负样本点,是样本的集合。

超平面,将特征空间划分为正类和负类的分类边界,一般将任何维度的分类边界都统称超平面。

规范超平面,在线性可分时是唯一且必然存在的一种特殊平面,满足
{ y i [ ( w T ⋅ a i ) + b ] ⩾ 0 , m i n   ∣ ( w T ⋅ a i ) + b ∣ = 1 ,   i = 1 , . . . , l \begin{cases} y_i[(w^T\cdot a_i)+b]\geqslant0,\\ min\ |(w^T\cdot a_i)+b|=1, \end{cases} \ i=1,...,l {yi[(wTai)+b]0,min (wTai)+b=1, i=1,...,l
分类边界,即 ( w ⋅ x ) + b = ± 1 (w\cdot x)+b=\pm1 (wx)+b=±1

学习的目标就是在特征空间寻找到一个超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0,使之与正样本集合负样本集间距最大,即中间的线最可信。

线性可分支持向量机(硬间隔)

对于训练集 T T T,若 ∃ ω ∈ R n , b ∈ R n \exist \omega\in R^n,b\in R^n ωRn,bRn和正数 ϵ , \epsilon, ϵ,使得对所有正例都有 w T a i + b ⩾ ϵ w^Ta_i+b\geqslant \epsilon wTai+bϵ,对所有的反例都有 w T a i + b ⩽ − ϵ w^Ta_i+b\leqslant -\epsilon wTai+bϵ,则称训练集 T T T线性可分,称相应的分类问题是线性可分的。

定理 当训练集 T T T线性可分时,存在唯一的规范超平面 ( w T ⋅ x ) + b = 0 (w^T\cdot x)+b=0 (wTx)+b=0,使得
{ ( w ⋅ a i ) + b ⩾ 1 , y i = 1 , ( w ⋅ a i ) + b ⩽ − 1 , y i = 1 。 \begin{cases} (w\cdot a_i)+b\geqslant 1,y_i=1,\\ (w\cdot a_i)+b\leqslant -1,y_i=1。 \end{cases} {(wai)+b1,yi=1,(wai)+b1,yi=1
满足 ( w T ⋅ a i ) + b = ± 1 (w^T\cdot a_i)+b=\pm1 (wTai)+b=±1 a i a_i ai称为普通支持向量。规范超平面与正反例之间的间隔为 1 ∣ w ∣ \frac{1}{|w|} w1,正反普通支持向量之间的间隔为 2 ∣ w ∣ \frac{2}{|w|} w2。从而求最优超平面的问题就是最大化 2 ∣ w ∣ \frac{2}{|w|} w2。于是寻找最优超平面的问题可以转化为如下的二次规划问题:
m i n   1 2 ∣ w ∣ 2 , s . t .   y i [ ( w T ⋅ a i ) + b ] ⩾ 1 , i = 1 , . . . , l 。 min\ \frac{1}{2}|w|^2,\\ s.t.\ y_i[(w^T\cdot a_i)+b]\geqslant1,i=1,...,l。 min 21w2,s.t. yi[(wTai)+b]1,i=1,...,l
引入Lagrange函数
L ( w , b , α ) = 1 2 ∣ w ∣ 2 + ∑ i = 1 l α i { 1 − y i [ ( w ⋅ a i ) + b ] } , L(w,b,\alpha)=\frac{1}{2}|w|^2+\sum^l_{i=1}\alpha_i\{1-y_i[(w\cdot a_i)+b]\}, L(w,b,α)=21w2+i=1lαi{1yi[(wai)+b]},
式中: α = [ α 1 , . . . , α l ] T ∈ R l + \alpha=[\alpha_1,...,\alpha_l]^T\in R^{l+} α=[α1,...,αl]TRl+为aLagrange乘子。

根据对偶的定义,通过对原问题中各变量的偏导置零,得
∂ L ∂ w = 0   ⟹   w = ∑ i = 1 l α i y i a i , ∂ L ∂ b = 0   ⟹   ∑ i = 1 l α i , \frac{\partial L}{\partial w}=0\ \Longrightarrow \ w=\sum_{i=1}^l\alpha_iy_ia_i,\\ \frac{\partial L}{\partial b}=0\ \Longrightarrow \ \sum_{i=1}^l\alpha_i, wL=0  w=i=1lαiyiai,bL=0  i=1lαi,
代入Lagrange函数化为原问题的Lagrange对偶问题:
m a x   − 1 2 ∑ i = 1 l ∑ j = 1 l y i y j α i α j ( a i ⋅ a j ) + ∑ i = 1 l α i , s . t . { ∑ i = 1 l y i α i = 0 , α i ⩾ 0 , i = 1 , . . . , l 。 max\ -\frac{1}{2}\sum_{i=1}^l\sum_{j=1}^{l}y_iy_j\alpha_i\alpha_j(a_i\cdot a_j)+\sum_{i=1}^{l}\alpha_i,\\ s.t.\begin{cases} \sum_{i=1}^{l}y_i\alpha_i=0,\\ \alpha_i\geqslant0,i=1,...,l。 \end{cases} max 21i=1lj=1lyiyjαiαj(aiaj)+i=1lαi,s.t.{i=1lyiαi=0,αi0,i=1,...,l
求解上述最优化问题,得到最优解 α ∗ = [ α 1 ∗ , . . . , α l ∗ ] T , \alpha^*=[\alpha_1^*,...,\alpha_l^*]^T, α=[α1,...,αl]T,计算
w ∗ = ∑ i = 1 l α i ∗ y i a i , w^*=\sum_{i=1}^l\alpha_i^*y_ia_i, w=i=1lαiyiai,
由KKT互补条件Link知
α i ∗ { 1 − y i [ ( w ∗ ⋅ a i ) + b ∗ ] } = 0 , \alpha_i^*\{1-y_i[(w^*\cdot a_i)+b^*]\}=0, αi{1yi[(wai)+b]}=0,
可得只有当 a i a_i ai为支持向量的时候,对应的 α i ∗ \alpha_i^* αi才为正,否则皆为0。选择 α ∗ \alpha^* α的一个正分量 α j ∗ , \alpha_j^*, αj,并以此计算
b ∗ = y j − ∑ i = 1 l y i α i ∗ ( a i ⋅ a j ) 。 b^*=y_j-\sum_{i=1}^ly_i\alpha_i^*(a_i\cdot a_j)。 b=yji=1lyiαi(aiaj)

MATLAB代码实例

%该算法是通过二次规划quadprog函数求解的只能求出omega,b
%https://blog.csdn.net/sinat_32741771/article/details/52882428
clc,clear;
load('SVM.mat');
data=SVM.VarName1(:);
data=[data SVM.VarName2(:)];
label=SVM.VarName3(:);
%输入随情况而改变,这里只给出某种特例
[num_data,d] = size(data);
输入H;%H是个n+1的对角为1的方阵,第n+1是0,n是数据除标签后的维度
f=zeros(n+1,1);
C=-ones(num_data,1);
A=[-label.*data,-label];
D=quadprog(h,f,A,C);

线性支持向量机(软间隔)

硬间隔支持向量机是一个严格的线性模型,即用一个超平面将数据分隔为两部分。但数据一般情况下很少是严格线性可分的,难以找到一个超平面可以完美地隔开这些数据,即使在训练模型的时候隔开了,当训练集或实际数据落入特征空间后,也很难说会被正确隔开(过拟合)。而且,如果模型把一些噪声当成了支持向量,那也会得到错误的结果。

软间隔支持向量机允许部分样本不满足 y i [ ( ω ⋅ a i ) + b ] ⩾ 1 y_i[(\omega\cdot a_i)+b]\geqslant1 yi[(ωai)+b]1,并引入松弛变量 ξ i ⩾ 0 , i = 1 , . . . , l 。 \xi_i\geqslant0,i=1,...,l。 ξi0,i=1,...,l得到软化的松弛条件 y i [ ( ω ⋅ a i ) + b ] ⩾ 1 − ξ i , i = 1 , . . . , l 。 ξ i y_i[(\omega\cdot a_i)+b]\geqslant1-\xi_i,i=1,...,l。\xi_i yi[(ωai)+b]1ξi,i=1,...,lξi越大样本点越容易满足条件,为此在目标函数中引入惩罚参数 C C C避免 ξ i \xi_i ξi取太大,得到如下二次规划问题:
m i n   1 2 ∣ w ∣ 2 + C ∑ i = 1 l ξ i , s . t . { y i [ ( w T ⋅ a i ) + b ] ⩾ 1 − ξ i , ξ i ⩾ 0 ,       i = 1 , . . . , l 。 min\ \frac{1}{2}|w|^2+C\sum_{i=1}^l\xi_i,\\ s.t.\begin{cases} y_i[(w^T\cdot a_i)+b]\geqslant1-\xi_i,\\ \xi_i\geqslant0, \ \ \ \ \ i=1,...,l。 \end{cases} min 21w2+Ci=1lξi,s.t.{yi[(wTai)+b]1ξi,ξi0,     i=1,...,l
同样的将原问题转换成Lagrange对偶问题:
m a x   − 1 2 ∑ i = 1 l ∑ j = 1 l y i y j α i α j ( a i ⋅ a j ) + ∑ i = 1 l α i , s . t . { ∑ i = 1 l y i α i = 0 , 0 ⩽ α i ⩽ C , i = 1 , . . . , l 。 max\ -\frac{1}{2}\sum_{i=1}^l\sum_{j=1}^{l}y_iy_j\alpha_i\alpha_j(a_i\cdot a_j)+\sum_{i=1}^{l}\alpha_i,\\ s.t.\begin{cases} \sum_{i=1}^{l}y_i\alpha_i=0,\\ 0\leqslant\alpha_i\leqslant C,i=1,...,l。 \end{cases} max 21i=1lj=1lyiyjαiαj(aiaj)+i=1lαi,s.t.{i=1lyiαi=0,0αiC,i=1,...,l
求解上述最优化问题,得到最优解 α ∗ = [ α 1 ∗ , . . . , α l ∗ ] T , \alpha^*=[\alpha_1^*,...,\alpha_l^*]^T, α=[α1,...,αl]T,计算
w ∗ = ∑ i = 1 l α i ∗ y i a i , b ∗ = y j − ∑ i = 1 l y i α i ∗ ( a i ⋅ a j ) 。 w^*=\sum_{i=1}^l\alpha_i^*y_ia_i,\\ b^*=y_j-\sum_{i=1}^ly_i\alpha_i^*(a_i\cdot a_j)。 w=i=1lαiyiai,b=yji=1lyiαi(aiaj)

MATLAB代码实例

%采用了SMO算法,随机选取α,第一个α是按顺序遍历所有的α,第二个α是在剩下的α中在随机选一个。当第二个α选了iter次还没有发现不满足KKT条件的,就退出循环。同样的,可以用quadprog计算omega,b
clc,clear;
load('SVM.mat');
data=SVM.VarName1(:);
data=[data SVM.VarName2(:)];
label=SVM.VarName3(:);
[num_data,d] = size(data);
alphas=zeros(num_data,1);
b=0;C=10;
iter=0;max_iter=40;
while iter < max_iter
    alpha_change = 0;
    for i = 1:num_data
        pre_Li = (alphas.*label)'*(data*data(i,:)') + b;
        Ei = pre_Li - label(i);
        if (label(i)*Ei<-0.001 && alphas(i)0.001 && alphas(i)>0)
            j = randi(num_data,1);
            if j == i
                temp = 1;
                while temp
                    j = randi(num_data,1);
                    if j ~= i
                        temp = 0;
                    end
                end
            end
            pre_Lj = (alphas.*label)'*(data*data(j,:)') + b;
            Ej = pre_Lj - label(j);
            if label(i) ~= label(j)
                L = max(0,alphas(j) - alphas(i));
                H = min(C,C + alphas(j) - alphas(i));
            else
                L = max(0,alphas(j) + alphas(i) -C);
                H = min(C,alphas(j) + alphas(i));
            end
            if L==H
                continue;end
            eta = 2*data(i,:)*data(j,:)'- data(i,:)*data(i,:)' - ...
                data(j,:)*data(j,:)';
            alphasI_old = alphas(i);
            alphasJ_old = alphas(j);
            alphas(j) = alphas(j) - label(j)*(Ei-Ej)/eta;
            if alphas(j) > H
                alphas(j) = H;
            elseif alphas(j) < L
                alphas(j) = L;
            end
            if abs(alphas(j) - alphasJ_old)<1e-4
                continue;end
            alphas(i) = alphas(i) + label(i)*label(j)*(alphasJ_old-alphas(j));
            b1 = b - Ei - label(i)*(alphas(i)-alphasI_old)*data(i,:)*data(i,:)'-...
                label(j)*(alphas(j)-alphasJ_old)*data(i,:)*data(j,:)';
            b2 = b - Ej - label(i)*(alphas(i)-alphasI_old)*data(i,:)*data(j,:)'-...
                label(j)*(alphas(j)-alphasJ_old)*data(j,:)*data(j,:)';
            if alphas(i)>0 && alphas(i)0 && alphas(j)
                                
                                
  • Oracle将零干预分析加入网络即服务计划 蓝儿唯美 oracle
    由Oracle通信技术部门主导的演示项目并没有在本月较早前法国南斯举行的行业集团TM论坛大会中获得嘉奖。但是,Oracle通信官员解雇致力于打造一个支持零干预分配和编制功能的网络即服务(NaaS)平台,帮助企业以更灵活和更适合云的方式实现通信服务提供商(CSP)的连接产品。这个Oracle主导的项目属于TM Forum Live!活动上展示的Catalyst计划的19个项目之一。Catalyst计
  • spring学习——springmvc(二) a-john springMVC
    Spring MVC提供了非常方便的文件上传功能。 1,配置Spring支持文件上传: DispatcherServlet本身并不知道如何处理multipart的表单数据,需要一个multipart解析器把POST请求的multipart数据中抽取出来,这样DispatcherServlet就能将其传递给我们的控制器了。为了在Spring中注册multipart解析器,需要声明一个实现了Mul
  • POJ-2828-Buy Tickets aijuans ACM_POJ
    POJ-2828-Buy Tickets http://poj.org/problem?id=2828 线段树,逆序插入 #include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;#define N 200010struct
  • Java Ant build.xml详解 asia007 build.xml
    1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为ant是使用java实现的,所以它跨平台使用简单--与ant的兄弟make比起来语法清晰--同样是和make相比功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有
  • android按钮监听器的四种技术 百合不是茶 androidxml配置监听器实现接口
    android开发中经常会用到各种各样的监听器,android监听器的写法与java又有不同的地方;    1,activity中使用内部类实现接口 ,创建内部类实例  使用add方法  与java类似   创建监听器的实例 myLis lis = new myLis();   使用add方法给按钮添加监听器  
  • 软件架构师不等同于资深程序员 bijian1013 程序员架构师架构设计
            本文的作者Armel Nene是ETAPIX Global公司的首席架构师,他居住在伦敦,他参与过的开源项目包括 Apache Lucene,,Apache Nutch, Liferay 和 Pentaho等。         如今很多的公司
  • TeamForge Wiki Syntax & CollabNet User Information Center sunjing TeamForgeHow doAttachementAnchorWiki Syntax
    the CollabNet user information center http://help.collab.net/   How do I create a new Wiki page? A CollabNet TeamForge project can have any number of Wiki pages. All Wiki pages are linked, and
  • 【Redis四】Redis数据类型 bit1129 redis
    概述 Redis是一个高性能的数据结构服务器,称之为数据结构服务器的原因是,它提供了丰富的数据类型以满足不同的应用场景,本文对Redis的数据类型以及对这些类型可能的操作进行总结。 Redis常用的数据类型包括string、set、list、hash以及sorted set.Redis本身是K/V系统,这里的数据类型指的是value的类型,而不是key的类型,key的类型只有一种即string
  • SSH2整合-附源码 白糖_ eclipsespringtomcatHibernateGoogle
    今天用eclipse终于整合出了struts2+hibernate+spring框架。 我创建的是tomcat项目,需要有tomcat插件。导入项目以后,鼠标右键选择属性,然后再找到“tomcat”项,勾选一下“Is a tomcat project”即可。具体方法见源码里的jsp图片,sql也在源码里。     补充1:项目中部分jar包不是最新版的,可能导
  • [转]开源项目代码的学习方法 braveCS 学习方法
    转自: http://blog.sina.com.cn/s/blog_693458530100lk5m.html http://www.cnblogs.com/west-link/archive/2011/06/07/2074466.html   1)阅读features。以此来搞清楚该项目有哪些特性2)思考。想想如果自己来做有这些features的项目该如何构架3)下载并安装d
  • 编程之美-子数组的最大和(二维) bylijinnan 编程之美
    package beautyOfCoding; import java.util.Arrays; import java.util.Random; public class MaxSubArraySum2 { /** * 编程之美 子数组之和的最大值(二维) */ private static final int ROW = 5; private stat
  • 读书笔记-3 chengxuyuancsdn jquery笔记resultMap配置ibatis一对多配置
    1、resultMap配置 2、ibatis一对多配置 3、jquery笔记 1、resultMap配置 当<select resultMap="topic_data"> <resultMap id="topic_data">必须一一对应。 (1)<resultMap class="tblTopic&q
  • [物理与天文]物理学新进展 comsci
          如果我们必须获得某种地球上没有的矿石,才能够进行某些能量输出装置的设计和建造,而要获得这种矿石,又必须首先进行深空探测,而要进行深空探测,又必须获得这种能量输出装置,这个矛盾的循环,会导致地球联盟在与宇宙文明建立关系的时候,陷入困境       怎么办呢?  
  • Oracle 11g新特性:Automatic Diagnostic Repository daizj oracleADR
    Oracle Database 11g的FDI(Fault Diagnosability Infrastructure)是自动化诊断方面的又一增强。 FDI的一个关键组件是自动诊断库(Automatic Diagnostic Repository-ADR)。 在oracle 11g中,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。 这两份log文
  • 简单排序:选择排序 dieslrae 选择排序
    public void selectSort(int[] array){ int select; for(int i=0;i<array.length;i++){ select = i; for(int k=i+1;k<array.leng
  • C语言学习六指针的经典程序,互换两个数字 dcj3sjt126com c
    示例程序,swap_1和swap_2都是错误的,推理从1开始推到2,2没完成,推到3就完成了 # include <stdio.h> void swap_1(int, int); void swap_2(int *, int *); void swap_3(int *, int *); int main(void) { int a = 3; int b =
  • php 5.4中php-fpm 的重启、终止操作命令 dcj3sjt126com PHP
    php 5.4中php-fpm 的重启、终止操作命令: 查看php运行目录命令:which php/usr/bin/php 查看php-fpm进程数:ps aux | grep -c php-fpm 查看运行内存/usr/bin/php  -i|grep mem 重启php-fpm/etc/init.d/php-fpm restart 在phpinfo()输出内容可以看到php
  • 线程同步工具类 shuizhaosi888 同步工具类
    同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch)   闭锁(CountDownLatch) public class RunMain { public long timeTasks(int nThreads, final Runnable task) throws InterruptedException { fin
  • bleeding edge是什么意思 haojinghua DI
    不止一次,看到很多讲技术的文章里面出现过这个词语。今天终于弄懂了——通过朋友给的浏览软件,上了wiki。  我再一次感到,没有辞典能像WiKi一样,给出这样体贴人心、一清二楚的解释了。为了表达我对WiKi的喜爱,只好在此一一中英对照,给大家上次课。   In computer science, bleeding edge is a term that
  • c中实现utf8和gbk的互转 jimmee ciconvutf8&gbk编码
    #include <iconv.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> int code_c
  • 大型分布式网站架构设计与实践 lilin530 应用服务器搜索引擎
    1.大型网站软件系统的特点? a.高并发,大流量。 b.高可用。 c.海量数据。 d.用户分布广泛,网络情况复杂。 e.安全环境恶劣。 f.需求快速变更,发布频繁。 g.渐进式发展。 2.大型网站架构演化发展历程? a.初始阶段的网站架构。 应用程序,数据库,文件等所有的资源都在一台服务器上。 b.应用服务器和数据服务器分离。 c.使用缓存改善网站性能。 d.使用应用
  • 在代码中获取Android theme中的attr属性值 OliveExcel androidtheme
    Android的Theme是由各种attr组合而成, 每个attr对应了这个属性的一个引用, 这个引用又可以是各种东西.   在某些情况下, 我们需要获取非自定义的主题下某个属性的内容 (比如拿到系统默认的配色colorAccent), 操作方式举例一则: int defaultColor = 0xFF000000; int[] attrsArray = { andorid.r.
  • 基于Zookeeper的分布式共享锁 roadrunners zookeeper分布式共享锁
    首先,说说我们的场景,订单服务是做成集群的,当两个以上结点同时收到一个相同订单的创建指令,这时并发就产生了,系统就会重复创建订单。等等......场景。这时,分布式共享锁就闪亮登场了。   共享锁在同一个进程中是很容易实现的,但在跨进程或者在不同Server之间就不好实现了。Zookeeper就很容易实现。具体的实现原理官网和其它网站也有翻译,这里就不在赘述了。   官
  • 两个容易被忽略的MySQL知识 tomcat_oracle mysql
    1、varchar(5)可以存储多少个汉字,多少个字母数字?   相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。   这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0
  • zoj 3827 Information Entropy(水题) 阿尔萨斯 format
    题目链接:zoj 3827 Information Entropy 题目大意:三种底,计算和。 解题思路:调用库函数就可以直接算了,不过要注意Pi = 0的时候,不过它题目里居然也讲了。。。limp→0+plogb(p)=0,因为p是logp的高阶。 #include <cstdio> #include <cstring> #include <cmath&