实验内容:在MATLAB下,调用工具箱newrb,训练RBF神经网络使之能够利用历史数据预测未来时间序列数据。
实验用的是一个正弦电压波形,在Simulink中仿真后将数据导入excel,再读取excel中的波形数据。用前一半的数据做训练样本,后一半的数据用来检验RBF神经网络的预测准确性。
训练时,以21个电压点为一组,第一组样本第1到第20个电压为神经网络输入,第21个电压为训练目标,第二组样本第2到第21个电压为输入,第22个电压为训练目标;
附MATLAB代码:
clc
clear all
%训练正常波形
y1=xlsread('0.1s 60Hz normal.xls');%读取波形
n1 =zeros(20,length(y1)/2-20);%设置输入向量
for n=1:length(y1)/2-20
column=zeros(1,20);
for i=1:20
column(i)=y1(n+i);
end
n1(:,n)=column;
end
x1 = zeros(1,length(y1)/2-20);%设置输出向量
for n=1:length(y1)/2-20
x1(n)=y1(n+20);
end
xn_train = n1; % 训练样本
dn_train = x1; % 训练目标
P = xn_train;
T = dn_train;
goal = 0.5; % 训练误差的平方和(默认为0)
spread = 10; % 此值越大,需要的神经元就越少(默认为1)
MN = size(xn_train,2); % 最大神经元数(默认为训练样本个数)
DF = 1; % 显示间隔(默认为25)
normalnet = newrb(P,T,goal,spread,MN,DF);
%测试
%拟合后的神经网络预测整个波形
figure(1)
ytest1=xlsread('0.1s 60Hz normal.xls');
ytest_p=zeros(20,length(y1)-20);%测试预测能力
for n=1:length(y1)-20
column=zeros(1,20);
for i=1:20
column(i)=y1(n+i);
end
ytest_p(:,n)=column;
end
yout=zeros(1,length(y1)-20);
%前20个点默认与实际波形相同,从第21个点开始预测
for i=1:20
yout(i)=ytest1(i);
end
for i=21:length(yout)
yout(i)=sim(normalnet,ytest_p(:,i-20));
end
t=[0:0.2/length(yout):0.2-0.2/length(yout)];
plot(t,yout)
hold on
n=[0:0.2/length(yout):(length(ytest1)-1)*0.2/length(yout)];
plot(n,ytest1,'r')
hold on
legend('预测波形','实际波形')
xlabel('时间');
ylabel('电压');
神经网络训练:
可以看到0-0.1s前一半数据是完全重合的,后一半预测部分稍有偏差不过问题不大。