支持向量机和神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强。大量仿真证实,支持向量机的泛化能力强于神经网络,而且能避免神经网络的固有缺陷——训练结果不稳定。本源码可以用于线性回归、非线性回归、非线性函数拟合、数据建模、预测、分类等多种应用场合。

function [Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,TKF,Para1,Para2)
%%
% SVMNR.m
% Support Vector Machine for Nonlinear Regression
% All rights reserved
%%
% 支持向量机非线性回归通用程序
程序功能:
% 使用支持向量机进行非线性回归,得到非线性函数y=f(x1,x2,…,xn)的支持向量解析式,
% 求解二次规划时调用了优化工具箱的quadprog函数。本函数在程序入口处对数据进行了
% [-1,1]的归一化处理,所以计算得到的回归解析式的系数是针对归一化数据的,仿真测
% 试需使用与本函数配套的Regression函数。
% 输入参数列表
% X 输入样本原始数据,n×l的矩阵,n为变量个数,l为样本个数
% Y 输出样本原始数据,1×l的矩阵,l为样本个数
% Epsilon ε不敏感损失函数的参数,Epsilon越大,支持向量越少
% C 惩罚系数,C过大或过小,泛化能力变差
% TKF Type of Kernel Function 核函数类型
% TKF=1 线性核函数,注意:使用线性核函数,将进行支持向量机的线性回归
% TKF=2 多项式核函数
% TKF=3 径向基核函数
% TKF=4 指数核函数
% TKF=5 Sigmoid核函数
% TKF=任意其它值,自定义核函数
% Para1 核函数中的第一个参数
% Para2 核函数中的第二个参数
% 注:关于核函数参数的定义请见Regression.m和SVMNR.m内部的定义
% 输出参数列表
% Alpha1 α系数
% Alpha2 α*系数
% Alpha 支持向量的加权系数(α-α*)向量
% Flag 1×l标记,0对应非支持向量,1对应边界支持向量,2对应标准支持向量
% B 回归方程中的常数项
%--------------------------------------------------------------------------

%%
%-----------------------数据归一化处理--------------------------------------
nntwarn off
X=premnmx(X);
Y=premnmx(Y);
%%
%%
%-----------------------核函数参数初始化------------------------------------
switch TKF
case 1
%线性核函数 K=sum(x.*y)
%没有需要定义的参数
case 2
%多项式核函数 K=(sum(x.*y)+c)^p
c=Para1;%c=0.1;
p=Para2;%p=2;
case 3
%径向基核函数 K=exp(-(norm(x-y))^2/(2*sigma^2))
sigma=Para1;%sigma=6;
case 4
%指数核函数 K=exp(-norm(x-y)/(2*sigma^2))
sigma=Para1;%sigma=3;
case 5
%Sigmoid核函数 K=1/(1+exp(-v*sum(x.*y)+c))
v=Para1;%v=0.5;
c=Para2;%c=0;
otherwise
%自定义核函数,需由用户自行在函数内部修改,注意要同时修改好几处!
%暂时定义为 K=exp(-(sum((x-y).^2)/(2*sigma^2)))
sigma=Para1;%sigma=8;
end
%%
%%
%-----------------------构造K矩阵-------------------------------------------
l=size(X,2);
K=zeros(l,l);%K矩阵初始化
for i=1:l
for j=1:l
x=X(:,i);
y=X(:,j);
switch TKF%根据核函数的类型,使用相应的核函数构造K矩阵
case 1
K(i,j)=sum(x.*y);
case 2
K(i,j)=(sum(x.*y)+c)^p;
case 3
K(i,j)=exp(-(norm(x-y))^2/(2*sigma^2));
case 4
K(i,j)=exp(-norm(x-y)/(2*sigma^2));
case 5
K(i,j)=1/(1+exp(-v*sum(x.*y)+c));
otherwise
K(i,j)=exp(-(sum((x-y).^2)/(2*sigma^2)));
end
end
end
%%
%%
%------------构造二次规划模型的参数H,Ft,Aeq,Beq,lb,ub------------------------
%支持向量机非线性回归,回归函数的系数,要通过求解一个二次规划模型得以确定
Ft=[Epsilon*ones(1,l)-Y,Epsilon*ones(1,l)+Y];
Aeq=[ones(1,l),-ones(1,l)];
Beq=0;
ub=C*ones(2*l,1);
%%
%%
%--------------调用优化工具箱quadprog函数求解二次规划------------------------
OPT=optimset;
OPT.LargeScale='off';
OPT.Display='off';
%%
%%
%------------------------整理输出回归方程的系数------------------------------
Alpha1=(Gamma(1:l,1))';
Alpha2=(Gamma((l+1):end,1))';
Alpha=Alpha1-Alpha2;
Flag=2*ones(1,l);
%%
%%
%---------------------------支持向量的分类----------------------------------
Err=0.000000000001;
for i=1:l
AA=Alpha1(i);
BB=Alpha2(i);
if (abs(AA-0)<=Err)&&(abs(BB-0)<=Err)
Flag(i)=0;%非支持向量
end
if (AA>Err)&&(AA<C-ERR)&&(ABS(BB-0)<=ERR)
Flag(i)=2;%标准支持向量
end
if (abs(AA-0)<=Err)&&(BB>Err)&&(BB<C-ERR)
Flag(i)=2;%标准支持向量
end
if (abs(AA-C)<=Err)&&(abs(BB-0)<=Err)
Flag(i)=1;%边界支持向量
end
if (abs(AA-0)<=Err)&&(abs(BB-C)<=Err)
Flag(i)=1;%边界支持向量
end
end
%%
%%
%--------------------计算回归方程中的常数项B---------------------------------
B=0;
counter=0;
for i=1:l
AA=Alpha1(i);
BB=Alpha2(i);
if (AA>Err)&&(AA<C-ERR)&&(ABS(BB-0)<=ERR)
%计算支持向量加权值
SUM=0;
for j=1:l
if Flag(j)>0
switch TKF
case 1
SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));
case 2
SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+c)^p;
case 3
SUM=SUM+Alpha(j)*exp(-(norm(X(:,j)-X(:,i)))^2/(2*sigma^2));
case 4
SUM=SUM+Alpha(j)*exp(-norm(X(:,j)-X(:,i))/(2*sigma^2));
case 5
SUM=SUM+Alpha(j)*1/(1+exp(-v*sum(X(:,j).*X(:,i))+c));
otherwise
SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/(2*sigma^2)));
end
end
end
b=Y(i)-SUM-Epsilon;
B=B+b;
counter=counter+1;
end
if (abs(AA-0)<=Err)&&(BB>Err)&&(BB<C-ERR)
SUM=0;
for j=1:l
if Flag(j)>0
switch TKF
case 1
SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));
case 2
SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+c)^p;
case 3
SUM=SUM+Alpha(j)*exp(-(norm(X(:,j)-X(:,i)))^2/(2*sigma^2));
case 4
SUM=SUM+Alpha(j)*exp(-norm(X(:,j)-X(:,i))/(2*sigma^2));
case 5
SUM=SUM+Alpha(j)*1/(1+exp(-v*sum(X(:,j).*X(:,i))+c));
otherwise
SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/(2*sigma^2)));
end
end
end
b=Y(i)-SUM+Epsilon;
B=B+b;
counter=counter+1;
end
end
if counter==0
B=0;
else
B=B/counter;
end

function y=Regression(Alpha,Flag,B,X,Y,TKF,Para1,Para2,x)
%--------------------------------------------------------------------------
% Regression.m
% 与SVMNR.m函数配套使用的仿真测试函数
% 函数功能:
% 本函数相当于支持向量得到的回归方程的解析方程,输入一个待测试的列向量x,得到一
% 个对应的输出值y
%--------------------------------------------------------------------------
% 输入参数列表
% Alpha 支持向量的加权系数(α-α*)向量
% Flag 1×l标记,0对应非支持向量,1对应边界支持向量,2对应标准支持向量
% B 回归方程中的常数项
% X 输入样本原始数据,n×l的矩阵,n为变量个数,l为样本个数
% Y 输出样本原始数据,1×l的矩阵,l为样本个数
% Para1 核函数中的第一个参数
% Para2 核函数中的第二个参数
% 注:关于核函数参数的定义请见Regression.m和SVMNR.m内部的定义
% x 待测试的原始数据,n×1的列向量
% 输出参数列表
% y 仿真测试的输出值

%%
%-----------------------核函数参数初始化------------------------------------
switch TKF
case 1
%线性核函数 K=sum(x.*y)
%没有需要定义的参数
case 2
%多项式核函数 K=(sum(x.*y)+c)^p
c=Para1;%c=0.1;
p=Para2;%p=2;
case 3
%径向基核函数 K=exp(-(norm(x-y))^2/(2*sigma^2))
sigma=Para1;%sigma=6;
case 4
%指数核函数 K=exp(-norm(x-y)/(2*sigma^2))
sigma=Para1;%sigma=3;
case 5
%Sigmoid核函数 K=1/(1+exp(-v*sum(x.*y)+c))
v=Para1;%v=0.5;
c=Para2;%c=0;
otherwise
%自定义核函数,需由用户自行在函数内部修改,注意要同时修改好几处!
%暂时定义为 K=exp(-(sum((x-y).^2)/(2*sigma^2)))
sigma=Para1;%sigma=8;
end
%%
%%
%----------------------数据归一化处理---------------------------------------
[X,minX,maxX]=premnmx(X);
x=2*((x-minX)./(maxX-minX))-1;
[Y,minY,maxY]=premnmx(Y);
%%
%%
%---------------------计算仿真测试的输出值----------------------------------
l=length(Alpha);
SUM=0;
for i=1:l
if Flag(i)>0
switch TKF
case 1
SUM=SUM+Alpha(i)*sum(x.*X(:,i));
case 2
SUM=SUM+Alpha(i)*(sum(x.*X(:,i))+c)^p;
case 3
SUM=SUM+Alpha(i)*exp(-(norm(x-X(:,i)))^2/(2*sigma^2));
case 4
SUM=SUM+Alpha(i)*exp(-norm(x-X(:,i))/(2*sigma^2));
case 5
SUM=SUM+Alpha(i)*1/(1+exp(-v*sum(x.*X(:,i))+c));
otherwise
SUM=SUM+Alpha(i)*exp(-(sum((x-X(:,i)).^2)/(2*sigma^2)));
end
end
end
y=SUM+B;
%%
%%
%--------------------反归一化处理-------------------------------------------
y=postmnmx(y,minY,maxY);

非线性回归支持向量机——MATLAB源码的更多相关文章

  1. GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...

  2. 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)

    目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...

  3. Bag of Words/Bag of Features的Matlab源码发布

    2010年11月19日 ⁄ 技术, 科研 ⁄ 共 1296字 ⁄ 评论数 26 ⁄ 被围观 4,150 阅读+ 由于自己以前发过一篇文章讲bow特征的matlab代码的优化的<Bag-Of-Wo ...

  4. 群智能优化算法-测试函数matlab源码

    群智能优化算法测试函数matlab源代码 global M; creatematrix(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画ackley图. %%%% ...

  5. 红外图像处理之直方图均衡的matlab源码与效果验证

    红外图像是热辐射成像,由于场景中的目标与背景的温差相对较小,红外图像的动态范围大.对比度 低, 信噪比也较可见光图像的低.为了能够从红外图像中正确地识别出目标,必须对红外图像进行增强处理.一般红外探测 ...

  6. Blahut-Arimoto algorithm Matlab源码

    For a discrete memoryless channel , the capacity is defined as where  and  denote the input and outp ...

  7. 偏微分方程数值解法的MATLAB源码

    原文出处http://wenku.baidu.com/view/df412e115f0e7cd184253653.html 因为不太喜欢百度文库的格式,所以写到个人博客里面方便使用 <ifram ...

  8. Matlab 绘图全方位分析及源码

    Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...

  9. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

随机推荐

  1. 在Vue前端项目中,附件展示的自定义组件开发

    在Vue前端界面中,自定义组件很重要,也很方便,我们一般是把一些通用的界面模块进行拆分,创建自己的自定义组件,这样操作可以大大降低页面的代码量,以及提高功能模块的开发效率,本篇随笔继续介绍在Vue&a ...

  2. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  3. Linux下Zabbix5.0 LTS监控基础原理及安装部署(图文教程)

    Zabbix 是什么? zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.通过 C/S 模式采集数据,通过 B/S 模式在 Web 端展示和配置,能监视 ...

  4. 通用 Makefile(及makefile中的notdir,wildcard和patsubst)

    notdir,wildcard和patsubst是makefile中几个有用的函数,以前没留意过makefile中函数的用法,今天稍微看看~ 1.makefile里的函数 makefile里的函数使用 ...

  5. NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。

    老扫漏洞出来要整改 1.在 /etc/下创建一个文件 ssh_banner_change,在文件中输入内容,如:welcome! 2.修改/etc/ssh/sshd_config 文件,添加以下内容: ...

  6. Ambari 2.4 在 CentOS 7.4 因 TLS_1.2 协商内部错误导致注册失败

    问题背景 业务准备在天翼云上搭建一套线上环境,VM 操作系统版本为 CentOS Linux release 7.4.1708,但是在 ambari Web 管理页面上部署hadoop节点主机的时候, ...

  7. 深入浅出:了解时序数据库 InfluxDB

    数据模型 1.时序数据的特征 时序数据应用场景就是在时间线上每个时间点都会从多个数据源涌入数据,按照连续时间的多种纬度产生大量数据,并按秒甚至毫秒计算的实时性写入存储. 传统的RDBMS数据库对写入的 ...

  8. SpringBoot之MultipartFile文件上传(6)

    1.静态文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  9. MySQL基础学习——SQL对数据库进行操作、对数据库的表进行操作

    1.SQL对数据库进行操作: 创建数据库: 语法: create database 数据库名称 [character set 字符集 collate 字符集校对规则];字符集校对规则即所用字符集的数据 ...

  10. CentOS8安装VNC-Server,并使用VNC Viewer连接

    1.查看系统信息 # 查看red-hat版本信息 cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) 2.安装VNC Server ...