最近一段時間在研究如何利用預測其銷量個數,在網上搜索了一下,發現了很多模型來預測,比如利用迴歸模型、時間序列模型,GM(1,1)模型,可是自己在結合實際的工作內容,發現這幾種模型預測的精度不是很高,於是再在網上進行搜索,發現神經網絡模型可以來預測,並且有很多是結合時間序列或者SVM(支持向量機)等組合模型來進行預測,本文結合實際數據,選取了常用的BP神經網絡算法,其算法原理,因網上一大堆,所以在此不必一一展示,並參考了bp神經網絡進行交通預測的Matlab源代碼這篇博文,運用matlab 2016a,給出了下面的代碼,並最終進行了預測
clc
clear all
close all
%bp 神經網絡的預測代碼
%載入輸出和輸入數據
load C:\Users\amzon\Desktop\p.txt;
load C:\Users\amzon\Desktop\t.txt;
%保存數據到matlab的工作路徑裏面
save p.mat;
save t.mat;%注意t必須爲行向量
%賦值給輸出p和輸入t
p=p;
t=t;
%數據的歸一化處理,利用mapminmax函數,使數值歸一化到[-1.1]之間
%該函數使用方法如下:[y,ps] =mapminmax(x,ymin,ymax),x需歸化的數據輸入,
%ymin,ymax爲需歸化到的範圍,不填默認爲歸化到[-1,1]
%返回歸化後的值y,以及參數ps,ps在結果反歸一化中,需要調用
[p1,ps]=mapminmax(p);
[t1,ts]=mapminmax(t);
%確定訓練數據,測試數據,一般是隨機的從樣本中選取70%的數據作爲訓練數據
%15%的數據作爲測試數據,一般是使用函數dividerand,其一般的使用方法如下:
%[trainInd,valInd,testInd] = dividerand(Q,trainRatio,valRatio,testRatio)
[trainsample.p,valsample.p,testsample.p] =dividerand(p,0.7,0.15,0.15);
[trainsample.t,valsample.t,testsample.t] =dividerand(t,0.7,0.15,0.15);
%建立反向傳播算法的BP神經網絡,使用newff函數,其一般的使用方法如下
%net = newff(minmax(p),[隱層的神經元的個數,輸出層的神經元的個數],{隱層神經元的傳輸函數,輸出層的傳輸函數},'反向傳播的訓練函數'),其中p爲輸入數據,t爲輸出數據
%tf爲神經網絡的傳輸函數,默認爲'tansig'函數爲隱層的傳輸函數,
%purelin函數爲輸出層的傳輸函數
%一般在這裏還有其他的傳輸的函數一般的如下,如果預測出來的效果不是很好,可以調節
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';
TF1='tansig';TF2='purelin';
net=newff(minmax(p),[10,1],{TF1 TF2},'traingdm');%網絡創建
%網絡參數的設置
net.trainParam.epochs=10000;%訓練次數設置
net.trainParam.goal=1e-7;%訓練目標設置
net.trainParam.lr=0.01;%學習率設置,應設置爲較少值,太大雖然會在開始加快收斂速度,但臨近最佳點時,會產生動盪,而致使無法收斂
net.trainParam.mc=0.9;%動量因子的設置,默認爲0.9
net.trainParam.show=25;%顯示的間隔次數
% 指定訓練參數
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 動量梯度下降算法
% net.trainFcn = 'traingda'; % 變學習率梯度下降算法
% net.trainFcn = 'traingdx'; % 變學習率動量梯度下降算法
% (大型網絡的首選算法)
% net.trainFcn = 'trainrp'; % RPROP(彈性BP)算法,內存需求最小
% 共軛梯度算法
% net.trainFcn = 'traincgf'; %Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; %Polak-Ribiere修正算法,內存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal復位算法,內存需求比Polak-Ribiere修正算法略大
% (大型網絡的首選算法)
%net.trainFcn = 'trainscg'; % ScaledConjugate Gradient算法,內存需求與Fletcher-Reeves修正算法相同,計算量比上面三種算法都小很多
% net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度算法大,但收斂比較快
% net.trainFcn = 'trainoss'; % OneStep Secant Algorithm,計算量和內存需求均比BFGS算法小,比共軛梯度算法略大
% (中型網絡的首選算法)
%net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,內存需求最大,收斂速度最快
% net.trainFcn = 'trainbr'; % 貝葉斯正則化算法
% 有代表性的五種算法爲:'traingdx','trainrp','trainscg','trainoss', 'trainlm'
%在這裏一般是選取'trainlm'函數來訓練,其算對對應的是Levenberg-Marquardt算法
net.trainFcn='trainlm';
[net,tr]=train(net,trainsample.p,trainsample.t);
%計算仿真,其一般用sim函數
[normtrainoutput,trainPerf]=sim(net,trainsample.p,[],[],trainsample.t);%訓練的數據,根據BP得到的結果
[normvalidateoutput,validatePerf]=sim(net,valsample.p,[],[],valsample.t);%驗證的數據,經BP得到的結果
[normtestoutput,testPerf]=sim(net,testsample.p,[],[],testsample.t);%測試數據,經BP得到的結果
%將所得的結果進行反歸一化,得到其擬合的數據
trainoutput=mapminmax('reverse',normtrainoutput,ts);
validateoutput=mapminmax('reverse',normvalidateoutput,ts);
testoutput=mapminmax('reverse',normtestoutput,ts);
%正常輸入的數據的反歸一化的處理,得到其正式值
trainvalue=mapminmax('reverse',trainsample.t,ts);%正常的驗證數據
validatevalue=mapminmax('reverse',valsample.t,ts);%正常的驗證的數據
testvalue=mapminmax('reverse',testsample.t,ts);%正常的測試數據
%做預測,輸入要預測的數據pnew
pnew=[313,256,239]';
pnewn=mapminmax(pnew);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ts);
%絕對誤差的計算
errors=trainvalue-trainoutput;
%plotregression擬合圖
figure,plotregression(trainvalue,trainoutput)
%誤差圖
figure,plot(1:length(errors),errors,'-b')
title('誤差變化圖')
%誤差值的正態性的檢驗
figure,hist(errors);%頻數直方圖
figure,normplot(errors);%Q-Q圖
[muhat,sigmahat,muci,sigmaci]=normfit(errors);%參數估計 均值,方差,均值的0.95置信區間,方差的0.95置信區間
[h1,sig,ci]= ttest(errors,muhat);%假設檢驗
figure, ploterrcorr(errors);%繪製誤差的自相關圖
figure, parcorr(errors);%繪製偏相關圖
運行之後的,結果如下:
BP神經網絡的結果分析圖
訓練數據的梯度和均方誤差之間的關係圖
驗證數據的梯度與學習次數
殘差的正態的檢驗圖(Q-Q圖)
在網上,發現可以通過神經網絡工具箱這個GUI界面來創建神經網絡,其一般的操作步驟如下:
1:在輸入命令裏面輸入nntool命令,或者在應用程序這個選項下找到Netrual Net Fitting 這個應用程序,點擊打開,就能看見如下界面
2:輸入數據和輸出數據的導入(在本文中選取了matlab自帶的案例數據)
3:隨機選擇三種類型的數據所佔的樣本量的比例,一般選取默認即可
4:隱層神經元的確定
5:訓練算法的選取,一般是選擇默認即可,選擇完成後點擊<train>按鈕即可運行程序
6:根據得到的結果,一般是MSE的值越小,R值越接近1,其訓練的效果比較,並第二張圖給出了神經網絡的各參數的設置以及其最終的結果,其擬合圖R越接近1,模型擬合的更好
最終的結果圖
7:如果所得到的模型不能滿足你的需求,則需重複上述的步驟直至能夠得到你想要的精確度
8:將最終的得到的各種數據以及其擬合值進行保存,然後查看,就可以得到所要的擬合值
最後參考了網上和MATLAB的幫助,給出了一些與神經網絡相關的函數,希望能夠幫助大家。。
圖形用戶界面功能。
nnstart - 神經網絡啓動GUI
nctool - 神經網絡分類工具
nftool - 神經網絡的擬合工具
nntraintool - 神經網絡的訓練工具
nprtool - 神經網絡模式識別工具
ntstool - NFTool神經網絡時間序列的工具
nntool - 神經網絡工具箱的圖形用戶界面。
查看 - 查看一個神經網絡。
網絡的建立功能。
cascadeforwardnet - 串級,前饋神經網絡。
competlayer - 競爭神經層。
distdelaynet - 分佈時滯的神經網絡。
elmannet - Elman神經網絡。
feedforwardnet - 前饋神經網絡。
fitnet - 函數擬合神經網絡。
layrecnet - 分層遞歸神經網絡。
linearlayer - 線性神經層。
lvqnet - 學習矢量量化(LVQ)神經網絡。
narnet - 非線性自結合的時間序列網絡。
narxnet - 非線性自結合的時間序列與外部輸入網絡。
newgrnn - 設計一個廣義迴歸神經網絡。
newhop - 建立經常性的Hopfield網絡。
newlind - 設計一個線性層。
newpnn - 設計概率神經網絡。
newrb - 徑向基網絡設計。
newrbe - 設計一個確切的徑向基網絡。
patternnet - 神經網絡模式識別。
感知 - 感知。
selforgmap - 自組織特徵映射。
timedelaynet - 時滯神經網絡。
利用網絡。
網絡 - 創建一個自定義神經網絡。
SIM卡 - 模擬一個神經網絡。
初始化 - 初始化一個神經網絡。
適應 - 允許一個神經網絡來適應。
火車 - 火車的神經網絡。
DISP鍵 - 顯示一個神經網絡的屬性。
顯示 - 顯示的名稱和神經網絡屬性
adddelay - 添加延遲神經網絡的反應。
closeloop - 神經網絡的開放反饋轉換到關閉反饋迴路。
formwb - 表格偏見和成單個向量的權重。
getwb - 將它作爲一個單一向量中的所有網絡權值和偏差。
noloop - 刪除神經網絡的開放和關閉反饋迴路。
開環 - 轉換神經網絡反饋,打開封閉的反饋循環。
removedelay - 刪除延遲神經網絡的反應。
separatewb - 獨立的偏見和重量/偏置向量的權重。
setwb - 將所有與單個矢量網絡權值和偏差。
Simulink的支持。
gensim - 生成Simulink模塊來模擬神經網絡。
setsiminit - 集神經網絡的Simulink模塊的初始條件
getsiminit - 獲取神經網絡Simulink模塊的初始條件
神經元 - 神經網絡Simulink的模塊庫。
培訓職能。
trainb - 批具有重量與偏見學習規則的培訓。
trainbfg - 的BFGS擬牛頓倒傳遞。
trainbr - 貝葉斯規則的BP算法。
trainbu - 與重量與偏見一批無監督學習規則的培訓。
trainbuwb - 與體重無監督學習規則與偏見一批培訓。
trainc - 循環順序重量/偏見的培訓。
traincgb - 共軛鮑威爾比爾重新啓動梯度反向傳播。
traincgf - 共軛弗萊徹-裏夫斯更新梯度反向傳播。
traincgp - 共軛波拉克- Ribiere更新梯度反向傳播。
traingd - 梯度下降反向傳播。
traingda - 具有自適應LR的反向傳播梯度下降。
traingdm - 與動量梯度下降。
traingdx - 梯度下降瓦特/慣性與自適應LR的反向傳播。
trainlm - 採用Levenberg -馬奎德倒傳遞。
trainoss - 一步割線倒傳遞。
trainr - 隨機重量/偏見的培訓。
trainrp - RPROP反向傳播。
trainru - 無監督隨機重量/偏見的培訓。
火車 - 順序重量/偏見的培訓。
trainscg - 規模化共軛梯度BP算法。
繪圖功能。
plotconfusion - 圖分類混淆矩陣。
ploterrcorr - 誤差自相關時間序列圖。
ploterrhist - 繪製誤差直方圖。
plotfit - 繪圖功能適合。
plotinerrcorr - 圖輸入錯誤的時間序列的互相關。
plotperform - 小區網絡性能。
plotregression - 線性迴歸情節。
plotresponse - 動態網絡圖的時間序列響應。
plotroc - 繪製受試者工作特徵。
plotsomhits - 小區自組織圖來樣打。
plotsomnc - 小區自組織映射鄰居的連接。
plotsomnd - 小區自組織映射鄰居的距離。
plotsomplanes - 小區自組織映射重量的飛機。
plotsompos - 小區自組織映射重量立場。
plotsomtop - 小區自組織映射的拓撲結構。
plottrainstate - 情節訓練狀態值。
plotwb - 圖寒春重量和偏差值圖。
列出其他神經網絡實現的功能。
nnadapt - 適應職能。
nnderivative - 衍生功能。
nndistance - 距離函數。
nndivision - 除功能。
nninitlayer - 初始化層功能。
nninitnetwork - 初始化網絡功能。
nninitweight - 初始化權函數。
nnlearn - 學習功能。
nnnetinput - 淨輸入功能。
nnperformance - 性能的功能。
nnprocess - 處理功能。
nnsearch - 線搜索功能。
nntopology - 拓撲結構的功能。
nntransfer - 傳遞函數。
nnweight - 重量的功能。
nndemos - 神經網絡工具箱的示威。
nndatasets - 神經網絡工具箱的數據集。
nntextdemos - 神經網絡設計教科書的示威。
nntextbook - 神經網絡設計教科書的資訊。