📄 simplerbf.m
字号:
%一个最基本的rbf算法,学习算法采用伪逆函数
%
%
%
%
%
%
%
%
%
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
%定义用到的变量
r=1; %领域半径,人为设定
nodenum=0; %隐层节点数,由实际数据与r共同决定
inputdata=[]; %输入矩阵
inputpath=' '; %存储原始输入数据的路径
nodeout=[]; %隐层输入阵
netout=[]; %网络输出阵
weight=[]; %输出权值阵,也是唯一的权值
inputnum=0; %输入维数
outputnum=0; %输出维数
center=[]; %聚类中心
numtrain=0; %学习样本的个数
row=0; %学习样本的个数
simrow=0; %全部样本的个数
numtest=0; %泛化样本的个数
strength=1; %归一化处理时用到的范围,一般为1
yout=[]; %输出的期望值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%变量的初始化
r=1;
inputnum=9;
inputpath='e:\yinjia\data\yearsun.dat';
outputnum=1;
simrow=290;
source=load(inputpath);
%保存一个source的副本,为反归一化做准备
copysource=source;
%归一化处理
source=normalize(source,strength);
yout=source(inputnum+1:simrow+inputnum);
inputdata=phasespace(source,inputnum,simrow);
row=250;
numtrain=row;
numtest=simrow-row;
%把第一人输入变量定为初始的中心
%中心的位置在初始化后,不会再变化
center=inputdata(1,:)';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%开始进行简单的聚类
%其基本思想是:给定一个固定的邻域半径,在中心点邻域半径内的点就算作
%是该邻域的点;半径外的点,取第一个不是半径内的点做为新的中心点
%设计一个函数iscenter,来计算一个点是否为中心点。
for step=2:row
if iscenter(inputdata(step,:)',center,r)
center=[center inputdata(step,:)'];
nodenum=nodenum+1;
end % this end for iscenter(inputdata(step,:))
end % this end for step=2:row
%聚类完成.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%准备进行神经网络的前向计算
[centerrow nodenum]=size(center);
%网络的初始化
nodeout=zeros(row,nodenum);
netout=zeros(row,outputnum);
weight=zeros(nodenum,outputnum);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%网络的计算
for step=1:row
for step1=1:nodenum
nodeout(step,step1)=GaussRadialBasisFunction(inputdata(step,:)',...
center(:,step1),r);
end % this end for step1=1:nodenum
end %this end for step=1:row
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%用伪逆来计算权值
weight=pinv(nodeout)*yout(1:250);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%进行仿真
for step=1:simrow
for step1=1:nodenum
nodeout(step,step1)=GaussRadialBasisFunction(inputdata(step,:)',...
center(:,step1),r);
end % this end for step1=1:nodenum
end %this end for step=1:simrow
mydata=nodeout*weight;
%反归一化
mydata=unnomal(mydata,copysource,strength);
rldata=copysource(inputnum+1:inputnum+simrow);
plot(rldata);hold on;plot(mydata,'r');
%计算一个评价函数
rmsetest=(norm(rldata(numtrain+1:simrow)-mydata(numtrain+1:simrow))...
^2/(numtest-1))^0.5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -