基于MATLAB的径向基网络源程序
- 格式:docx
- 大小:25.95 KB
- 文档页数:5
MATLAB程序代码--bp神经网络通用代码matlab通用神经网络代码学习了一段时间的神经网络,总结了一些经验,在这愿意和大家分享一下, 希望对大家有帮助,也希望大家可以把其他神经网络的通用代码在这一起分享感应器神经网络、线性网络、BP神经网络、径向基函数网络%通用感应器神经网络。
P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1 50];%输入向量T=[1 1 0 0 1];%期望输出plotpv(P,T);%描绘输入点图像net=newp([-40 1;-1 50],1);%生成网络,其中参数分别为输入向量的范围和神经元感应器数量hold onlinehandle=plotpc(net.iw{1},net.b{1});net.adaptparam.passes=3;for a=1:25%训练次数[net,Y,E]=adapt(net,P,T);linehandle=plotpc(net.iw{1},net.b{1},linehandle);drawnow;end%通用newlin程序%通用线性网络进行预测time=0:0.025:5;T=sin(time*4*pi);Q=length(T);P=zeros(5,Q);%P中存储信号T的前5(可变,根据需要而定)次值,作为网络输入。
P(1,2:Q)=T(1,1:(Q-1));P(2,3:Q)=T(1,1:(Q-2));P(3,4:Q)=T(1,1:(Q-3));P(4,5:Q)=T(1,1:(Q-4));P(5,6:Q)=T(1,1:(Q-5));plot(time,T)%绘制信号T曲线xlabel('时间');ylabel('目标信号');title('待预测信号');net=newlind(P,T);%根据输入和期望输出直接生成线性网络a=sim(net,P);%网络测试figure(2)plot(time,a,time,T,'+')xlabel('时间');ylabel('输出-目标+');title('输出信号和目标信号');e=T-a;figure(3)plot(time,e)hold onplot([min(time) max(time)],[0 0],'r:')%可用plot(x,zeros(size(x)),'r:')代替hold offxlabel('时间');ylabel('误差');title('误差信号');%通用BP神经网络P=[-1 -1 2 2;0 5 0 5];t=[-1 -1 1 1];net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingd');%输入参数依次为:'样本P范围',[各层神经元数目],{各层传递函数},'训练函数'%训练函数traingd--梯度下降法,有7个训练参数.%训练函数traingdm--有动量的梯度下降法,附加1个训练参数mc(动量因子,缺省为0.9)%训练函数traingda--有自适应lr的梯度下降法,附加3个训练参数:lr_inc(学习率增长比,缺省为1.05;% lr_dec(学习率下降比,缺省为0.7);max_perf_inc(表现函数增加最大比,缺省为1.04)%训练函数traingdx--有动量的梯度下降法中赋以自适应lr的方法,附加traingdm和traingda的4个附加参数%训练函数trainrp--弹性梯度下降法,可以消除输入数值很大或很小时的误差,附加4个训练参数: % delt_inc(权值变化增加量,缺省为1.2);delt_dec(权值变化减小量,缺省为0.5);% delta0(初始权值变化,缺省为0.07);deltamax(权值变化最大值,缺省为50.0)% 适合大型网络%训练函数traincgf--Fletcher-Reeves共轭梯度法;训练函数traincgp--Polak-Ribiere共轭梯度法;%训练函数traincgb--Powell-Beale共轭梯度法%共轭梯度法占用存储空间小,附加1训练参数searchFcn(一维线性搜索方法,缺省为srchcha);缺少1个训练参数lr%训练函数trainscg--量化共轭梯度法,与其他共轭梯度法相比,节约时间.适合大型网络% 附加2个训练参数:sigma(因为二次求导对权值调整的影响参数,缺省为5.0e-5);% lambda(Hessian阵不确定性调节参数,缺省为5.0e-7)% 缺少1个训练参数:lr%训练函数trainbfg--BFGS拟牛顿回退法,收敛速度快,但需要更多内存,与共轭梯度法训练参数相同,适合小网络%训练函数trainoss--一步正割的BP训练法,解决了BFGS消耗内存的问题,与共轭梯度法训练参数相同%训练函数trainlm--Levenberg-Marquardt训练法,用于内存充足的中小型网络net=init(net);net.trainparam.epochs=300; %最大训练次数(前缺省为10,自trainrp后,缺省为100)net.trainparam.lr=0.05; %学习率(缺省为0.01)net.trainparam.show=50; %限时训练迭代过程(NaN表示不显示,缺省为25)net.trainparam.goal=1e-5; %训练要求精度(缺省为0)%net.trainparam.max_fail 最大失败次数(缺省为5)%net.trainparam.min_grad 最小梯度要求(前缺省为1e-10,自trainrp后,缺省为1e-6) %net.trainparam.time 最大训练时间(缺省为inf)[net,tr]=train(net,P,t); %网络训练a=sim(net,P) %网络仿真%通用径向基函数网络——%其在逼近能力,分类能力,学习速度方面均优于BP神经网络%在径向基网络中,径向基层的散步常数是spread的选取是关键%spread越大,需要的神经元越少,但精度会相应下降,spread的缺省值为1%可以通过net=newrbe(P,T,spread)生成网络,且误差为0%可以通过net=newrb(P,T,goal,spread)生成网络,神经元由1开始增加,直到达到训练精度或神经元数目最多为止%GRNN网络,迅速生成广义回归神经网络(GRNN)P=[4 5 6];T=[1.5 3.6 6.7];net=newgrnn(P,T);%仿真验证p=4.5;v=sim(net,p)%PNN网络,概率神经网络P=[0 0 ;1 1;0 3;1 4;3 1;4 1;4 3]';Tc=[1 1 2 2 3 3 3];%将期望输出通过ind2vec()转换,并设计、验证网络T=ind2vec(Tc);net=newpnn(P,T);Y=sim(net,P);Yc=vec2ind(Y)%尝试用其他的输入向量验证网络P2=[1 4;0 1;5 2]';Y=sim(net,P2);Yc=vec2ind(Y)%应用newrb()函数构建径向基网络,对一系列数据点进行函数逼近P=-1:0.1:1;T=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...0.1336 -0.2013 -0.4344 -0.500 -0.3930 -0.1647 -0.0988...0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3201];%绘制训练用样本的数据点plot(P,T,'r*');title('训练样本');xlabel('输入向量P');ylabel('目标向量T');%设计一个径向基函数网络,网络有两层,隐层为径向基神经元,输出层为线性神经元%绘制隐层神经元径向基传递函数的曲线p=-3:.1:3;a=radbas(p);plot(p,a)title('径向基传递函数')xlabel('输入向量p')%隐层神经元的权值、阈值与径向基函数的位置和宽度有关,只要隐层神经元数目、权值、阈值正确,可逼近任意函数%例如a2=radbas(p-1.5);a3=radbas(p+2);a4=a+a2*1.5+a3*0.5;plot(p,a,'b',p,a2,'g',p,a3,'r',p,a4,'m--')title('径向基传递函数权值之和')xlabel('输入p');ylabel('输出a');%应用newrb()函数构建径向基网络的时候,可以预先设定均方差精度eg以及散布常数sc eg=0.02;sc=1; %其值的选取与最终网络的效果有很大关系,过小造成过适性,过大造成重叠性net=newrb(P,T,eg,sc);%网络测试plot(P,T,'*')xlabel('输入');X=-1:.01:1;Y=sim(net,X);hold onplot(X,Y);hold offlegend('目标','输出')%应用grnn进行函数逼近P=[1 2 3 4 5 6 7 8];T=[0 1 2 3 2 1 2 1];plot(P,T,'.','markersize',30)axis([0 9 -1 4])title('待逼近函数')xlabel('P')ylabel('T')%网络设计%对于离散数据点,散布常数spread选取比输入向量之间的距离稍小一些spread=0.7;net=newgrnn(P,T,spread);%网络测试A=sim(net,P);hold onoutputline=plot(P,A,'o','markersize',10,'color',[1 0 0]);title('检测网络')xlabel('P')ylabel('T和A')%应用pnn进行变量的分类P=[1 2;2 2;1 1]; %输入向量Tc=[1 2 3]; %P对应的三个期望输出%绘制出输入向量及其相对应的类别plot(P(1,:),P(2,:),'.','markersize',30)for i=1:3text(P(1,i)+0.1,P(2,i),sprintf('class %g',Tc(i)))endaxis([0 3 0 3]);title('三向量及其类别')xlabel('P(1,:)')ylabel('P(2,:)')%网络设计T=ind2vec(Tc);spread=1;net=newgrnn(P,T,speard);%网络测试A=sim(net,P);Ac=vec2ind(A);%绘制输入向量及其相应的网络输出plot(P(1,:),P(2,:),'.','markersize',30)for i=1:3text(P(1,i)+0.1,P(2,i),sprintf('class %g',Ac(i)))endaxis([0 3 0 3]);title('网络测试结果')xlabel('P(1,:)')ylabel('P(2,:)')P=[13, 0, 1.119, 1, 26.3;22, 0, 1.135, 1, 26.3;-15, 0, 0.9017, 1, 20.4;-30, 0, 0.9172, 1, 26.7;24, 0, 1.238,0.9704,28.2;3,24,1.119,1,26.3;0,52,1.089,1,26.3;0,-73,1.0889,1,26.3;1,28, 0.8748,1,26.3;-1,-39,1.1168,1,26.7;-2, 0, 1.495, 1, 26.3;0, -1, 1.438, 1, 26.3;4, 1,0.4964, 0.9021, 26.3;3, -1, 0.5533, 1.2357, 26.7;-5, 0, 1.7368, 1, 26.7;1, 0, 1.1045, 0.0202, 26.3;-2, 0, 1.1168, 1.3764, 26.7;-3, -1, 1.1655, 1.4418,27.5;3, 2, 1.0875, 0.748, 27.5;-3, 0, 1.1068, 2.2092, 26.3;4, 1, 0.9017, 1, 13.7;3, 2, 0.9017, 1, 14.9;-3, 1, 0.9172, 1, 13.7;-2, 0, 1.0198, 1.0809, 16.1;0, 1, 0.9172, 1, 13.7] T=[1, 0, 0, 0, 0 ;1, 0, 0, 0, 0 ;1, 0, 0, 0, 0 ;1, 0, 0, 0, 0 ;1, 0, 0, 0, 0; 0, 1, 0, 0, 0;0, 1, 0, 0, 0;0, 1, 0, 0, 0;0, 1, 0, 0, 0;0, 1, 0, 0, 0;0, 0, 1, 0, 0;0, 0, 1, 0, 0;0, 0, 1, 0, 0;0, 0, 1, 0, 0;0, 0, 1, 0, 0;0, 0, 0, 1, 0 ;0, 0, 0, 1, 0 ;0, 0, 0, 1, 0 ;0, 0, 0, 1, 0 ;0, 0, 0, 1, 0 ; 0, 0, 0, 0, 1;0, 0, 0, 0, 1;0, 0, 0, 0, 1;0, 0, 0, 0, 1;0, 0, 0, 0, 1 ];%期望输出plotpv(P,T);%描绘输入点图像。
RBF神经⽹络:原理详解和MATLAB实现RBF神经⽹络:原理详解和MATLAB实现——2020年2⽉2⽇⽬录RBF神经⽹络:原理详解和MATLAB实现 (1)⼀、径向基函数RBF (2)定义(Radial basis function——⼀种距离) (2)如何理解径向基函数与神经⽹络? (2)应⽤ (3)⼆、RBF神经⽹络的基本思想(从函数到函数的映射) (3)三、RBF神经⽹络模型 (3)(⼀)RBF神经⽹络神经元结构 (3)(⼆)⾼斯核函数 (6)四、基于⾼斯核的RBF神经⽹络拓扑结构 (7)五、RBF⽹络的学习算法 (9)(⼀)算法需要求解的参数 (9)0.确定输⼊向量 (9)1.径向基函数的中⼼(隐含层中⼼点) (9)2.⽅差(sigma) (10)3.初始化隐含层⾄输出层的连接权值 (10)4.初始化宽度向量 (12)(⼆)计算隐含层第j 个神经元的输出值zj (12)(三)计算输出层神经元的输出 (13)(四)权重参数的迭代计算 (13)六、RBF神经⽹络算法的MATLAB实现 (14)七、RBF神经⽹络学习算法的范例 (15)(⼀)简例 (15)(⼆)预测汽油⾟烷值 (15)⼋、参考资料 (19)⼀、径向基函数RBF定义(Radial basis function——⼀种距离)径向基函数是⼀个取值仅仅依赖于离原点距离的实值函数,也就是Φ(x)=Φ(‖x‖),或者还可以是到任意⼀点c的距离,c点称为中⼼点,也就是Φ(x,c)=Φ(‖x-c‖)。
任意⼀个满⾜Φ(x)=Φ(‖x‖)特性的函数Φ都叫做径向基函数。
标准的⼀般使⽤欧⽒距离(也叫做欧式径向基函数),尽管其他距离函数也是可以的。
在神经⽹络结构中,可以作为全连接层和ReLU层的主要函数。
⼀些径向函数代表性的⽤到近似给定的函数,这种近似可以被解释成⼀个简单的神经⽹络。
径向基函数在⽀持向量机中也被⽤做核函数。
常见的径向基函数有:⾼斯函数,⼆次函数,逆⼆次函数等。
Matlab工具箱中的BP与RBF函数Matlab神经网络工具箱中的函数非常丰富,给网络设置适宜的属性,可以加快网络的学习速度,缩短网络的学习进程。
限于篇幅,仅对本章所用到的函数进展介绍,其它的函数与其用法请读者参考联机文档和帮助。
1 BP与RBF网络创建函数在Matlab工具箱中有如表1所示的创建网络的函数,作为示例,这里只介绍函数newff、newcf、newrb和newrbe。
表 1 神经网络创建函数(1) newff函数功能:创建一个前馈BP神经网络。
调用格式:net = newff(PR,[S1S2...S Nl],{TF1 TF2...TF Nl},BTF,BLF,PF)参数说明:•PR - R个输入的最小、最大值构成的R×2矩阵;•S i–S NI层网络第i层的神经元个数;•TF i - 第i层的传递函数,可以是任意可导函数,默认为 'tansig',可设置为logsig,purelin等;•BTF -反向传播网络训练函数,默认为 'trainlm',可设置为trainbfg,trainrp,traingd等;•BLF -反向传播权值、阈值学习函数,默认为 'learngdm';•PF -功能函数,默认为'mse';(2) newcf函数功能:创建一个N层的层叠(cascade)BP网络调用格式:net = newcf(Pr,[S1 S2...SNl],{TF1 TF2...TFNl},BTF,BLF,PF)参数同函数newff。
(3) newrb函数功能:创建一个径向基神经网络。
径向基网络可以用来对一个函数进展逼近。
newrb函数用来创建一个径向基网络,它可以是两参数网络,也可以是四参数网络。
在网络的隐层添加神经元,直到网络满足指定的均方误差要求。
调用格式:net = newrb(P,T,GOAL,SPREAD)参数说明:•P:Q个输入向量构成的R×Q矩阵;•T:Q个期望输出向量构成的S×Q矩阵;•GOAL:均方误差要求,默认为0。
复杂网络聚类系数和平均路径长度计算的MATLAB源代码复杂网络的聚类系数和平均路径长度是度量网络结构特征的重要指标。
下面是MATLAB源代码,用于计算复杂网络的聚类系数和平均路径长度。
首先,我们需要定义一个函数,用于计算节点的聚集系数。
这个函数的输入参数是邻接矩阵和节点的索引,输出参数是节点的聚类系数。
```matlabfunction cc = clustering_coefficient(adj_matrix, node_index) neighbors = find(adj_matrix(node_index, :));k = length(neighbors);if k < 2cc = 0;elseconnected_count = 0;for i = 1:k-1for j = i+1:kif adj_matrix(neighbors(i), neighbors(j))connected_count = connected_count + 1;endendendcc = 2 * connected_count / (k * (k - 1));endend```接下来,我们定义一个函数,用于计算整个网络的平均聚合系数。
```matlabfunction avg_cc = average_clustering_coefficient(adj_matrix) n = size(adj_matrix, 1);cc = zeros(n, 1);for i = 1:ncc(i) = clustering_coefficient(adj_matrix, i);endavg_cc = sum(cc) / n;end```然后,我们需要计算网络的平均最短路径长度。
这里我们使用了Floyd算法来计算每对节点之间的最短路径。
```matlabfunction avg_path_length =average_shortest_path_length(adj_matrix)n = size(adj_matrix, 1);dist_matrix =graphallshortestpaths(sparse(double(adj_matrix)));avg_path_length = sum(dist_matrix(:)) / (n^2 - n);end```最后,我们可以使用这些函数来计算一个复杂网络的聚类系数和平均路径长度。
MATLAB 在RBF 神经网络模型中的应用高宁1,张建中2(1.安徽农业大学信息与计算机学院,安徽合肥230036;2.安徽建筑工业学院电子与信息工程学院,安徽合肥230022)摘要:本文介绍了RBF 神经网络的基本原理及主要特点,并举例说明了基于MATLAB 神经网络工具箱建立RBF 神经网络模型及实现仿真的方法。
关键词:仿真;MATLAB 神经网络工具箱;RBF 神经网络中图分类号:TP399文献标识码:A文章编码:1672-6251(2009)02-0110-02Application of RBF neural network model based on MATLABGAO Ning 1,ZHANG Jan-zhong 2(1.College of Information and computer,Anhui Agriculture University,Hefei 230036,China;2.College of Electronics and Information Enginner,Anhui Architecture University,Hefei 230022,China)Abstract:In this paper,the principle and characteristic of RBF neural network are explained,and the method of building and simulating RBF neural network model is introduced.Key words:Simulation;MATLAB neural network toolbox;RBF neural network人工神经网络具有大规模并行处理能力、分布式存储能力、自适应(学习)能力等特征,神经网络特有的非线性适应性信息处理能力,克服了传统人工智能方法的缺陷,已广泛应用于模式识别、信号处理等各种应用领域。
RBF代理模型Matlab代码RBF代理模型(Radial Basis Function Network,简称RBF网络)是一种人工神经网络模型,常用于函数逼近、分类和预测等问题。
RBF网络通常包括输入层、隐藏层和输出层,其中隐藏层使用径向基函数(Radial Basis Function)作为激活函数,具有灵活的逼近能力和较快的收敛速度,因而在实际问题中得到了广泛的应用。
Matlab作为一种强大的科学计算软件,提供了丰富的工具箱和函数,可以用于RBF代理模型的建模、仿真和优化。
1. RBF代理模型的基本原理RBF代理模型采用了径向基函数作为隐藏层的激活函数,其基本结构如下:输入层:接收外部输入的模式向量,通常对应于自变量;隐藏层:包含一组径向基函数,用于将输入模式映射到高维特征空间;输出层:根据隐藏层的输出,进行加权求和并经过激活函数得到最终的模型输出,通常对应因变量。
RBF代理模型的训练过程通常包括以下几个步骤:1)初始化隐层节点的中心和宽度参数;2)使用训练数据对RBF网络进行参数优化,例如采用最小二乘法或梯度下降法;3)验证模型的性能,例如计算拟合误差或分类准确率;4)根据验证结果对模型进行调整和优化,直至满足要求。
2. 在Matlab中实现RBF代理模型在Matlab中实现RBF代理模型,可以借助Matlab提供的神经网络工具箱(Neural Network Toolbox),以及优化工具箱(Optimization Toolbox)和统计工具箱(Statistics and Machine Learning Toolbox)。
以下是一个简单的示例代码,用于创建和训练RBF代理模型:```matlab步骤1:准备训练数据x = 0:0.1:2*pi;y = sin(x);步骤2:初始化RBF网络net = newrb(x, y);步骤3:训练RBF网络net.tr本人n = 'tr本人nlm';net.tr本人nParam.epochs = 100;net = tr本人n(net, x, y);步骤4:使用RBF网络进行预测x_test = 2.1:0.1:4*pi;y_pred = sim(net, x_test);步骤5:绘制结果plot(x, y, 'b', x_test, y_pred, 'r');legend('Ground Truth', 'Predicted');```在上述示例代码中,我们首先准备了训练数据x和对应的输出y,然后通过`newrb`函数初始化了一个RBF网络。
matlab基础编程代码Matlab基础编程代码是指使用Matlab语言进行编程的基础知识和技巧。
本文将介绍Matlab编程的一些基础知识和常用代码示例。
一、Matlab基础知识1. Matlab是一种高级编程语言和环境,适用于科学计算、数据分析和可视化等领域。
2. Matlab的语法类似于其他编程语言,但具有独特的特性和函数库。
3. Matlab提供了丰富的数学和矩阵运算函数,使其在科学计算和数据分析中具有广泛的应用。
二、Matlab编程基础代码示例1. 变量和赋值在Matlab中,可以使用等号将值赋给变量。
例如,可以使用以下代码将值5赋给变量x:```matlabx = 5;```2. 数组和矩阵Matlab中的数组和矩阵是非常重要的数据结构。
可以使用以下代码创建一个数组或矩阵:```matlabA = [1, 2, 3; 4, 5, 6; 7, 8, 9];```上述代码创建了一个3x3的矩阵A,其中包含了1到9的数字。
3. 条件语句在Matlab中,可以使用条件语句控制程序的执行流程。
以下是一个简单的if语句示例:```matlabx = 5;if x > 0disp('x是正数');elsedisp('x是负数');end```上述代码根据变量x的值输出不同的结果。
4. 循环语句循环语句是Matlab编程中常用的控制结构。
以下是一个for循环的示例:```matlabfor i = 1:5disp(i);end```上述代码将输出数字1到5。
5. 函数定义和调用在Matlab中,可以使用函数来封装一段可重复使用的代码。
以下是一个函数定义和调用的示例:```matlabfunction result = square(x)result = x^2;endy = square(4);disp(y);```上述代码定义了一个计算平方的函数,并调用该函数计算4的平方并输出结果。
径向基神经网络的介绍及其案例实现径向基(RBF)神经网络是一种常用的人工神经网络模型,它以径向基函数作为激活函数来进行模式分类和回归任务。
该网络在模式识别、函数逼近、数据挖掘等领域都具有良好的性能,并且具有较好的泛化能力。
引言:径向基(RBF)神经网络最早是由Broomhead和Lowe于1988年引入的,它是一种前馈式神经网络。
RBF神经网络的主要思想是以输入向量与一组高斯函数的基函数作为输入层,然后再通过隐藏层进行特征映射,最后通过输出层进行模式分类或回归。
1.RBF神经网络的结构:RBF神经网络包括输入层、隐藏层和输出层三层。
输入层负责接收输入向量,隐藏层负责特征映射,输出层负责输出结果。
输入层:输入层接收具有所要分类或回归的特征的数据,通常使用欧几里德距离计算输入层的神经元与输入向量之间的距离。
隐藏层:隐藏层是RBF神经网络的核心部分,它通过一组径向基函数来进行特征映射。
隐藏层的神经元数量通常和训练样本数量相同,每个神经元负责响应一个数据样本。
输出层:输出层根据隐藏层的输出结果进行模式分类或回归预测,并输出网络的最终结果。
2.RBF神经网络的训练:RBF神经网络的训练主要包括两个步骤:聚类和权值调整。
聚类:首先通过K-means等聚类算法将训练样本划分为若干个类别,每个类别对应一个隐藏层神经元。
这样可以将输入空间划分为若干个区域,每个区域中只有一个样本。
权值调整:通过最小化残差误差或最小化目标函数来优化隐藏层和输出层的权值。
常用的优化算法有最小二乘法、梯度下降法等。
3.RBF神经网络的案例实现:案例1:手写数字识别案例2:股票市场预测RBF神经网络也可以应用于股票市场的预测。
该案例中,RBF神经网络接收一组与股票相关的指标作为输入,通过隐藏层的特征映射将指标转化为更有意义的特征表示,最后通过输出层进行未来股价的回归预测。
该系统的训练样本为历史股票数据以及与之对应的未来股价。
结论:径向基(RBF)神经网络是一种应用广泛且效果良好的人工神经网络模型。
%一维输入,一维输出,逼近效果很好!1.基于聚类的RBF 网设计算法SamNum = 100; % 总样本数TestSamNum = 101; % 测试样本数InDim = 1; % 样本输入维数ClusterNum = 10; % 隐节点数,即聚类样本数Overlap = 1.0; % 隐节点重叠系数% 根据目标函数获得样本输入输出rand('state',sum(100*clock))NoiseVar = 0.1;Noise = NoiseVar*randn(1,SamNum);SamIn = 8*rand(1,SamNum)-4;SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2); SamOut = SamOutNoNoise + Noise;TestSamIn = -4:0.08:4;TestSamOut = 1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2);figurehold ongridplot(SamIn,SamOut,'k+')plot(TestSamIn,TestSamOut,'k--')xlabel('Input x');ylabel('Output y');Centers = SamIn(:,1:ClusterNum);NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号while 1,NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号% 按最小距离原则对所有样本进行分类for i = 1:SamNumAllDistance = dist(Centers',SamIn(:,i));[MinDist,Pos] = min(AllDistance);NumberInClusters(Pos) = NumberInClusters(Pos) + 1;IndexInClusters(Pos,NumberInClusters(Pos)) = i;end% 保存旧的聚类中心OldCenters = Centers;for i = 1:ClusterNumIndex = IndexInClusters(i,1:NumberInClusters(i));Centers(:,i) = mean(SamIn(:,Index)')';end% 判断新旧聚类中心是否一致,是则结束聚类EqualNum = sum(sum(Centers==OldCenters));if EqualNum == InDim*ClusterNum,break,endend% 计算各隐节点的扩展常数(宽度)AllDistances = dist(Centers',Centers); % 计算隐节点数据中心间的距离(矩阵)Maximum = max(max(AllDistances)); % 找出其中最大的一个距离for i = 1:ClusterNum % 将对角线上的0 替换为较大的值AllDistances(i,i) = Maximum+1;endSpreads = Overlap*min(AllDistances)'; % 以隐节点间的最小距离作为扩展常数% 计算各隐节点的输出权值Distance = dist(Centers',SamIn); % 计算各样本输入离各数据中心的距离SpreadsMat = repmat(Spreads,1,SamNum);HiddenUnitOut = radbas(Distance./SpreadsMat); % 计算隐节点输出阵HiddenUnitOutEx = [HiddenUnitOut' ones(SamNum,1)]'; % 考虑偏移W2Ex = SamOut*pinv(HiddenUnitOutEx); % 求广义输出权值W2 = W2Ex(:,1:ClusterNum); % 输出权值B2 = W2Ex(:,ClusterNum+1); % 偏移% 测试TestDistance = dist(Centers',TestSamIn);TestSpreadsMat = repmat(Spreads,1,TestSamNum);TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);TestNNOut = W2*TestHiddenUnitOut+B2;plot(TestSamIn,TestNNOut,'k-')W2B22.基于梯度法的RBF 网设计算法SamNum = 100; % 训练样本数TargetSamNum = 101; % 测试样本数InDim = 1; % 样本输入维数UnitNum = 10; % 隐节点数MaxEpoch = 5000; % 最大训练次数E0 = 0.9; % 目标误差% 根据目标函数获得样本输入输出rand('state',sum(100*clock))NoiseVar = 0.1;Noise = NoiseVar*randn(1,SamNum);SamIn = 8*rand(1,SamNum)-4;SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2); SamOut = SamOutNoNoise + Noise;TargetIn = -4:0.08:4;TargetOut = 1.1*(1-TargetIn+2*TargetIn.^2).*exp(-TargetIn.^2/2); figurehold ongridplot(SamIn,SamOut,'k+')plot(TargetIn,TargetOut,'k--')xlabel('Input x');ylabel('Output y');Center = 8*rand(InDim,UnitNum)-4;SP = 0.2*rand(1,UnitNum)+0.1;W = 0.2*rand(1,UnitNum)-0.1;lrCent = 0.001; % 隐节点数据中心学习系数lrSP = 0.001; % 隐节点扩展常数学习系数lrW = 0.001; % 隐节点输出权值学习系数ErrHistory = []; % 用于记录每次参数调整后的训练误差for epoch = 1:MaxEpochAllDist = dist(Center',SamIn);SPMat = repmat(SP',1,SamNum);UnitOut = radbas(AllDist./SPMat);NetOut = W*UnitOut;Error = SamOut-NetOut;%停止学习判断SSE = sumsqr(Error)% 记录每次权值调整后的训练误差ErrHistory = [ErrHistory SSE];if SSE<E0, break, endfor i = 1:UnitNumCentGrad = (SamIn-repmat(Center(:,i),1,SamNum))...*(Error.*UnitOut(i,:)*W(i)/(SP(i)^2))';SPGrad = AllDist(i,:).^2*(Error.*UnitOut(i,:)*W(i)/(SP(i)^3))'; WGrad = Error*UnitOut(i,:)';Center(:,i) = Center(:,i) + lrCent*CentGrad;SP(i) = SP(i) + lrSP*SPGrad;W(i) = W(i) + lrW*WGrad;endend% 测试TestDistance = dist(Center',TargetIn);TestSpreadsMat = repmat(SP',1,TargetSamNum);TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat); TestNNOut = W*TestHiddenUnitOut;plot(TargetIn,TestNNOut,'k-')% 绘制学习误差曲线figurehold ongrid[xx,Num] = size(ErrHistory);plot(1:Num,ErrHistory,'k-');3.基于OLS 的RBF 网设计算法SamNum = 100; % 训练样本数TestSamNum = 101; % 测试样本数SP = 0.6; % 隐节点扩展常数ErrorLimit = 0.9; % 目标误差% 根据目标函数获得样本输入输出rand('state',sum(100*clock))NoiseVar = 0.1;Noise = NoiseVar*randn(1,SamNum);SamIn = 8*rand(1,SamNum)-4;SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2); SamOut = SamOutNoNoise + Noise;TestSamIn = -4:0.08:4;TestSamOut = 1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2); figurehold ongridplot(SamIn,SamOut,'k+')plot(TestSamIn,TestSamOut,'k--')xlabel('Input x');ylabel('Output y');[InDim,MaxUnitNum] = size(SamIn); % 样本输入维数和最大允许隐节点数% 计算隐节点输出阵Distance = dist(SamIn',SamIn);HiddenUnitOut = radbas(Distance/SP);PosSelected = [];VectorsSelected = [];HiddenUnitOutSelected = [];ErrHistory = []; % 用于记录每次增加隐节点后的训练误差VectorsSelectFrom = HiddenUnitOut;dd = sum((SamOut.*SamOut)')';for k = 1 : MaxUnitNum% 计算各隐节点输出矢量与目标输出矢量的夹角平方值PP = sum(VectorsSelectFrom.*VectorsSelectFrom)';Denominator = dd * PP';[xxx,SelectedNum] = size(PosSelected);if SelectedNum>0,[lin,xxx] = size(Denominator);Denominator(:,PosSelected) = ones(lin,1);endAngle = ((SamOut*VectorsSelectFrom) .^ 2) ./ Denominator;% 选择具有最大投影的矢量,得到相应的数据中心[value,pos] = max(Angle);PosSelected = [PosSelected pos];% 计算RBF 网训练误差HiddenUnitOutSelected = [HiddenUnitOutSelected; HiddenUnitOut(pos,:)]; HiddenUnitOutEx = [HiddenUnitOutSelected; ones(1,SamNum)];W2Ex = SamOut*pinv(HiddenUnitOutEx); % 用广义逆求广义输出权值W2 = W2Ex(:,1:k); % 得到输出权值B2 = W2Ex(:,k+1); % 得到偏移NNOut = W2*HiddenUnitOutSelected+B2; % 计算RBF 网输出SSE = sumsqr(SamOut-NNOut)% 记录每次增加隐节点后的训练误差ErrHistory = [ErrHistory SSE];if SSE < ErrorLimit, break, end% 作Gram-Schmidt 正交化NewVector = VectorsSelectFrom(:,pos);ProjectionLen = NewVector' * VectorsSelectFrom / (NewVector'*NewVector); VectorsSelectFrom = VectorsSelectFrom - NewVector * ProjectionLen;endUnitCenters = SamIn(PosSelected);%%%%%%%%%%%% 测试TestDistance = dist(UnitCenters',TestSamIn);%%%%%%%% TestHiddenUnitOut = radbas(TestDistance/SP);TestNNOut = W2*TestHiddenUnitOut+B2;plot(TestSamIn,TestNNOut,'k-')kUnitCentersW2B2。