非线性回归支持向量机——MATLAB源码
支持向量机和神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强。大量仿真证实,支持向量机的泛化能力强于神经网络,而且能避免神经网络的固有缺陷——训练结果不稳定。本源码可以用于线性回归、非线性回归、非线性函数拟合、数据建模、预测、分类等多种应用场合。
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源码的更多相关文章
- GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)
以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...
- 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)
目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...
- Bag of Words/Bag of Features的Matlab源码发布
2010年11月19日 ⁄ 技术, 科研 ⁄ 共 1296字 ⁄ 评论数 26 ⁄ 被围观 4,150 阅读+ 由于自己以前发过一篇文章讲bow特征的matlab代码的优化的<Bag-Of-Wo ...
- 群智能优化算法-测试函数matlab源码
群智能优化算法测试函数matlab源代码 global M; creatematrix(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画ackley图. %%%% ...
- 红外图像处理之直方图均衡的matlab源码与效果验证
红外图像是热辐射成像,由于场景中的目标与背景的温差相对较小,红外图像的动态范围大.对比度 低, 信噪比也较可见光图像的低.为了能够从红外图像中正确地识别出目标,必须对红外图像进行增强处理.一般红外探测 ...
- Blahut-Arimoto algorithm Matlab源码
For a discrete memoryless channel , the capacity is defined as where and denote the input and outp ...
- 偏微分方程数值解法的MATLAB源码
原文出处http://wenku.baidu.com/view/df412e115f0e7cd184253653.html 因为不太喜欢百度文库的格式,所以写到个人博客里面方便使用 <ifram ...
- Matlab 绘图全方位分析及源码
Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
随机推荐
- 洛谷 P5785 [SDOI2012] 任务安排
链接: P5785 弱化版:P2365 题意: 有 \(n\) 个任务待完成,每个任务有一个完成时间 \(t_i\) 和费用系数 \(f_i\),相邻的任务可以被分成一批.从零时刻开始这些任务会被机器 ...
- caffe的idx1-ubyte和idx1-ubyte文件转换成图片文件和文本文件
train-images-idx3-ubyte : training set images train-labels-idx1-ubyte : training set labels t10k-i ...
- PCIe知识摘要记录
摘: 一. 在PCIe的Spec中,并没有特别详细的关于Root Complex的定义,从实际的角度来讲,可以把Root Complex理解为CPU与PCIe总线系统通信的媒介.Endpoint处于P ...
- minimum-depth-of-binary-tree leetcode C++
Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the short ...
- hdu 5108 Alexandra and Prime Numbers(水题 / 数论)
题意: 给一个正整数N,找最小的M,使得N可以整除M,且N/M是质数. 数据范围: There are multiple test cases (no more than 1,000). Each c ...
- IM服务器:开发一个高并发的IM服务器难在哪
IM服务器要实现的最基本功能就是消息的转发.--好像是一句废话! 这就意味着IM服务器要为每个登录用户创建一个与该用户信息相关的内存上下文,为方便描述我们在这里称之为:user_context.use ...
- 小米多模网关接入Home Assistant ZNDMWG03LM
一.小米zigbee网关使用 先下载米家app,打开手机蓝牙,登陆点"我的"界面,将网关设备插上电源,橙灯闪烁,点击蓝牙网关等待弹窗提示连接,选择连接路由器(需2.4GHz),输入 ...
- MySQL:互联网公司常用分库分表方案汇总!
一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...
- 【Git 系列】一个超好用的命令你会用吗?
stash在英文意思是隐藏.git stash 的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作. 一.背景 1.1 我们经常会遇到这样的情况 正在 dev 分支开发新功能,做到一半时有人过 ...
- mybatis插入数据时处理为null的属性
在做项目的时候,数据库中的所有字段被设置为全都不能为null,但是在我们开发过程中,插入一些记录的时候,实体类中的一些字段如果页面没有传入,则默认就会被设置为null,这样的话,在执行插入语句的时候, ...