关于RBF神经网络预测的问题
各位高手们,大家好,我是刚接触RBF的新手,我打算用RBF做预测,数据是60个,前40个做样本训练,后20个做测试。先将输入数据归一化,即每个数除以总样本中的最大值,然后...
各位高手们,大家好,我是刚接触RBF的新手,我打算用RBF做预测,数据是60个,前40个做样本训练,后20个做测试。先将输入数据归一化,即每个数除以总样本中的最大值,然后想在输入层与隐藏层加入一输入的预处理,算法是加权,算法见图片,
其中ki——调整因子,其初值为O与1之间一个较小的正数,xn-i就是n-i时刻的实际值
样本1:
1~20
样本2:
2~21
…………
样本20:
20~39
最后想的是用k-均值聚类RBF
我想问的这种想法可行吗?
还请大家帮忙给编个MATLAB程序有预测结果图显示(包括没有预处理和加了预处理的)~我的论文发表急用,谢谢 大家了~~
还有就是MATLAB里的newrb 默认是什么算法???
图片 展开
其中ki——调整因子,其初值为O与1之间一个较小的正数,xn-i就是n-i时刻的实际值
样本1:
1~20
样本2:
2~21
…………
样本20:
20~39
最后想的是用k-均值聚类RBF
我想问的这种想法可行吗?
还请大家帮忙给编个MATLAB程序有预测结果图显示(包括没有预处理和加了预处理的)~我的论文发表急用,谢谢 大家了~~
还有就是MATLAB里的newrb 默认是什么算法???
图片 展开
1个回答
展开全部
给你个RBF预测的程序,你根据程序自己改下就可以了
clear all;
x=[];
T=[];
x(1)=0.22;
k=4;
n=900;
N=400;
% 产生logistic序列,前100个去除
for i=1:n
x(i+1)=k*x(i)*(1-x(i));
end
X(1:800)=x(101:900);
% 用X的前400个数据训练RBF神经网络
for j=1:N
P(1:8,j)=X(j:j+7)';
end
T=X(9:408); % 目标数据
net1=newrb(P,T,0.001,1); % 训练RBF神经网络
N1=300;
% 选取X的400—700个数据进行RBF神经网络检验
for j=1:N1
P1(1:8,j)=X(j+400:j+7+400)';
end
T1=X(409:708); % 目标数据
%仿真验证
a=sim(net1,P1); % 对检验数据的预测结果 %sim是仿真该网络的意思
e = T1-a; % 一步预测误差
mse = sqrt(e*e')/size(e,2) % 均方误差 Mean Square Error
%画图描绘仿真结果
figure(2)
plot(X(1:200));
axis([1 200 -0.1 1.1]);
title('logistic混沌序列');
xlabel('t');
ylabel('magnitude');
figure(3)
plot(1:300,T1,'b',1:300,a,'r*');
h = legend('混沌序列','RBF神经网络一步预测值');
axis([1 300 -0.5 1.5]);
hold on
title('混沌序列与一步预测值');
xlabel('t');
ylabel('magnitude');
figure(4);
plot(e,'b-');
axis([1 300 -0.02 0.02]);
title('预测误差e');
xlabel('t');
ylabel('magnitude');
至于你要K均值聚类的话:
%一个最基本的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
还有几段小程序,你应该可以自己编写出来的。
clear all;
x=[];
T=[];
x(1)=0.22;
k=4;
n=900;
N=400;
% 产生logistic序列,前100个去除
for i=1:n
x(i+1)=k*x(i)*(1-x(i));
end
X(1:800)=x(101:900);
% 用X的前400个数据训练RBF神经网络
for j=1:N
P(1:8,j)=X(j:j+7)';
end
T=X(9:408); % 目标数据
net1=newrb(P,T,0.001,1); % 训练RBF神经网络
N1=300;
% 选取X的400—700个数据进行RBF神经网络检验
for j=1:N1
P1(1:8,j)=X(j+400:j+7+400)';
end
T1=X(409:708); % 目标数据
%仿真验证
a=sim(net1,P1); % 对检验数据的预测结果 %sim是仿真该网络的意思
e = T1-a; % 一步预测误差
mse = sqrt(e*e')/size(e,2) % 均方误差 Mean Square Error
%画图描绘仿真结果
figure(2)
plot(X(1:200));
axis([1 200 -0.1 1.1]);
title('logistic混沌序列');
xlabel('t');
ylabel('magnitude');
figure(3)
plot(1:300,T1,'b',1:300,a,'r*');
h = legend('混沌序列','RBF神经网络一步预测值');
axis([1 300 -0.5 1.5]);
hold on
title('混沌序列与一步预测值');
xlabel('t');
ylabel('magnitude');
figure(4);
plot(e,'b-');
axis([1 300 -0.02 0.02]);
title('预测误差e');
xlabel('t');
ylabel('magnitude');
至于你要K均值聚类的话:
%一个最基本的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
还有几段小程序,你应该可以自己编写出来的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询