【預(yù)測(cè)模型】基于Elman神經(jīng)網(wǎng)絡(luò)房?jī)r(jià)預(yù)測(cè)matlab源碼
一、簡(jiǎn)介
?? ? ?介紹了極限學(xué)習(xí)機(jī)ELM的網(wǎng)絡(luò)結(jié)構(gòu)以及學(xué)習(xí)訓(xùn)練算法。


二、源代碼
% elm_stockpredict.m
%% 清除工作空間中的變量和圖形
clear,clc
close all
%% 1.加載337期上證指數(shù)開(kāi)盤(pán)價(jià)格
load matlab.mat
whos
rng(1)
%% ARMA模型
z=iddata(y1);
m=armax(z(1:19),'na',2,'nc',1);
yp = predict(m,y1,1);
yp=yp';
yp=yp(:,157:end);
%% 2.構(gòu)造樣本集
% 數(shù)據(jù)個(gè)數(shù)
price=y1;
n=length(price);
% 確保price為列向量
price=price(:);
% x(n) 由x(n-1),x(n-2),...,x(n-L)共L個(gè)數(shù)預(yù)測(cè)得到.
L = 6;
% price_n:每列為一個(gè)構(gòu)造完畢的樣本,共n-L個(gè)樣本
price_n = zeros(L+1, n-L);
for i=1:n-L
? ?price_n(:,i) = price(i:i+L);
end
%% 劃分訓(xùn)練、測(cè)試樣本
% 將前280份數(shù)據(jù)劃分為訓(xùn)練樣本
% 后51份數(shù)據(jù)劃分為測(cè)試樣本
trainx = price_n(1:6, 1:150);
trainy = price_n(7, 1:150);
testx = price_n(1:6, 151:end);
testy = price_n(7, 151:end);
%% 創(chuàng)建Elman神經(jīng)網(wǎng)絡(luò)
% 包含15個(gè)神經(jīng)元,訓(xùn)練函數(shù)為traingdx
net=elmannet(1:2,15,'traingdx');
% 設(shè)置顯示級(jí)別
net.trainParam.show=1;
% 最大迭代次數(shù)為2000次
net.trainParam.epochs=2000;
% 誤差容限,達(dá)到此誤差就可以停止訓(xùn)練
net.trainParam.goal=0.00001;
% 最多驗(yàn)證失敗次數(shù)
net.trainParam.max_fail=5;
% 對(duì)網(wǎng)絡(luò)進(jìn)行初始化
net=init(net);
%% 網(wǎng)絡(luò)訓(xùn)練
%訓(xùn)練數(shù)據(jù)歸一化
[trainx1, st1] = mapminmax(trainx);
[trainy1, st2] = mapminmax(trainy);
% 測(cè)試數(shù)據(jù)做與訓(xùn)練數(shù)據(jù)相同的歸一化操作
testx1 = mapminmax('apply',testx,st1);
testy1 = mapminmax('apply',testy,st2);
% 輸入訓(xùn)練樣本進(jìn)行訓(xùn)練
[net,per] = train(net,trainx1,trainy1);
%% 測(cè)試。輸入歸一化后的數(shù)據(jù),再對(duì)實(shí)際輸出進(jìn)行反歸一化
% 將訓(xùn)練數(shù)據(jù)輸入網(wǎng)絡(luò)進(jìn)行測(cè)試
train_ty1 = sim(net, trainx1);
train_ty = mapminmax('reverse', train_ty1, st2);
% 將測(cè)試數(shù)據(jù)輸入網(wǎng)絡(luò)進(jìn)行測(cè)試
test_ty1 = sim(net, testx1);
test_ty = mapminmax('reverse', test_ty1, st2);
% 顯示真實(shí)值
plot(x,testy,'b-');
hold on
% 顯示神經(jīng)網(wǎng)絡(luò)的輸出值
plot(x,test_ty,'r--')
% 顯示ARMA的輸出值
plot(x,yp,'k--')
legend('real price','prediction price of Elman','prediction price of ARMA')
title('Test Results');
% 顯示均方誤差
mse2 = mse(test_ty - testy);
fprintf(' ? ?Elman_mse = \n ? ? %f\n', mse2)
mse3 = mse(yp - testy);
fprintf(' ? ?ARMA_mse = \n ? ? %f\n', mse3)
三、運(yùn)行結(jié)果


?