RBF网络的matlab实现

一、用工具箱实现函数拟合

参考:http://blog.csdn.net/zb1165048017/article/details/49407075

(1)newrb()

该函数可以用来设计一个近似径向基网络(approximate RBF)。调用格式为:

[net,tr]=newrb(P,T,GOAL,SPREAD,MN,DF)

其中P为Q组输入向量组成的R*Q位矩阵,T为Q组目标分类向量组成的S*Q维矩阵。GOAL为均方误差目标(Mean Squard Error Goal),默认为0.0;SPREAD为径向基函数的扩展速度,默认为1;MN为神经元的最大数目,默认为Q;DF维两次显示之间所添加的神经元数目,默认为25;ner为返回值,一个RBF网络,tr为返回值,训练记录。

用newrb()创建RBF网络是一个不断尝试的过程(从程序的运行可以看出来),在创建过程中,需要不断增加中间层神经元的和个数,知道网络的输出误差满足预先设定的值为止。

(2)newrbe()

该函数用于设计一个精确径向基网络(exact RBF),调用格式为:

net=newrbe(P,T,SPREAD)

其中P为Q组输入向量组成的R*Q维矩阵,T为Q组目标分类向量组成的S*Q维矩阵;SPREAD为径向基函数的扩展速度,默认为1

和newrb()不同的是,newrbe()能够基于设计向量快速,无误差地设计一个径向基网络。

(3)radbas()

该函数为径向基传递函数,调用格式为

A=radbas(N)

info=radbas(code)

其中N为输入(列)向量的S*Q维矩阵,A为函数返回矩阵,与N一一对应,即N的每个元素通过径向基函数得到A;info=radbas(code)表示根据code值的不同返回有关函数的不同信息。包括

derive——返回导函数的名称

name——返回函数全称

output——返回输入范围

active——返回可用输入范围

使用exact径向基网络来实现非线性的函数回归:

%%清空环境变量  
clc
clear
%%产生输入输出数据  
%设置步长  
interval=0.01;
%产生x1,x2  
x1=-1.5:interval:1.5;
x2=-1.5:interval:1.5;
%按照函数先求的响应的函数值,作为网络的输出  
F=20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
%%网络建立和训练  
%网络建立,输入为[x1;x2],输出为F。spread使用默认  
net=newrbe([x1;x2],F);
%%网络的效果验证  
%将原数据回带,测试网络效果  
ty=sim(net,[x1;x2]);
%%使用图像来看网络对非线性函数的拟合效果  
figure
plot3(x1,x2,F,‘rd‘);
hold on;
plot3(x1,x2,ty,‘b-.‘);
view(113,36);
title(‘可视化的方法观察严格的RBF神经网络的拟合效果‘);
xlabel(‘x1‘)
ylabel(‘x2‘)
zlabel(‘F‘)
grid on

  结果:

二、自编函数实现拟合

clear;
%X=1:100;
X=[-4*pi:0.07*pi:8*pi];
P=length(X);
Y=[];
M=10;
centers=[];
deltas=[];
weights=[];
set = {};
gap=0.1;
%**************************************************************************
%构造训练样本X,Y
X=[-4*pi:0.07*pi:8*pi];
for i=1:P
    Y(i)=sin(X(i));
end
%**************************************************************************
for i=1:M                          %先随意初始化M个中心点
    centers(i)= X( i*floor( P/10 ) );
end
done=0;
while(~done)
    for i=1:M
       set{i}=[];
    end
    for i=1:P
        distance=100;
        for j=1:M
            curr=abs(X(i)-centers(j));
            if curr<distance
                sets=j;
                distance=curr;
            end
        end
        set{sets}=[set{sets},X(i)];        %聚类,找出M个中心点,并且样本分布在这十个点周围
    end
    for i=1:M
        new_centers(i)=sum(set{i})/length(set{i}); %重新计算中心点:M个类里每个类的中心点
    end
    done=0;
     for i=1:M
          sum1(i)=abs(centers(i)-new_centers(i));
     end
     if sum(sum1)>gap
            done=0;      %不断循环,直到找到最佳的中心点;
            centers=new_centers;
     else
            done=1;
     end
end

for i=1:M
    curr=abs( centers-centers(i));
    [curr_2,b]=min(curr);
    curr(b)=100;
    curr_2=min(curr);
    deltas(i)=1*curr_2;
end
%{
for i=1:M
    sum=0;
    num=length(set{i});
    for j=1:num
        sum=sum+(set{i}(j)-centers(i))^2;
    end
    deltas(i)=(sum)^0.5/num;
end
%}
for i=1:P
    for j=1:M
        curr=abs(X(i)-centers(j));
        K(i,j)=exp( -curr^2/(2*deltas(j)^2) );  %隐含层的输出
    end
end
%计算权值矩阵
weights=inv(K‘*K)*K‘*Y‘;
%**************************************************************************
%测试计算出函数的情况
x_test=[-4*pi:0.07*pi:8*pi];
for i=1:length(x_test)
    sum=0;
    for j=1:M
        curr=weights(j)*exp(-abs(x_test(i)-centers(j))^2/(2*deltas(j)^2));
        sum=sum+curr;
    end
    y_test(i)=sum;
end
figure(1)
scatter(X,Y,‘k+‘);
hold on;
plot(x_test,y_test,‘r.-‘)

  

结果:

三、工具箱函数的RBF分类

train_data=LowDimFaces(1:10,:);  %train_data是一个10*20维的矩阵,其中行表示样本数,列数表示特征个数
train_label=[ones(1,5),zeros(1,5)]; %行向量

display(‘读入测试数据...‘);

test_data=LowDimFaces(201:210,:);
test_label=[ones(1,5),zeros(1,5)];

[train_data,minX,maxX] = premnmx(train_data);
test_data = tramnmx(test_data,minX,maxX) ;

%网络建立,输入为[x1;x2],输出为F。spread使用默认  
net=newrbe(train_data‘,train_label);
%%网络的效果验证  
%将原数据回带,测试网络效果  
ty=sim(net,test_data‘);
%%使用图像来看网络对非线性函数的拟合效果  
Y=[];
hitnum=0;
for i=1:10
    if ty(i)>0.5
        Y(i)=1;
    else
        Y(i)=0;
    end
    if Y(i)==test_label(i)
        hitnum=hitnum+1;
    end
end
fprintf(‘训练集中结果的正确率是%f%%\n‘,100*hitnum/10);

  

四、自编函数实现RBF分类

clear;
clc;
M=10;
centers=[;];
deltas=[];
weights=[];
set = {};
gap=0.1;
%**************************************************************************
XA=ones(1,500);
YA=ones(1,500);  %初始化A类的输入数据
XB=ones(1,500);
YB=ones(1,500);  %初始化B类的输入数据
for i=1:500
    XA(i)=cos(2*pi*(i+8)/25-0.25*pi)*(i+8)/25;
    YA(i)=sin(2*pi*(i+8)/25-0.25*pi)*(i+8)/25-0.25;
    XB(i)=sin(2*pi*(i+8)/25+0.25*pi)*(i+8)/-25;
    YB(i)=cos(2*pi*(i+8)/25+0.25*pi)*(i+8)/25-0.25;
end
scatter(XA,YA,20,‘b‘);
hold on;
scatter(XB,YB,20,‘k‘);
hold off;
X1=cat(1,XA,YA);
X2=cat(1,XB,YB);
X=cat(2,X1,X2);  %得到训练数据集X,Y
Y=zeros(1,1000);
Y(1,1:500)=1;
k=rand(1,1000);
[m,n]=sort(k);
X=X(:,n(1:1000));
Y=Y(:,n(1:1000));
%**************************************************************************
[X,minX,maxX] = premnmx(X);
P=length(X);
for i=1:M                          %先随意初始化M个中心点
    centers(:,i)= X(:,i*floor( P/10 ) );
end
done=0;
while(~done)
    for i=1:M
       set{i}=[;];
    end
    for i=1:P
        distance=100;
        for j=1:M
            curr=norm(X(:,i)-centers(:,j));
            if curr<distance
                sets=j;
                distance=curr;
            end
        end
        set{sets}=[set{sets},X(:,i)];        %聚类,找出M个中心点,并且样本分布在这十个点周围
    end
    for i=1:M
        new_centers(:,i)=sum(set{i}‘)‘/length(set{i}); %重新计算中心点:M个类里每个类的中心点
    end
    done=0;
     for i=1:M
          sum1(i)=norm(centers(:,i)-new_centers(:,i));
     end
     if sum(sum1)>gap
            done=0;      %不断循环,直到找到最佳的中心点;
            centers=new_centers;
     else
            done=1;
     end
end

for i=1:M
    curr=[;];
    curr=abs( bsxfun(@minus,centers,centers(:,i)));
    k=100;
    m=norm(curr(:,j));
    for j=1:M
        if m<k && m~=0
            k=m;
        end
    end
    deltas(i)=k;
end

for i=1:P
    for j=1:M
        curr=norm(X(:,i)-centers(:,j));
        K(i,j)=exp( -curr^2/(2*deltas(j)^2) );  %隐含层的输出
    end
end
%计算权值矩阵
weights=inv(K‘*K)*K‘*Y‘;
%**************************************************************************
%测试计算出函数的情况
x_test=X;
for i=1:length(x_test)
    sum=0;
    for j=1:M
        curr=weights(j)*exp(-norm(x_test(:,i)-centers(:,j))^2/(2*deltas(j)^2));
        sum=sum+curr;
    end
    y_test(i)=sum;
end
y_test(find(y_test<0.5))=0;
y_test(find(y_test>=0.5))=1;
count=0;
for j=1:length(y_test)
    if y_test(j)==Y(j)
        count=count+1;
    end
end
fprintf(‘分类正确率为:%.2f%%‘,100*count/length(y_test));

  

时间: 2024-11-25 17:34:24

RBF网络的matlab实现的相关文章

RBF网络

华夏35度 Data Mining 径向基函数(RBF)神经网络 RBF网络能够逼近任意的非线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近.时间序列分析.数据分类.模式识别.信息处理.图像处理.系统建模.控制和故障诊断等. 简单说明一下为什么RBF网络学习收敛得比较快.当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络.由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的

径向基网络(RBF network)

来源:http://blog.csdn.net/zouxy09/article/details/13297881 1.径向基函数 径向基函数(Radical Basis Function,RBF)方法是Powell在1985年提出的.所谓径向基函数,其实就是某种沿径向对称的标量函数.通常定义为空间中任一点x到某一中心c之间欧氏距离的单调函数,可记作k(||x-c||),其作用往往是局部的,即当x远离c时函数取值很小.例如高斯径向基函数: 当年径向基函数的诞生主要是为了解决多变量插值的问题.可以看

径向基网络(RBF network)之BP监督训练

径向基网络(RBF network)之BP监督训练 转载:http://blog.csdn.net/zouxy09/article/details/13297881 分类: 机器学习 神经网络 C/C++编程2013-10-28 18:17 3083人阅读 评论(1) 收藏 举报 神经网络机器学习RBF 径向基网络(RBF network)之BP监督训练 [email protected] http://blog.csdn.net/zouxy09 之前看了流行学习的时候,感觉它很神奇,可以将一个

RBF神经网络和BP神经网络的关系

作者:李瞬生链接:https://www.zhihu.com/question/44328472/answer/128973724来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. BP Neural Network - 使用 Automatic Differentiation (Backpropagation) 进行导数计算的层级图模型 (layer-by-layer graphical model) 只要模型是一层一层的,并使用AD/BP算法,就能称作 BP Ne

机器学习笔记-CNN-神经网络

转自:http://blog.csdn.net/kevin_bobolkevin/article/details/50494034 深度学习之一---什么是神经网络 刚开始学习深度学习,最近把所学的整理了一下,也是对所学的一个总结. 深度学习的概念源于人工神经网络的研究.为了更好地理解深度学习,首先要先了解下什么是神经网络,它的工作原理.应用及发展. 逻辑性的思维是指根据逻辑规则进行推理的过程:它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理:这一过程可以写成串行的指令

一百行写小世界网络和无标度网络

曾经觉得能写很长的代码就是厉害的表现,随着学习的深入,对于好的代码有了更加深刻的认识,一个好的代码应该: 1.可读性.好的代码不仅能让机器读懂,更要让看代码的人读懂----合理布局,逻辑清晰. 2.充分发挥语言的优势,比如接下来的matlab矩阵化编程. 3.占用尽可能小的内存,运行尽量快,输出结果尽量容易处理.并在此之间找到平衡. ..... 需要说明的是,如果没有对复杂网络有基本的了解,下面的东西没有看下去的必要.关于小世界网络和无标度网络,可以参考Watts DJ和Strogatz SH的

BP神经网络及matlab实现

本文主要内容包括: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  找到.这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类.不同品种的Iris花的花萼长度.花萼

神经网络及其简单实现(MATLAB)

转自:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html 第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  找到.这里简要介绍一下Iris数据集: 有一批Iris花,已知这批Iris花可分为3个品种,现需要对其进行分类.不同品种的Iris花的花萼长度.花萼宽度.花瓣长度.花瓣宽

RBF神经网络学习算法及与多层感知器的比较

对于RBF神经网络的原理已经在我的博文<机器学习之径向基神经网络(RBF NN)>中介绍过,这里不再重复.今天要介绍的是常用的RBF神经网络学习算法及RBF神经网络与多层感知器网络的对比. 一.RBF神经网络学习算法 广义的RBF神经网络结构如下图所示: N-M-L结构对应着N维输入,M个数据中心点centers,L个输出. RBF 网络常用学习算法 RBF 网络的设计包括结构设计和参数设计.结构设计主要解决如何确定网络隐节点数的问题.参数设计一般需考虑包括3种参数:各基函数的数据中心和扩展常