转自:http://www.cnblogs.com/yuwenchao/archive/2011/10/28/csvc.html

本文讨论对于一般的分类问题,线性支持向量分类机(C-SVC)的实现原理及MATLAB代码实现。

  由于需要处理线性不可分问题,我们没法找到一个超平面可以完全正确的分化训练集,因此需要“软化”一些条件。由标准的支持向量机(SVM)的最大间隔法所导出的约束条件可以进行如下的“软化”:

      yi((w·xi)+b) ≥ 1-ξi , i = 1, 2, ... , n

  当ξi足够大时,训练点(yi, xi)总是可以满足条件的,所以我们不能让ξi太大,因此得给ξi一个惩罚系数,所以C-SVC的原问题可以归纳如下:

minω,b,ξ  1/2||ω||+ CΣξi   

       s.t.  yi((w·xi)+b) ≥ 1-ξi , i = 1, 2, ... , n

ξ≥ 0i = 1, 2, ... , n      

  根据原问题,我们可以得到如下的对偶问题:

minα  1/2αTHα-eTα       

s.t.  αTy = 0       

0 ≤ α ≤ C    

  其中,H = ΣΣyiyj(xxj), i = 1, 2, ... , n, j = 1, 2, ... , n,α = (α1, α2, ... , αn),y = (y1, y2, ... , yn)。

  对于得到的对偶问题,我们可以用函数quadprog()对这个凸二次规划问题进行相应的求解,所得到的结果即为α的解。代码如下:

 1 % 选定适当的惩罚系数 2 C = 1.95; 3  4 % 实验数据heartData的存储格式为第一列是正负类的标记,其他列为属性 5 % 根据具体情况对y和X进行赋值 6 y = heartData(:,1); 7 X = heartData(:,2:end); 8  9 % 记录数据的规模:样本数*属性维数10 numbers = size(X);11 12 % 求维数为“样本数*样本数”的矩阵13 H = zeros(numbers(1),numbers(1));14 for i = 1:numbers(1)15     for j = 1:numbers(1)16         H(i,j) = y(i)*y(j)*X(i,:)*X(j,:)';17     end18 end19 20 % 以下是几个约束:21 % Aeq 线性等式约束的矩阵22 % beq 线性等式约束的向量23 % f 向量24 % lb 存储下界的向量25 % ub 存储上界的向量26 Aeq = y';27 beq = 0;28 f = -ones(numbers(1), 1);29 lb = zeros(numbers(1), 1);30 ub = C * ones(numbers(1), 1);31  32 % 计算拉格朗日乘子,返回向量x,即拉格朗日乘子33 [x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],Aeq,beq,lb, ub, [], optimset('LargeScale','off','MaxIter', 500));34  35 % 将x中小于一定阀值的数置为零(机器误差)36 for j = 1:numbers(1)37     if(x(j) < 0.001)38         x(j) = 0;39     end40 end

  接下来我们需要计算b的值。由于在求对偶问题的过程中,我们知道ω = Σαiyix, i = 1, 2, ... , n。所以b = yjTxj。在这里需要注意的是αj取(0, C)之间的数的时候,所得到的b是唯一的(具体证明在以后的随笔中会介绍)。因此我们可以得到划分的超平面 ωTx+b = 0。所以决策函数为 f(x) = sgn( ωTx+b)。求b以及决策函数的代码如下:

 1 % 计算向量w的值 2 w = zeros(1,numbers(2)); 3 for i = 1:numbers(1) 4     w = w + y(i)*x(i)*X(i,:); 5 end 6  7 % 计算b的值(这里计算每一个y对应的b的值) 8 b = zeros(numbers(1), 1); 9 for i = 1:numbers(1)10     if(x(i) > 0 && x(i) < C)11         b(i) = y(i) - w*X(i,:)';12     end13 end14 % 将b中小于一定阀值的数置为零(机器误差)15 for j = 1:numbers(1)16     if(abs(b(j)) < 0.001)17         b(j) = 0;18     end19 end20 % 由于计算的原因,b不一定总是相等,所以这里取b的值为最大和最小值的均值21 bNonZero = find( b ~= 0 );22 bval = 1/2*(max(b(bNonZero)) + min(b(bNonZero)));23  24 %% 测试:通过已经求出来的判别函数对数据进行分类的错误率分析25 26 % 记录分类正确的数目27 correctNumbers = 0;28 % 记录通过判别函数计算的结果29 result = zeros(numbers(1),1);30 for i = 1:numbers(1)31     result(i) = w*X(i,:)' + bval;32     if(((result(i) > 0) && (y(i) == 1))||((result(i) < 0)&&(y(i) == -1)))33         correctNumbers = correctNumbers + 1;34     end35 end36 % 输出正确率37 disp (correctNumbers/numbers(1))

  上面代码中的测试正确率是这样进行计算的,将得到的决策函数在原始的训练集中跑一遍,因为是线性不可分的,所以不可能完全划分正确,我们将正确的数目除以总的样本数就得到一个简单正确率的计算,需要说明的是,要测试决策函数的好坏,判断C的选取,应该使用LOOCV等方法。


问题与思考:

1. 我曾采用的二维测试数据集为:

y = [1;1;1;1;1;-1;-1;-1;-1;-1];

X1 = [1.5 15;0.2 11;0.3 17;4 1;2 20;-10 -21;-2 -1;-15 -11;-1.4 -1;-2 -6.20];

X2 = [1.5 15;0.2 11;0.3 17;4 1;2 20;-10 -21;-2 -1;0.7 13;-1.4 -1;-2 -6.20];

其中X1是线性可分的情况、X2是线性不可分的情况。

对于数据集(y,X1)得到的结果如下图所示,有两个支持向量(第四个和第八个)。此时b不为零的取值为-0.4188和-0.4252。

对于数据集(y,X2)得到的结果如下图所示,有五个支持向量(第二、三、四、八和第九个)。此时b不为零的取值均为-0.4435。

所以我特别好奇为什么在前一个数据集上的测试中,得到的b不唯一。带着这个问题,我将不同的b的值都画出了相应的直线,得到了几乎重合的直线,因此我的解释是机器误差产生的,但是不知道这样解释靠不靠谱。这个问题还会继续去看看有没有办法解决。

2. 对于线性不可分问题的最大间隔法有理论基础吗?因为此时已经没有间隔了...

转载于:https://www.cnblogs.com/phoenixzq/archive/2011/10/29/2228449.html

线性支持向量分类机及其实现相关推荐

  1. 基于DDTBOX,使用线性支持向量回归(SVR)从ERP数据中解码连续变量

    导读 事件相关电位(ERP)数据的多变量分类分析是预测认知变量的强大工具.然而,分类通常仅限于分类变量,并未充分利用连续数据,如反应时间.反应力或主观评分.另一种方法是支持向量回归(SVR),它使用单 ...

  2. 支持向量分类机---乳腺癌的诊断

    %原始数据cancerdata.txt可在网上下载,数据中的B替换成1,M替换成-1,X替换成2,删除了分割符*,替换后的数据命名成cancerdata2.txt clc,clear a=load(' ...

  3. ❤️解决非线性回归问题的机器学习方法总结:多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型

    文章目录 前言 多项式回归模型 概念解释: sklearn实现多项式回归模型: 广义线性可加(GAM)模型 概念解释: pygam实现广义线性可加模型: GAM模型的优点与不足: 回归树模型 概念解释 ...

  4. 支持向量回归_量化投资学习笔记22——回归分析:支持向量机

    支持向量机(Support Vector Machine, SVM)是一种基于统计学习的模式识别的分类方法,主要用于模式识别.所谓支持向量指的是在分割区域边缘的训练样本点,机是指算法.就是要找到具有最 ...

  5. 支持向量机原理(五)线性支持回归

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

  6. 支持向量所在超平面方程_支持向量机通俗导论:理解SVM的三层境界(一)

    前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清 ...

  7. 核聚类与支持向量聚类

    核聚类与支持向量聚类 聚类是数据挖掘中用来发现数据分布和隐含模式的一项重要技术[1].作为一种常见的数据分析工具和无监督机器学习方法,聚类的目的是把数据集合分成若干类(或簇),使得每个类中的数据之间最 ...

  8. svr公式推导_支持向量回归(SVR)的详细介绍以及推导算法

    1 SVR背景 2 SVR原理 3 SVR数学模型 SVR的背景 SVR做为SVM的分支从而被提出,一张图介绍SVR与SVM的关系 这里两虚线之间的几何间隔r=d ∣ ∣ W ∣ ∣ \frac{d} ...

  9. 迈向数据科学的第一步:在Python中支持向量回归

    什么是支持向量回归? (What is Support Vector Regression?) Support vector regression is a special kind of regre ...

  10. 支持向量所在超平面方程_深入浅出机器学习算法:支持向量机

    原理 分类学习最基本的思想就是基于训练集 在样本空间中找到一个划分超平面,将不同类别的样本区分开.但是事实上,能将训练样本划分开的超平面可能有很多,如下图所示,我们的任务就是寻找到最优的划分超平面. ...

最新文章

  1. Java Execution Process
  2. python 多进程异常处理
  3. 坐标系转换公式_【技术】西安80坐标与地方坐标系的转换方法技巧
  4. python google drive api_使用google-drive-api python获取文件的链接
  5. 思考 | 沈向洋博士:三十年科研路,我踩过的那些坑
  6. scp上传服务器加特殊端口
  7. 数据:灰度增持3594枚LTC和1.43万枚LINK
  8. selenium ie 模拟request pahonjs
  9. Linux内存分配小结--malloc、brk、mmap【转】
  10. Qi v1.2.4 -- WPC官方文档资源下载
  11. php 模块不存在,模块不存在:index.php?
  12. webstorm配置vue模板 webstorm快速生成vue模板
  13. mysql课程表设计_MySQL如何设计课程表的数据库
  14. exlc表格怎么换行_excel表格怎么设置文字自动换行
  15. 手机5g什么时候普及_5G牌照发放仨月,5G手机扎堆上市,何时才能真正普及?
  16. 在本地电脑运行vue-element-admin
  17. 31 个惊艳的数据可视化作品,让你感受 数据之美!
  18. 在 Jetpack Compose 中安全地使用数据流
  19. java 获取时间的方法
  20. 2012年01月硕士学位毕业生论文目录

热门文章

  1. SSH: scp 拉取云端文件到本地端
  2. (转)洞见 | 为什么银行不愿意坐上Fintech这列过山车?
  3. 如何为开源项目做市场
  4. 【三维路径规划】基于matlab麻雀算法求解无人机三维路径规划问题【含Matlab源码 212期】
  5. 【背包问题】基于matlab萤火虫算法求解背包问题【含Matlab源码 1440期】
  6. 【运动学】基于matlab质点极坐标系中运动规律(螺旋运动)【含Matlab源码 977期】
  7. 【心电信号】基于matlab心电信号去除基线漂移【含Matlab源码 955期】
  8. 查看jdk版本命令_JDK配置和Eclipse安装
  9. html 数据库 编写学生表,【数据库】用sql语句创建学生表如何做
  10. java皮卡丘代码_Picachu代码源代码,皮卡丘,源码