机器学习算法(分类算法)—支持向量机(3)

来源:互联网 发布:上海姑娘 知乎 编辑:程序博客网 时间:2024/05/16 23:40

一、线性支持向量机的概念

    线性支持向量机是针对线性不可分的数据集的,这样的数据集可以通过近似可分的方法实现分类。对于这样的数据集,类似线性可分支持向量机,通过求解对应的凸二次规划问题,也同样求得分离超平面

以及相应的分类决策函数

二、与线性可分支持向量机的比较

    线性支持向量机与线性可分支持向量机最大的不同就是在处理的问题上,线性可分支持向量机处理的是严格线性可分的数据集,而线性支持向量机处理的是线性不可分的数据集,然而,在基本的原理上他们却有着想通之处。这里的线性不可分是指数据集中存在某些点不能满足线性可分支持向量机的约束条件:
    具体来讲,对于特征空间上的训练数据集,且不是线性可分的,即存在某些特异点不满足的约束条件,若将这些特异点去除,那么剩下的数据点是线性可分的,由此可见,线性可分支持向量机是线性支持向量机的特殊情况。为了解决这样的问题,对每个样本点引入一个松弛变量,且,则上述的约束条件被放宽,即:

此时目标函数变为:

其中称为惩罚参数,且在线性支持向量机中加入了惩罚项,与线性可分支持向量的应间隔最大化相对应,在线性支持向量机中称为软间隔最大化。

三、线性支持向量机的原理

    由上所述,我们得到线性支持向量机的原始问题:


接下来的问题就变成如何求解这样一个最优化问题(称为原始问题)。引入拉格朗日函数:

其中,
    此时,原始问题即变成

利用拉格朗日函数的对偶性,将问题变成一个极大极小优化问题:

    首先求解,将拉格朗日函数分别对求偏导,并令其为0:

即为:

将其带入拉格朗日函数,即得:

    第二步,求,即求:


可得,因为在第二步求极大值的过程中,函数只与有关。
    将上述的极大值为题转化为极小值问题:


这就是原始问题的对偶问题。

四、线性支持向量机的过程

1、设置惩罚参数,并求解对偶问题:



假设求得的最优解为

2、计算原始问题的最优解:


选择中满足的分量,计算:

3、求分离超平面和分类决策函数:

分离超平面为:

分类决策函数为:

五、实验的仿真

1、解决线性可分问题

    与上一篇博文实验一样,其中中的最大值。
MATLAB代码为
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. %% 线性支持向量机  
  2.   
  3. % 清空内存  
  4. clear all;  
  5. clc;  
  6.   
  7. %简单的测试数据集  
  8. X = [3,3;4,3;1,1];  
  9. y = [1,1,-1];%标签  
  10. A = [X,y'];  
  11.   
  12. m = size(A);%得到训练数据的大小  
  13.   
  14.   
  15. % 区分开特征与标签  
  16. X = A(:,1:2);  
  17. Y = A(:,m(1,2))';  
  18.   
  19. for i = 1:m(1,1)  
  20.     X(i,:) = X(i,:)*Y(1,i);  
  21. end  
  22.   
  23.   
  24.   
  25. %% 对偶问题,用二次规划来求解  
  26. H = X*X';  
  27.   
  28. f = ones(m(1,1),1)*(-1);  
  29. B = Y;  
  30. b = 0;  
  31. lb = zeros(m(1,1),1);  
  32. % 调用二次规划的函数  
  33. [x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],B,b,lb);  
  34.   
  35. % 定义C  
  36. C = max(x);  
  37.   
  38. % 求原问题的解  
  39. n = size(x);  
  40. w = x' * X;  
  41.   
  42. k = 1;  
  43. for i = 1:n(1,1)  
  44.     if x(i,1) > 0 && x(i,1)<C  
  45.         b(k,1) = Y(1,i)-w*X(i,:)'*Y(1,i);  
  46.         k = k +1;  
  47.     end  
  48. end  
  49. b = mean(b);  
  50.   
  51. % 求出分离超平面  
  52.   
  53. y_1 = [0,4];  
  54. for i = 1:2  
  55.     y_2(1,i) = (-b-w(1,1)*y_1(1,i))./w(1,2);  
  56. end  
  57.   
  58. hold on  
  59. plot(y_1,y_2);  
  60. for i = 1:m(1,1)  
  61.     if A(i,m(1,2)) == -1  
  62.         plot(A(i,1),A(i,2),'og');  
  63.     elseif A(i,m(1,2)) == 1  
  64.         plot(A(i,1),A(i,2),'+r')  
  65.     end  
  66. end  
  67. axis([0,7,0,7])    
  68. hold off  

实验结果为:

(线性可分问题的分离超平面)

2、解决线性不可分问题

问题为:

(线性不可分问题)

MATLAB代码:
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. %% 线性支持向量机  
  2.   
  3. % 清空内存  
  4. clear all;  
  5. clc;  
  6.   
  7. % 导入测试数据  
  8. A = load('testSet.txt');  
  9.   
  10. % 处理数据的标签  
  11. m = size(A);%得到训练数据的大小  
  12. for i = 1:m(1,1)  
  13.     A(i,m(1,2)) = A(i,m(1,2))*2-1;  
  14. end  
  15.   
  16.   
  17.   
  18. % 区分开特征与标签  
  19. X = A(:,1:2);  
  20. Y = A(:,m(1,2))';  
  21.   
  22. for i = 1:m(1,1)  
  23.     X(i,:) = X(i,:)*Y(1,i);  
  24. end  
  25.   
  26.   
  27.   
  28. %% 对偶问题,用二次规划来求解  
  29. H = X*X';  
  30.   
  31. f = ones(m(1,1),1)*(-1);  
  32. B = Y;  
  33. b = 0;  
  34. lb = zeros(m(1,1),1);  
  35. % 调用二次规划的函数  
  36. [x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],B,b,lb);  
  37.   
  38. % 定义C  
  39. % C = mean(x);  
  40. C = max(x);  
  41.   
  42. % 求原问题的解  
  43. n = size(x);  
  44. w = x' * X;  
  45.   
  46. k = 1;  
  47. for i = 1:n(1,1)  
  48.     if x(i,1) > 0 && x(i,1)<C  
  49.         b(k,1) = Y(1,i)-w*X(i,:)'*Y(1,i);  
  50.         k = k +1;  
  51.     end  
  52. end  
  53. b = mean(b);  
  54.   
  55. % 求出分离超平面  
  56.   
  57. y_1 = [-4,4];  
  58. for i = 1:2  
  59.     y_2(1,i) = (-b-w(1,1)*y_1(1,i))./w(1,2);  
  60. end  
  61.   
  62. hold on  
  63. plot(y_1,y_2);  
  64. for i = 1:m(1,1)  
  65.     if A(i,m(1,2)) == -1  
  66.         plot(A(i,1),A(i,2),'og');  
  67.     elseif A(i,m(1,2)) == 1  
  68.         plot(A(i,1),A(i,2),'+r')  
  69.     end  
  70. end  
  71. hold off  

实验结果为:

(线性不可分问题的分离超平面)

注:这里的的取值很重要,的取值将决定分类结果的准确性。

0 0
原创粉丝点击