【原创】支持向量机和BP神经网络非线性回归之比较研究(含支持向量机非线性回归通用matlab程序)
GreenSim团队的博客开通了,更多原创程序请访问我们的博客
http://blog.sina.com.cn/greensim
支持向量机和BP神经网络虽然都可以用来做非线性回归,但它们所基于的理论基础不同,回归的机理也不相同。支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强。为了验证这种观点,本文编写了支持向量机非线性回归的通用Matlab程序和基于神经网络工具箱的BP神经网络仿真模块,仿真结果证实,支持向量机做非线性回归不仅泛化能力强于BP网络,而且能避免神经网络的固有缺陷——训练结果不稳定。
GreenSim团队编写了支持向量机非线性回归的通用Matlab程序如下
(声明:此程序为GreenSim团队的原创作品,我们删除了程序中的若干行,一般人是难以将其补充完整并正确运行的,如果有意购买此程序,请与我们联系,Email:greensim@163.com)
function [Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,TKF)
%%
% SVMNR.m
% Support Vector Machine for Nonlinear Regression
% ChengAihua,PLA Information Engineering University,ZhengZhou,China
% Email:aihuacheng@gmail.com
% 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=任意其它值,自定义核函数
% 输出参数列表
% 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=0.1;
p=2;
case 3
%径向基核函数 K=exp(-(norm(x-y))^2/(2*sigma^2))
sigma=10;
case 4
%指数核函数 K=exp(-norm(x-y)/(2*sigma^2))
sigma=10;
case 5
%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矩阵初始化
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------------------------
%支持向量机非线性回归,回归函数的系数,要通过求解一个二次规划模型得以确定
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;
for i=1:l
AA=Alpha1(i);
BB=Alpha2(i);
if (abs(AA-0) Flag(i)=0;%非支持向量
end
if (AA>Err)&&(AA Flag(i)=2;%标准支持向量
end
if (abs(AA-0)Err)&&(BB Flag(i)=2;%标准支持向量
end
if (abs(AA-C) Flag(i)=1;%边界支持向量
end
if (abs(AA-0) Flag(i)=1;%边界支持向量
end
end
%%
%%
%--------------------计算回归方程中的常数项B---------------------------------
B=0;
counter=0;
for i=1:l
AA=Alpha1(i);
BB=Alpha2(i);
if (AA>Err)&&(AA %计算支持向量加权值
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=B+b;
counter=counter+1;
end
if (abs(AA-0)Err)&&(BB 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;
counter=counter+1;
end
end
if counter==0
B=0;
else
B=B/counter;
end
为检验支持向量机非线性回归的泛化能力,本文做了如下实验:把第i(i=1,2,…,21)组原始数据样本抽取出来,把剩下的20组数据作为学习样本,输入支持向量机非线性回归的程序,计算相应的非线性回归方程,并把抽取出来的那一组数据作为测试数据,计算输出值,并与其原始值做比较,计算绝对误差和相对误差。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
绝对误差 -0.02 0.04 0.05 0.10 0.00 -0.03 -0.05 -0.03 -0.03 -0.08 0.07 -0.09 -0.01 -0.01 -0.02 0.03 -0.02 0.00 0.18 0.13 -0.12
相对误差 -0.05 0.06 0.09 0.17 0.00 -0.04 -0.08 -0.04 -0.05 -0.11 0.16 -0.16 -0.01 -0.02 -0.04 0.04 -0.02 0.00 0.51 0.26 -0.14
平均相对误差为0.0978
BP神经网络有着很强的非线性拟合能力,能以任意精度逼近任意非线性连续函数,当然其前提条件是——神经网络构造适当并且训练充分。对于本文的19维的输入变量,而只有少量的20组训练样本的情况下,其泛化能力表现如何呢?我们使用Matlab自带的神经网络工具箱,构造并训练了一个BP神经网络,其仿真误差如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
绝对误差 0.04 0.13 0.38 0.09 -0.27 0.18 -0.04 0.31 -0.11 0.10 0.34 -0.31 -0.02 0.28 -0.12 0.16 -0.03 0.13 0.25 0.22 -0.02
相对误差 0.11 0.19 0.77 0.16 -0.29 0.24 -0.06 0.42 -0.18 0.15 0.75 -0.53 -0.03 0.34 -0.21 0.22 -0.04 0.17 0.70 0.44 -0.02
平均相对误差为0.2865
通过仿真,可以得出下面的结论:
(1) 在小样本的条件下,支持向量机的泛化能力明显比BP网络的强;
(2) 支持向量机每次计算得到的回归式是唯一的,而不像神经网络那样不稳定;
(3) 支持向量机可以得到回归解析式,而神经网络仅能得到一个“黑箱”函数;