1. 程式人生 > 其它 >【房價預測】基於matlab Elman神經網路房價預測【含Matlab原始碼 589期】

【房價預測】基於matlab Elman神經網路房價預測【含Matlab原始碼 589期】

一、簡介

1 Elman網路特點
Elman神經網路是一種典型的動態遞迴神經網路,它是在BP網路基本結構的基礎上,在隱含層增加一個承接層,作為一步延時運算元,達到記憶的目的,從而使系統具有適應時變特性的能力,增強了網路的全域性穩定性,它比前饋型神經網路具有更強的計算能力,還可以用來解決快速尋優問題。
2 Elman網路結構
Elman神經網路是應用較為廣泛的一種典型的反饋型神經網路模型。一般分為四層:輸入層、隱層、承接層和輸出層。其輸入層、隱層和輸出層的連線類似於前饋網路。輸入層的單元僅起到訊號傳輸作用,輸出層單元起到加權作用。隱層單元有線性和非線性兩類激勵函式,通常激勵函式取Signmoid非線性函式。而承接層則用來記憶隱層單元前一時刻的輸出值,可以認為是一個有一步遲延的延時運算元。隱層的輸出通過承接層的延遲與儲存,自聯到隱層的輸入,這種自聯方式使其對歷史資料具有敏感性,內部反饋網路的加入增加了網路本身處理動態資訊的能力,從而達到動態建模的目的。其結構圖如下圖1所示,

其網路的數學表示式為:




3 Elman網路與BP網路的區別
它是動態反饋型網路,它能夠內部反饋、儲存和利用過去時刻輸出資訊,既可以實現靜態系統的建模,還能實現動態系統的對映並直接反應系統的動態特性,在計算能力及網路穩定性方面都比BP神經網路更勝一籌。
4 Elman網路缺點
與BP神經網路一樣,演算法都是採用基於梯度下降法,會出現訓練速度慢和容易陷入區域性極小點的缺點,對神經網路的訓練較難達到全域性最優。

二、原始碼

% elm_stockpredict.m

%% 清除工作空間中的變數和圖形
clear,clc
close all

%% 1.載入337期上證指數開盤價格
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.構造樣本集
% 資料個數
price=y1;
n=length(price);

% 確保price為列向量
price=price(:);

% x(n) 由x(n-1),x(n-2),...,x(n-L)共L個數預測得到.
L = 6;

% price_n:每列為一個構造完畢的樣本,共n-L個樣本
price_n = zeros(L+1, n-L);
for i=1:n-L
    price_n(:,i) = price(i:i+L);
end

%% 劃分訓練、測試樣本
% 將前280份資料劃分為訓練樣本
% 後51份資料劃分為測試樣本

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);

%% 建立Elman神經網路

% 包含15個神經元,訓練函式為traingdx
net=elmannet(1:2,15,'traingdx');

% 設定顯示級別
net.trainParam.show=1;

% 最大迭代次數為2000次
net.trainParam.epochs=2000;

% 誤差容限,達到此誤差就可以停止訓練
net.trainParam.goal=0.00001;

% 最多驗證失敗次數
net.trainParam.max_fail=5;

% 對網路進行初始化
net=init(net);

%% 網路訓練

%訓練資料歸一化
[trainx1, st1] = mapminmax(trainx);
[trainy1, st2] = mapminmax(trainy);

% 測試資料做與訓練資料相同的歸一化操作
testx1 = mapminmax('apply',testx,st1);
testy1 = mapminmax('apply',testy,st2);

% 輸入訓練樣本進行訓練
[net,per] = train(net,trainx1,trainy1);

%% 測試。輸入歸一化後的資料,再對實際輸出進行反歸一化

% 將訓練資料輸入網路進行測試
train_ty1 = sim(net, trainx1);
train_ty = mapminmax('reverse', train_ty1, st2);

% 將測試資料輸入網路進行測試
test_ty1 = sim(net, testx1);
test_ty = mapminmax('reverse', test_ty1, st2);



% 顯示真實值
plot(x,testy,'b-');
hold on
% 顯示神經網路的輸出值
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)

三、執行結果

四、備註

版本:2014a

完整程式碼或代寫加1564658423