(声明:此程序为GreenSim团队的原创作品,我们删除了程序中的若干行,一般人是难以将其补充完整并正确运行的,如果有意购买此程序,请与我们联系,Email:greensim@163.com)function[Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,TKF)%%%SVMNR.m%SupportVectorMachineforNonlinearRegression%ChengAihua,PLAInformationEngineeringUniversity,ZhengZhou,China%Email:aihuacheng@gmail.com%Allrightsreserved%%%支持向量机非线性回归通用程序%程序功能:%使用支持向量机进行非线性回归,得到非线性函数y=f(x1,x2,…,xn)的支持向量解析式,%求解二次规划时调用了优化工具箱的quadprog函数。本函数在程序入口处对数据进行了%[-1,1]的归一化处理,所以计算得到的回归解析式的系数是针对归一化数据的,仿真测%试需使用与本函数配套的Regression函数。%主要参考文献:%朱国强,刘士荣等.支持向量机及其在函数逼近中的应用.华东理工大学学报%输入参数列表%X输入样本原始数据,n×l的矩阵,n为变量个数,l为样本个数%Y输出样本原始数据,1×l的矩阵,l为样本个数%Epsilonε不敏感损失函数的参数,Epsilon越大,支持向量越少%C惩罚系数,C过大或过小,泛化能力变差%TKFTypeofKernelFunction核函数类型%TKF=1线性核函数,注意:使用线性核函数,将进行支持向量机的线性回归%TKF=2多项式核函数%TKF=3径向基核函数%TKF=4指数核函数%TKF=5Sigmoid核函数%TKF=任意其它值,自定义核函数%输出参数列表%Alpha1α系数%Alpha2α*系数%Alpha支持向量的加权系数(α-α*)向量%Flag1×l标记,0对应非支持向量,1对应边界支持向量,2对应标准支持向量%B回归方程中的常数项%--------------------------------------------------------------------------%%%-----------------------数据归一化处理--------------------------------------nntwarnoffX=premnmx(X);Y=premnmx(Y);%%%%%-----------------------核函数参数初始化------------------------------------switchTKFcase1%线性核函数K=sum(x.*y)%没有需要定义的参数case2%多项式核函数K=(sum(x.*y)+c)^pc=0.1;p=2;case3%径向基核函数K=exp(-(norm(x-y))^2/(2*sigma^2))sigma=10;case4%指数核函数K=exp(-norm(x-y)/(2*sigma^2))sigma=10;case5%Sigmoid核函数K=1/(1+exp(-v*sum(x.*y)+c))v=0.5;c=0;otherwise%自定义核函数,需由用户自行在函数内部修改,注意要同时修改好几处!%暂时定义为K=exp(-(sum((x-y).^2)/(2*sigma^2)))sigma=8;end%%%%%-----------------------构造K矩阵-------------------------------------------l=size(X,2);K=zeros(l,l);%K矩阵初始化fori=1:lforj=1:lx=X(:,i);y=X(:,j);switchTKF%根据核函数的类型,使用相应的核函数构造K矩阵case1K(i,j)=sum(x.*y);case2K(i,j)=(sum(x.*y)+c)^p;case3K(i,j)=exp(-(norm(x-y))^2/(2*sigma^2));case4K(i,j)=exp(-norm(x-y)/(2*sigma^2));case5K(i,j)=1/(1+exp(-v*sum(x.*y)+c));otherwiseK(i,j)=exp(-(sum((x-y).^2)/(2*sigma^2)));endendend%%%%%------------构造二次规划模型的参数H,Ft,Aeq,Beq,lb,ub------------------------%支持向量机非线性回归,回归函数的系数,要通过求解一个二次规划模型得以确定Beq=0;lb=eps.*ones(2*l,1);ub=C*ones(2*l,1);%%%%%--------------调用优化工具箱quadprog函数求解二次规划------------------------OPT=optimset;OPT.LargeScale='off';OPT.Display='off';%%%%%------------------------整理输出回归方程的系数------------------------------Alpha1=(Gamma(1:l,1))';Alpha=Alpha1-Alpha2;Flag=2*ones(1,l);%%%%%---------------------------支持向量的分类----------------------------------Err=0.000000000001;fori=1:lAA=Alpha1(i);BB=Alpha2(i);if(abs(AA-0)=Err)&&(abs(BB-0)=Err)Flag(i)=0;%非支持向量endif(AAErr)&&(AAC-Err)&&(abs(BB-0)=Err)Flag(i)=2;%标准支持向量endif(abs(AA-0)=Err)&&(BBErr)&&(BBC-Err)Flag(i)=2;%标准支持向量endif(abs(AA-C)=Err)&&(abs(BB-0)=Err)Flag(i)=1;%边界支持向量endif(abs(AA-0)=Err)&&(abs(BB-C)=Err)Flag(i)=1;%边界支持向量endend%%%%%--------------------计算回归方程中的常数项B---------------------------------B=0;counter=0;fori=1:lAA=Alpha1(i);BB=Alpha2(i);if(AAErr)&&(AAC-Err)&&(abs(BB-0)=Err)%计算支持向量加权值SUM=0;forj=1:lifFlag(j)0switchTKFcase1SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));case2SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+c)^p;case3SUM=SUM+Alpha(j)*exp(-(norm(X(:,j)-X(:,i)))^2/(2*sigma^2));case4SUM=SUM+Alpha(j)*exp(-norm(X(:,j)-X(:,i))/(2*sigma^2));case5SUM=SUM+Alpha(j)*1/(1+exp(-v*sum(X(:,j).*X(:,i))+c));otherwiseSUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/(2*sigma^2)));endendendB=B+b;counter=counter+1;endif(abs(AA-0)=Err)&&(BBErr)&&(BBC-Err)SUM=0;forj=1:lifFlag(j)0switchTKFcase1SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));case2SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+c)^p;case3SUM=SUM+Alpha(j)*exp(-(norm(X(:,j)-X(:,i)))^2/(2*sigma^2));case4SUM=SUM+Alpha(j)*exp(-norm(X(:,j)-X(:,i))/(2*sigma^2));case5SUM=SUM+Alpha(j)*1/(1+exp(-v*sum(X(:,j).*X(:,i))+c));otherwiseSUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/(2*sigma^2)));endendendb=Y(i)-SUM+Epsilon;counter=counter+1;endendifcounter==0B=0;elseB=B/counter;end为检验支持向量机非线性回归的泛化能力,本文做了如下实验:把第i(i=1,2,…,21)组原始数据样本抽取出来,把剩下的20组数据作为学习样本,输入支持向量机非线性回归的程序,计算相应的非线性回归方程,并把抽取出来的那一组数据作为测试数据,计算输出值,并与其原始值做比较,计算绝对误差和相对误差。123456789101112131415161718192021绝对误差-0.020.040.050.100.00-0.03-0.05-0.03-0.03-0.080.07-0.09-0.01-0.01-0.020.03-0.020.000.180.13-0.12相对误差-0.050.060.090.170.00-0.04-0.08-0.04-0.05-0.110.16-0.16-0.01-0.02-0.040.04-0.020.000.510.26-0.14平均相对误差为0.0978BP神经网络有着很强的非线性拟合能力,能以任意精度逼近任意非线性连续函数,当然其前提条件是——神经网络构造适当并且训练充分。对于本文的19维的输入变量,而只有少量的20组训练样本的情况下,其泛化能力表现如何呢?我们使用Matlab自带的神经网络工具箱,构造并训练了一个BP神经网络,其仿真误差如下:123456789101112131415161718192021绝对误差0.040.130.380.09-0.270.18-0.040.31-0.110.100.34-0.31-0.020.28-0.120.16-0.030.130.250.22-0.02相对误差0.110.190.770.16-0.290.24-0.060.42-0.180.150.75-0.53-0.030.34-0.210.22-0.040.170.700.44-0.02平均相对误差为0.2865