MATLAB已经有良好的RBF神经网络建模函数Newrbe,为了能够深刻的了解RBF神经网络的内部结构,编出了较为简单的RBF神经网络训练函数举例,代码如下。
- function RBF_NN_Example()
- clc
- clear all
- % 创建训练样本
- % 线性函数的训练
- Mn_Train=100*[rand(1,5) rand(1,5)+0.5 rand(1,5)+1 rand(1,5)+1.5;...
- rand(1,5) rand(1,5)+0.5 rand(1,5)+1 rand(1,5)+1.5];
- n=size(Mn_Train,2);
- % Mn_Train 为2*20的矩阵
- Nn_Train=[2*Mn_Train;3*Mn_Train(1,:)];
- % Nn_Train 为3*20的矩阵
- % 将训练样本进行聚类分析,分为4类
- H=4;
- % 将样本归一化
- [SampleX,pmin,pmax,SampleY,tmin,tmax]=premnmx(Mn_Train,Nn_Train);
- % 将训练样本进行聚类并形成聚类中心
- options=statset('Display','final');
- [index,center]=kmeans(SampleX',H,'Distance','city',...
- 'Replicates',10,'Options',options);
- figure(1)
- X=SampleX';
- set(figure(1),'color','w')
- hold on
- plot(X(index==1,1),X(index==1,2),'ro','markersize',9,'markeredgecolor',...
- 'k','markerfacecolor','r')
- plot(X(index==2,1),X(index==2,2),'go','markersize',9,'markeredgecolor',...
- 'k','markerfacecolor','g')
- plot(X(index==3,1),X(index==3,2),'mo','markersize',9,'markeredgecolor',...
- 'k','markerfacecolor','m')
- plot(X(index==4,1),X(index==4,2),'bo','markersize',9,'markeredgecolor',...
- 'k','markerfacecolor','b')
- plot(center(:,1),center(:,2),'ko','markersize',15,'markeredgecolor',...
- 'k','markerfacecolor','k')
- title('样本聚类','fontsize',16)
- grid on
- hold off
- % spread径函数的扩展速度设置
- spread=0.3;
- % 基于高斯函数的隐藏层神经元的输出
- % 形成4*20的矩阵
- % 阈值
- b=ones(1,H)*0.8326/spread;
- center=center';
- Hidden_Out=zeros(H,size(SampleX,2));
- for i=1:H
- for j=1:size(SampleX,2)
- Hidden_Out(i,j)=exp(-b(i)*(norm(SampleX(:,j)-center(:,i)).^2));
- end
- end
- % 对输出层权重的训练,最速下降法
- MaxIteration=1000;
- Iteration=0;
- tol=1e-3;
- lemda=0.001;
- % 初始化参数和阈值
- N=size(SampleY,1);
- W=0.5*rand(N,H)-0.1;
- B=0.5*rand(N,1)-0.1;
- % 网络输出值
- NetOut=W*Hidden_Out+repmat(B,1,n);
- Resid=SampleY-NetOut;
- % 均方误
- MSE_error=sumsqr(Resid)./(N*n);
- % 训练权重开始
- while Iteration<MaxIteration
-
- NetOut=W*Hidden_Out+repmat(B,1,n);
- Resid=SampleY-NetOut;
- MSE_error=sumsqr(Resid)./(N*n);
-
- Delta=Resid;
- % 最速下降训练
- dW=Delta*Hidden_Out';
- dB=Delta*ones(n,1);
-
- W=W+lemda*dW;
- B=B+lemda*dB;
-
- if MSE_error<tol
- break;
- end
- Iteration=Iteration+1;
- end
- NetOut=W*Hidden_Out+repmat(B,1,n);
- Samplefit=postmnmx(NetOut,tmin,tmax);
- % 将拟合样本和原样本比较
- figure(2)
- set(figure(2),'color','w')
- hold on
- subplot(3,1,1)
- hold on
- plot(1:20,Nn_Train(1,:),'ro-','markersize',8)
- plot(1:20,Samplefit(1,:),'bo-','markersize',8)
- title('样本拟合对比')
- subplot(3,1,2)
- hold on
- plot(1:20,Nn_Train(2,:),'ro-','markersize',8)
- plot(1:20,Samplefit(2,:),'bo-','markersize',8)
- title('样本拟合对比')
- subplot(3,1,3)
- hold on
- plot(1:20,Nn_Train(3,:),'ro-','markersize',8)
- plot(1:20,Samplefit(3,:),'bo-','markersize',8)
- title('样本拟合对比')
- hold off