大家好,又見面了,我是你們的朋友全棧君。
最近一段時間在研究如何利用預測其銷量個數,在網上搜尋了一下,發現了很多模型來預測,比如利用回歸模型、時間序列模型,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);%繪制偏相關圖
複制
運作之後的,結果如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwIjNx8CX39CXy8CXycXZpZVZnFWbp9zZlBnauMDOkRWYkVWMlFzNkFTN5AzN1E2NxITY2YzMjFzNxMjNvw1NzUzMyIDOtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
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 – 神經網絡設計教科書的資訊。
釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/151486.html原文連結:https://javaforall.cn