% RBF网络逼近,多维输入情况
% 作者:nuaazdh
% 时间:2012年4月11日 20:11:25
function [test_out]=RBF_NN_MIC(train_i,train_o,test_i)
% train_i:训练样本输入,行数表示其维数,列数表示样本个数
% train_o:训练样本输出
% test_i:测试样本输入
% test_o:测试样本输出
%% 参数设定和初始化
size_tr=size(train_i,2); %训练样本个数
size_te=size(test_i,2); %测试样本个数
%train_o=cos(train_i);%因变量y
in_num=size(train_i,1);%输入层神经单元个数
hid_num=7; %隐含层神经单元个数
w=rand(1,hid_num);%隐含层-输出层的权值
b=ones(1,hid_num);%节点基宽
c=4.0*rand(in_num,hid_num);%基函数中心
h=zeros(1,hid_num);%RBF网络的径向基向量
eta_w=0.080;%学习率η
eta_b=0.010;
eta_c=0.010;
alpha=0.1;%动量因子α
%beta=0.1;%变步长调整系数
maxgen=20000;%最大迭代次数
error_goal=1e-4;%误差精度要求
mse=zeros(1,maxgen);%均方误差
wk_1=w;wk_2=w;%前1 2 时刻的权值
bk_1=b;bk_2=b;%前1 2 时刻的基宽值
ck_1=c;ck_2=c;%前1 2时刻的中心值
delta_c=zeros(in_num,hid_num);
%[~,ce]=kmeans(train_i,hid_num);
%c=ce';
W=cell(maxgen,1);
B=cell(maxgen,1);
C=cell(maxgen,1);
%% 开始训练网络
gen=0;
for i=1:maxgen
gen=gen+1;%当前迭代次数
%% 训练样本
for j=1:size_tr
for k=1:hid_num
h(k)=exp(-norm(train_i(:,j)-c(:,k))^2/(2*b(k)^2));
end
ye=w*h';
%修正权值
e=train_o(j)-ye;%当前输出误差
for k=1:hid_num
w(k)=wk_1(k)+eta_w*e*h(k)+alpha*(wk_1(k)-wk_2(k));
delta_b=e*wk_1(k)*h(k)*(train_i(j)-ck_1(k))^2/b(k)^3;
b(k)=bk_1(k)+eta_b*delta_b+alpha*(bk_1(k)-bk_2(k));
delta_c(:,k)=e*wk_1(k)*h(k)*(train_i(:,j)-ck_1(:,k))/(bk_1(k))^2;
c(:,k)=ck_1(:,k)+eta_c*delta_c(:,k)+alpha*(ck_1(:,k)-ck_2(:,k));
end
%重新赋值前一时刻的各参数
wk_2=wk_1;wk_1=w;
bk_2=bk_1;bk_1=b;
ck_2=ck_1;ck_1=c;
end
%% 计算迭代效果:均方误差
error=0;%均方误差
for j=1:size_tr
for k=1:hid_num
h(k)=exp(-norm(train_i(:,j)-c(:,k))^2/(2*b(k)^2));
end
ye=w*h';
error=error+(train_o(j)-ye)^2;%性能指标函数值
end
mse(gen)=error;%记录当前代数下的均方误差
fprintf('Gen:%d,MSE:%f.\n',gen,error);
if error<error_goal %精度达到要求
break;%跳出训练
end
W{gen,1}=w;
B{gen,1}=b;
C{gen,1}=c;
[~,minId]=min(mse(1:gen));
w=W{minId,1};b=B{minId,1};c=C{minId,1};
end
%{
[~,minId]=min(mse);
w=W{minId,1};b=B{minId,1};c=C{minId,1};
%}
save net_RBF_UserDefined.mat hid_num w b c
%% 使用网络进行输出
for i=1:size_te
for k=1:hid_num
h(k)=exp(-norm(test_i(:,i)-c(:,k))^2/(2*b(k)^2));
end
test_out(i)=w*h';
end
end
评论0