登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
程序
>
支持向量机非线性回归通用MATLAB源码
发帖
回复
2074
阅读
0
回复
[
资料共享
]
支持向量机非线性回归通用MATLAB源码
离线
greensim
UID :63869
注册:
2010-07-25
登录:
2011-09-15
发帖:
10
等级:
仿真新人
0楼
发表于: 2011-08-26 15:27:12
题目:支持向量机非线性回归通用MATLAB源码
ee=d*)
支持向量机和BP神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强。GreenSim团队编写了支持向量机非线性回归的通用Matlab程序,并且和BP网络进行了比较,大量仿真结果证实,支持向量机的泛化能力强于BP网络,而且能避免神经网络的固有缺陷——训练结果不稳定。本源码可以用于线性回归、非线性回归、非线性函数拟合、数据建模、预测、分类等多种应用场合,由于接口规范,注释详细,非常好用,GreenSim团队推荐您使用。本源码已经删掉了关键的一些代码,一般人难以将其补充完整,有意购买此源码,请与GreenSim团队联系。
1tNmiAu
function [Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,TKF,Para1,Para2)
[$D4U@mRp
%%
cI Byv I-
% SVMNR.m
w u
% Support Vector Machine for Nonlinear Regression
=H\ig%%E@
% All rights reserved
%O< qw
%%
[H!8m7i;
% 支持向量机非线性回归通用程序
Qs^RhF\d
% 程序功能:
<hO|:LX
% 使用支持向量机进行非线性回归,得到非线性函数y=f(x1,x2,…,xn)的支持向量解析式,
?\l@k(w4[x
% 求解二次规划时调用了优化工具箱的quadprog函数。本函数在程序入口处对数据进行了
@6roW\'$
% [-1,1]的归一化处理,所以计算得到的回归解析式的系数是针对归一化数据的,仿真测
l]GUQcN=
% 试需使用与本函数配套的Regression函数。
*A,h^
% 主要参考文献:
v^;%Fz_Dr
% 朱国强,刘士荣等.支持向量机及其在函数逼近中的应用.华东理工大学学报
#q5 L4uM9
% 输入参数列表
mJ3|UClPS
% X 输入样本原始数据,n×l的矩阵,n为变量个数,l为样本个数
gZ^NdDBO
% Y 输出样本原始数据,1×l的矩阵,l为样本个数
h 'F\9t
% Epsilon ε不敏感损失函数的参数,Epsilon越大,支持向量越少
o1"-x
% C 惩罚系数,C过大或过小,泛化能力变差
w53+k\.
% TKF Type of Kernel Function 核函数类型
-X6[qLq
% TKF=1 线性核函数,注意:使用线性核函数,将进行支持向量机的线性回归
Cy~Pfty
% TKF=2 多项式核函数
y_=},a
% TKF=3 径向基核函数
P}El#y#&
% TKF=4 指数核函数
k7\h- yn{
% TKF=5 Sigmoid核函数
S1R:/9 z
% TKF=任意其它值,自定义核函数
t*&O*T+fgy
% Para1 核函数中的第一个参数
Ak\w)!?s
% Para2 核函数中的第二个参数
C6 XZZ
% 注:关于核函数参数的定义请见Regression.m和SVMNR.m内部的定义
'{t&!M`
% 输出参数列表
|Ir&C[QS{y
% Alpha1 α系数
(Es0n$Xb
% Alpha2 α*系数
_qPd)V6yb
% Alpha 支持向量的加权系数(α-α*)向量
-Xw i}/OX
% Flag 1×l标记,0对应非支持向量,1对应边界支持向量,2对应标准支持向量
{I2qnTN_a
% B 回归方程中的常数项
cTR@ :sm
%--------------------------------------------------------------------------
5ecAev^1-
%%
`XJU$c
%-----------------------数据归一化处理--------------------------------------
,/qS1W(
nntwarn off
Z3)l5JG)
X=premnmx(X);
j/FFxlFNL
Y=premnmx(Y);
v$H]=y
%%
Xyrf$R'
%%
?1f(@
%-----------------------核函数参数初始化------------------------------------
>$.lM~k
switch TKF
yE \dv)(<
case 1
wV9[Jl\Z
%线性核函数 K=sum(x.*y)
j0LA
%没有需要定义的参数
HZ#<+~J
case 2
G%V*+Ond
%多项式核函数 K=(sum(x.*y)+c)^p
8u401ddg
c=Para1;%c=0.1;
BpGK`0H
p=Para2;%p=2;
"s6O|=^*
case 3
k3/V$*i,1b
%径向基核函数 K=exp(-(norm(x-y))^2/(2*sigma^2))
#hOAG_a,
sigma=Para1;%sigma=6;
!/6`<eQ `
case 4
fgg;WXcT ~
%指数核函数 K=exp(-norm(x-y)/(2*sigma^2))
?G#T6$E8
sigma=Para1;%sigma=3;
Q+O3Wgjy
case 5
Z|z+[V}[
%Sigmoid核函数 K=1/(1+exp(-v*sum(x.*y)+c))
`qjiC>9
v=Para1;%v=0.5;
pV3o\bk!
c=Para2;%c=0;
j>5D4}*]f
otherwise
%Tn0r|K
%自定义核函数,需由用户自行在函数内部修改,注意要同时修改好几处!
},2mIit(
%暂时定义为 K=exp(-(sum((x-y).^2)/(2*sigma^2)))
} h.]sF
sigma=Para1;%sigma=8;
fh1rmet&Ts
end
B^z3u=ll
%%
Iaq7<$XU
%%
<Q4yN!6
%-----------------------构造K矩阵-------------------------------------------
+{$NN
l=size(X,2);
Wa8?o~0"L
K=zeros(l,l);%K矩阵初始化
~t $zypw
for i=1:l
ZkyH<Aa
for j=1:l
BtSl%(w
x=X(:,i);
c&+p{hH+
y=X(:,j);
X\I"%6$
switch TKF%根据核函数的类型,使用相应的核函数构造K矩阵
H^N@fG<*dh
case 1
=]OG5b_-Y
K(i,j)=sum(x.*y);
!Ol>![
case 2
,~!rn}MI<
K(i,j)=(sum(x.*y)+c)^p;
5df~] -=0Y
case 3
+~6gP!
K(i,j)=exp(-(norm(x-y))^2/(2*sigma^2));
w2!5Cb2
case 4
03iD(,@
K(i,j)=exp(-norm(x-y)/(2*sigma^2));
@q?zh'@;
case 5
)1>fQ9
K(i,j)=1/(1+exp(-v*sum(x.*y)+c));
<fJ*{$[p
otherwise
Zz\e:/
K(i,j)=exp(-(sum((x-y).^2)/(2*sigma^2)));
)1KlcF
end
.H,wdzg)
end
}NQ{S3JW
end
{jOCz1J
%%
@bN`+DC!<
%%
v.08,P{b
%------------构造二次规划模型的参数H,Ft,Aeq,Beq,lb,ub------------------------
$6ZO V/0
%支持向量机非线性回归,回归函数的系数,要通过求解一个二次规划模型得以确定
8TK&i,
Ft=[Epsilon*ones(1,l)-Y,Epsilon*ones(1,l)+Y];
#'qEm=%
Aeq=[ones(1,l),-ones(1,l)];
50:$km\
Beq=0;
RtrESwtR
ub=C*ones(2*l,1);
l3sL!D1u
%%
24TQl<H{
%%
BwN65_5p
%--------------调用优化工具箱quadprog函数求解二次规划------------------------
Bu ~N)^
OPT=optimset;
Z2yZz:.'
OPT.LargeScale='off';
"g)@jqq:>
OPT.Display='off';
#1:&uC1vj
%%
s uT#k3
%%
lbw*T
%------------------------整理输出回归方程的系数------------------------------
F 8\nAX
Alpha1=(Gamma(1:l,1))';
YGBVGpE9
Alpha2=(Gamma((l+1):end,1))';
<bPn<QI
Alpha=Alpha1-Alpha2;
?lh `>v
Flag=2*ones(1,l);
7*e7P[LQU
%%
Zhl}X!:c?\
%%
7Ca+Pe}/n,
%---------------------------支持向量的分类----------------------------------
Z /-!-
Err=0.000000000001;
!+?,y/*5(
for i=1:l
UIUCj8QJg
AA=Alpha1(i);
.[v4'ww^
BB=Alpha2(i);
!N4?>[E
if (abs(AA-0)<=Err)&&(abs(BB-0)<=Err)
{xm^DT
Flag(i)=0;%非支持向量
: -@o3Syg
end
tN'-4<+
if (AA>Err)&&(AA<C-Err)&&(abs(BB-0)<=Err)
zCdQI
Flag(i)=2;%标准支持向量
QMGMXa
end
$J>J@4
if (abs(AA-0)<=Err)&&(BB>Err)&&(BB<C-Err)
Wx;`=9
Flag(i)=2;%标准支持向量
}";\8
end
cxhS*"Ph
if (abs(AA-C)<=Err)&&(abs(BB-0)<=Err)
FbMX?T"yH
Flag(i)=1;%边界支持向量
KJ Gh)
end
pPUv8, %
if (abs(AA-0)<=Err)&&(abs(BB-C)<=Err)
:V>M{vd
Flag(i)=1;%边界支持向量
RcUKe,
end
L{K:XiPn
end
{iGk~qN
%%
OPp>z0p%6X
%%
sLE@Cm]k
%--------------------计算回归方程中的常数项B---------------------------------
nVqFCBB
B=0;
:%M[|Fj
counter=0;
p}qNw`
for i=1:l
qM(n]{H
AA=Alpha1(i);
x[Xj[O
BB=Alpha2(i);
E\5cb[Y
if (AA>Err)&&(AA<C-Err)&&(abs(BB-0)<=Err)
l@ +]XyLj
%计算支持向量加权值
WXqrx*?*+
SUM=0;
#>m#i1Nu
for j=1:l
$z-zscco
if Flag(j)>0
0jY#,t?>
switch TKF
6m_whGosi
case 1
$7{|
SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));
r Bv
case 2
<$WRc\}&g