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

本文深入探讨了非线性支持向量机(SVM)的原理及应用,介绍了如何通过核技巧解决非线性分类问题,并给出了MATLAB实现的具体步骤与结果分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、回顾

    前面三篇博文主要介绍了支持向量机的基本概念,线性可分支持向量机的原理以及线性支持向量机的原理,线性可分支持向量机是线性支持向量机的基础。对于线性支持向量机,选择一个合适的惩罚参数,并构造凸二次规划问题:



求得原始问题的对偶问题的最优解,由此可求出原始问题的最优解:


其中中满足的分量。这样便可以求得分离超平面

以及分类决策函数:

    线性可分支持向量机算法是线性支持向量机算法的特殊情况。

二、非线性问题的处理方法

    在处理非线性问题时,可以通过将分线性问题转化成线性问题,并通过已经构建的线性支持向量机来处理。如下图所示:

(非线性转成线性问题)
(图片摘自:http://www.cnblogs.com/gghost/archive/2013/09/02/3296297.html)
通过一种映射可以将输入空间转换到对应的特征空间,体现在特征空间中的是对应的线性问题。核技巧就可以完成这样的映射工作。

1、核函数的定义(摘自《统计机器学习》)

   设是输入空间(欧式空间的子集或离散集合),又设为特征空间(希尔伯特空间),如果存在一个从的映射

使得对所有,函数满足条件

则称为核函数,为映射函数。
   在实际的问题中,通常使用已有的核函数。

2、常用核函数

  • 多项式核函数(Polynomial Kernel Function)
  • 高斯核函数(Gaussian Kernel Function)

三、非线性支持向量机

    1、选取适当的核函数和适当的参数,构造原始问题的对偶问题:


求得对应的最优解
    2、选择的一个满足的分量,求:

    3、构造决策函数

四、实验仿真

    对于非线性可分问题,其图像为:

(原始空间中的图像)

MATLAB代码
主程序
  1. %% 非线性支持向量机  
  2.   
  3. % 清空内存  
  4. clear all;  
  5. clc;  
  6.   
  7. % 导入测试数据  
  8. A = load('testSetRBF.txt');  
  9.   
  10. %% 区分开训练数据与测试数据  
  11. m = size(A);%得到整个数据集的大小  
  12. trainA = A(11:m(1,1),:);  
  13. testA = A(1:10,:);  
  14.   
  15. % 训练和测试数据集的大小  
  16. mTrain = size(trainA);  
  17. mTest = size(testA);  
  18.   
  19. % 区分开特征与标签  
  20. Xtrain = trainA(:,1:2);  
  21. Ytrain = trainA(:,mTrain(1,2))';  
  22. Xtest = testA(:,1:2);  
  23. Ytest = testA(:,mTest(1,2))';  
  24.   
  25. %% 对偶问题,用二次规划来求解,以求得训练模型  
  26. sigma = 0.5;%高斯核中的参数  
  27. H = zeros(mTrain(1,1),mTrain(1,1));  
  28. for i = 1:mTrain(1,1)  
  29.     for j = 1:mTrain(1,1)  
  30.         H(i,j) = GaussianKernalFunction(Xtrain(i,:),Xtrain(j,:),sigma);  
  31.         H(i,j) = H(i,j)*Ytrain(i)*Ytrain(j);  
  32.     end  
  33. end  
  34.   
  35. f = ones(mTrain(1,1),1)*(-1);  
  36. B = Ytrain;  
  37. b = 0;  
  38. lb = zeros(mTrain(1,1),1);  
  39. % 调用二次规划的函数  
  40. [x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],B,b,lb);  
  41.   
  42. % 定义C  
  43. C = max(x);  
  44.   
  45. % 求解原问题  
  46. n = size(x);  
  47. k = 1;  
  48. for i = 1:n(1,1)  
  49.     Kernel = zeros(n(1,1),1);  
  50.     if x(i,1) > 0 && x(i,1)<C  
  51.         for j = 1:n(1,1)  
  52.             Kernel(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtrain(i,:),sigma);  
  53.             Kernel(j,:) = Kernel(j,:)*Ytrain(j);  
  54.         end  
  55.         b(k,1) = Ytrain(1,i)-x'*Kernel;  
  56.         k = k +1;  
  57.     end  
  58. end  
  59. b = mean(b);  
  60.   
  61.   
  62. %% 决策函数来验证训练准确性  
  63. trainOutput = zeros(mTrain(1,1),1);  
  64. for i = 1:mTrain(1,1)  
  65.     Kernel_train = zeros(mTrain(1,1),1);  
  66.       
  67.     for j = 1:mTrain(1,1)  
  68.         Kernel_train(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtrain(i,:),sigma);  
  69.         Kernel_train(j,:) = Kernel_train(j,:)*Ytrain(j);  
  70.     end  
  71.     trainOutput(i,1) = x'*Kernel_train+b;  
  72. end  
  73.   
  74. for i = 1:mTrain(1,1)  
  75.     if trainOutput(i,1)>0  
  76.         trainOutput(i,1)=1;  
  77.     elseif trainOutput(i,1)<0  
  78.         trainOutput(i,1)=-1;  
  79.     end  
  80. end  
  81.   
  82. % 统计正确个数  
  83. countTrain = 0;  
  84. for i = 1:mTrain(1,1)  
  85.     if trainOutput(i,1) == Ytrain(i)  
  86.         countTrain = countTrain+1;  
  87.     end  
  88. end  
  89. trainCorrect = countTrain./mTrain(1,1);  
  90.   
  91. %% 决策函数来验证测试准确性  
  92. testOutput = zeros(mTest(1,1),1);  
  93. for i = 1:mTest(1,1)  
  94.     Kernel_test = zeros(mTrain(1,1),1);  
  95.       
  96.     for j = 1:mTrain(1,1)  
  97.         Kernel_test(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtest(i,:),sigma);  
  98.         Kernel_test(j,:) = Kernel_test(j,:)*Ytrain(j);  
  99.     end  
  100.     testOutput(i,1) = x'*Kernel_train+b;  
  101. end  
  102.   
  103. for i = 1:mTest(1,1)  
  104.     if testOutput(i,1)>0  
  105.         testOutput(i,1)=1;  
  106.     elseif testOutput(i,1)<0  
  107.         testOutput(i,1)=-1;  
  108.     end  
  109. end  
  110.   
  111. % 统计正确个数  
  112. countTest = 0;  
  113. for i = 1:mTest(1,1)  
  114.     if testOutput(i,1) == Ytest(i)  
  115.         countTest = countTest+1;  
  116.     end  
  117. end  
  118. testCorrect = countTest./mTest(1,1);  
  119.   
  120. disp(['训练的准确性:',num2str(trainCorrect)]);  
  121. disp(['测试的准确性:',num2str(testCorrect)]);  

核函数
  1. %% 高斯核函数,其中输入x和y都是行向量  
  2. function [ output ] = GaussianKernalFunction( x,y,sigma )  
  3.     output = exp(-(x-y)*(x-y)'./(2*sigma^2));  
  4. end  

最终的结果为:

注:在这个问题中,有两个参数需要调整,即核参数和惩罚参数,选取合适的参数对模型的训练起着很重要的作用。在程序中,我是指定的参数。这里的程序只是为帮助理解算法的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值