1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 简单易学的机器学习算法——非线性支持向量机

简单易学的机器学习算法——非线性支持向量机

时间:2024-03-24 19:17:27

相关推荐

简单易学的机器学习算法——非线性支持向量机

一、回顾

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

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

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

以及分类决策函数:

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

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

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

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

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

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

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

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

2、常用核函数

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

三、非线性支持向量机

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

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

3、构造决策函数

四、实验仿真

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

(原始空间中的图像)

MATLAB代码 主程序

%% 非线性支持向量机% 清空内存clear all;clc;% 导入测试数据A = load('testSetRBF.txt');%% 区分开训练数据与测试数据m = size(A);%得到整个数据集的大小trainA = A(11:m(1,1),:);testA = A(1:10,:);% 训练和测试数据集的大小mTrain = size(trainA);mTest = size(testA);% 区分开特征与标签Xtrain = trainA(:,1:2);Ytrain = trainA(:,mTrain(1,2))';Xtest = testA(:,1:2);Ytest = testA(:,mTest(1,2))';%% 对偶问题,用二次规划来求解,以求得训练模型sigma = 0.5;%高斯核中的参数H = zeros(mTrain(1,1),mTrain(1,1));for i = 1:mTrain(1,1)for j = 1:mTrain(1,1)H(i,j) = GaussianKernalFunction(Xtrain(i,:),Xtrain(j,:),sigma);H(i,j) = H(i,j)*Ytrain(i)*Ytrain(j);endendf = ones(mTrain(1,1),1)*(-1);B = Ytrain;b = 0;lb = zeros(mTrain(1,1),1);% 调用二次规划的函数[x,fval,exitflag,output,lambda] = quadprog(H,f,[],[],B,b,lb);% 定义CC = max(x);% 求解原问题n = size(x);k = 1;for i = 1:n(1,1)Kernel = zeros(n(1,1),1);if x(i,1) > 0 && x(i,1)<Cfor j = 1:n(1,1)Kernel(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtrain(i,:),sigma);Kernel(j,:) = Kernel(j,:)*Ytrain(j);endb(k,1) = Ytrain(1,i)-x'*Kernel;k = k +1;endendb = mean(b);%% 决策函数来验证训练准确性trainOutput = zeros(mTrain(1,1),1);for i = 1:mTrain(1,1)Kernel_train = zeros(mTrain(1,1),1);for j = 1:mTrain(1,1)Kernel_train(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtrain(i,:),sigma);Kernel_train(j,:) = Kernel_train(j,:)*Ytrain(j);endtrainOutput(i,1) = x'*Kernel_train+b;endfor i = 1:mTrain(1,1)if trainOutput(i,1)>0trainOutput(i,1)=1;elseif trainOutput(i,1)<0trainOutput(i,1)=-1;endend% 统计正确个数countTrain = 0;for i = 1:mTrain(1,1)if trainOutput(i,1) == Ytrain(i)countTrain = countTrain+1;endendtrainCorrect = countTrain./mTrain(1,1);%% 决策函数来验证测试准确性testOutput = zeros(mTest(1,1),1);for i = 1:mTest(1,1)Kernel_test = zeros(mTrain(1,1),1);for j = 1:mTrain(1,1)Kernel_test(j,:) = GaussianKernalFunction(Xtrain(j,:),Xtest(i,:),sigma);Kernel_test(j,:) = Kernel_test(j,:)*Ytrain(j);endtestOutput(i,1) = x'*Kernel_train+b;endfor i = 1:mTest(1,1)if testOutput(i,1)>0testOutput(i,1)=1;elseif testOutput(i,1)<0testOutput(i,1)=-1;endend% 统计正确个数countTest = 0;for i = 1:mTest(1,1)if testOutput(i,1) == Ytest(i)countTest = countTest+1;endendtestCorrect = countTest./mTest(1,1);disp(['训练的准确性:',num2str(trainCorrect)]);disp(['测试的准确性:',num2str(testCorrect)]);

核函数

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

最终的结果为:

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。