實驗内容:在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前一半資料是完全重合的,後一半預測部分稍有偏差不過問題不大。