來(lái)源:數(shù)學(xué)建模清風(fēng)學(xué)習(xí)內(nèi)容整理
文章目錄
- 灰色預(yù)測(cè)模型
- GM數(shù)學(xué)模型和原理
- GM(1,1)模型的評(píng)價(jià)和檢驗(yàn)
- ※ 什么時(shí)候用灰色預(yù)測(cè)?
- 灰色預(yù)測(cè)的例題
- BP神經(jīng)網(wǎng)絡(luò)
- 神經(jīng)網(wǎng)絡(luò)介紹
- 例題一:辛烷值的預(yù)測(cè)
- 例題二:神經(jīng)網(wǎng)絡(luò)在多輸出中的運(yùn)用
- 預(yù)測(cè)模型的建議
灰色預(yù)測(cè)模型
GM數(shù)學(xué)模型和原理
矩陣求導(dǎo):https://blog.csdn.net/lipengcn/article/details/52815429
GM(1,1)模型的評(píng)價(jià)和檢驗(yàn)
※ 什么時(shí)候用灰色預(yù)測(cè)?
灰色預(yù)測(cè)的例題
- 可以先對(duì)模型代碼思路打一個(gè)草稿或者畫(huà)個(gè)流程圖
( 注: SSE為誤差平方和 )
%% 輸入原始數(shù)據(jù)并做出時(shí)間序列圖
clear;clc
year =[1995:1:2004]'; % 橫坐標(biāo)表示年份,寫(xiě)成列向量的形式(加'就表示轉(zhuǎn)置)
x0 = [174,179,183,189,207,234,220.5,256,270,285]'; %原始數(shù)據(jù)序列,寫(xiě)成列向量的形式(加'就表示轉(zhuǎn)置)
% year = [2009:2015]; % 其實(shí)本程序?qū)懗闪诵邢蛄恳部梢?#xff0c;因?yàn)槲遗履銈冋娴倪@么寫(xiě)了,所以在后面會(huì)有判斷。
% x0 = [730, 679, 632, 599, 589, 532, 511];
% year = [2010:2017]'; % 該數(shù)據(jù)很特殊,可以通過(guò)準(zhǔn)指數(shù)規(guī)律檢驗(yàn),但是預(yù)測(cè)效果卻很差
% x0 = [1.321,0.387,0.651,0.985,1.235,0.987,0.854,1.021]';
% year = [2014:2017]';
% x0 = [2.874,3.278,3.337,3.390]';% 畫(huà)出原始數(shù)據(jù)的時(shí)間序列圖
figure(1); % 因?yàn)槲覀兊膱D形不止一個(gè),因此要設(shè)置編號(hào)
plot(year,x0,'o-'); grid on; % 原式數(shù)據(jù)的時(shí)間序列圖
set(gca,'xtick',year(1:1:end)) % 設(shè)置x軸橫坐標(biāo)的間隔為1
xlabel('年份'); ylabel('排污總量'); % 給坐標(biāo)軸加上標(biāo)簽%% 因?yàn)槲覀円褂肎M(1,1)模型,其適用于數(shù)據(jù)期數(shù)較短的非負(fù)時(shí)間序列
ERROR = 0; % 建立一個(gè)錯(cuò)誤指標(biāo),一旦出錯(cuò)就指定為1
% 判斷是否有負(fù)數(shù)元素
if sum(x0<0) > 0 % x0<0返回一個(gè)邏輯數(shù)組(0-1組成),如果有數(shù)據(jù)小于0,則所在位置為1,如果原始數(shù)據(jù)均為非負(fù)數(shù),那么這個(gè)邏輯數(shù)組中全為0,求和后也是0~disp('親,灰色預(yù)測(cè)的時(shí)間序列中不能有負(fù)數(shù)哦')ERROR = 1;
end% 判斷數(shù)據(jù)量是否太少
n = length(x0); % 計(jì)算原始數(shù)據(jù)的長(zhǎng)度
disp(strcat('原始數(shù)據(jù)的長(zhǎng)度為',num2str(n))) % strcat()是連接字符串的函數(shù)
if n<=3disp('親,數(shù)據(jù)量太小,我無(wú)能為力哦')ERROR = 1;
end% 數(shù)據(jù)太多時(shí)提示可考慮使用其他方法(不報(bào)錯(cuò))
if n>10disp('親,這么多數(shù)據(jù)量,一定要考慮使用其他的方法哦,例如ARIMA,指數(shù)平滑等')
end% 判斷數(shù)據(jù)是否為列向量,如果輸入的是行向量則轉(zhuǎn)置為列向量
if size(x0,1) == 1x0 = x0';
end
if size(year,1) == 1year = year';
end%% 對(duì)一次累加后的數(shù)據(jù)進(jìn)行準(zhǔn)指數(shù)規(guī)律的檢驗(yàn)(注意,這個(gè)檢驗(yàn)有時(shí)候即使能通過(guò),也不一定能保證預(yù)測(cè)結(jié)果非常好,例如上面的第三組數(shù)據(jù))
if ERROR == 0 % 如果上述錯(cuò)誤均沒(méi)有發(fā)生時(shí),才能執(zhí)行下面的操作步驟disp('------------------------------------------------------------')disp('準(zhǔn)指數(shù)規(guī)律檢驗(yàn)')x1 = cumsum(x0); % 生成1-AGO序列,cumsum是累加函數(shù)哦~ 注意:1.0e+03 *0.1740的意思是科學(xué)計(jì)數(shù)法,即10^3*0.1740 = 174rho = x0(2:end) ./ x1(1:end-1) ; % 計(jì)算光滑度rho(k) = x0(k)/x1(k-1)% 畫(huà)出光滑度的圖形,并畫(huà)上0.5的直線,表示臨界值figure(2)plot(year(2:end),rho,'o-',[year(2),year(end)],[0.5,0.5],'-'); grid on;text(year(end-1)+0.2,0.55,'臨界線') % 在坐標(biāo)(year(end-1)+0.2,0.55)上添加文本set(gca,'xtick',year(2:1:end)) % 設(shè)置x軸橫坐標(biāo)的間隔為1xlabel('年份'); ylabel('原始數(shù)據(jù)的光滑度'); % 給坐標(biāo)軸加上標(biāo)簽disp(strcat('指標(biāo)1:光滑比小于0.5的數(shù)據(jù)占比為',num2str(100*sum(rho<0.5)/(n-1)),'%'))disp(strcat('指標(biāo)2:除去前兩個(gè)時(shí)期外,光滑比小于0.5的數(shù)據(jù)占比為',num2str(100*sum(rho(3:end)<0.5)/(n-3)),'%'))disp('參考標(biāo)準(zhǔn):指標(biāo)1一般要大于60%, 指標(biāo)2要大于90%,你認(rèn)為本例數(shù)據(jù)可以通過(guò)檢驗(yàn)嗎?')Judge = input('你認(rèn)為可以通過(guò)準(zhǔn)指數(shù)規(guī)律的檢驗(yàn)嗎?可以通過(guò)請(qǐng)輸入1,不能請(qǐng)輸入0:');if Judge == 0disp('親,灰色預(yù)測(cè)模型不適合你的數(shù)據(jù)哦~ 請(qǐng)考慮其他方法吧 例如ARIMA,指數(shù)平滑等')ERROR = 1;enddisp('------------------------------------------------------------')
end%% 當(dāng)數(shù)據(jù)量大于4時(shí),我們利用試驗(yàn)組來(lái)選擇使用傳統(tǒng)的GM(1,1)模型、新信息GM(1,1)模型還是新陳代謝GM(1,1)模型; 如果數(shù)據(jù)量等于4,那么我們直接對(duì)三種方法求一個(gè)平均來(lái)進(jìn)行預(yù)測(cè)
if ERROR == 0 % 如果上述錯(cuò)誤均沒(méi)有發(fā)生時(shí),才能執(zhí)行下面的操作步驟if n > 4 % 數(shù)據(jù)量大于4時(shí),將數(shù)據(jù)分為訓(xùn)練組和試驗(yàn)組(根據(jù)原數(shù)據(jù)量大小n來(lái)取,n為5-7個(gè)則取最后兩年為試驗(yàn)組,n大于7則取最后三年為試驗(yàn)組)disp('因?yàn)樵瓟?shù)據(jù)的期數(shù)大于4,所以我們可以將數(shù)據(jù)組分為訓(xùn)練組和試驗(yàn)組') % 注意,如果試驗(yàn)組的個(gè)數(shù)只有1個(gè),那么三種模型的結(jié)果完全相同,因此至少要取2個(gè)試驗(yàn)組if n > 7test_num = 3;elsetest_num = 2;endtrain_x0 = x0(1:end-test_num); % 訓(xùn)練數(shù)據(jù)disp('訓(xùn)練數(shù)據(jù)是: ')disp(mat2str(train_x0')) % mat2str可以將矩陣或者向量轉(zhuǎn)換為字符串顯示, 這里加一撇表示轉(zhuǎn)置,把列向量變成行向量方便觀看test_x0 = x0(end-test_num+1:end); % 試驗(yàn)數(shù)據(jù)disp('試驗(yàn)數(shù)據(jù)是: ')disp(mat2str(test_x0')) % mat2str可以將矩陣或者向量轉(zhuǎn)換為字符串顯示disp('------------------------------------------------------------')% 使用三種模型對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,返回的result就是往后預(yù)測(cè)test_num期的數(shù)據(jù)disp(' ')disp('***下面是傳統(tǒng)的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')result1 = gm11(train_x0, test_num); %使用傳統(tǒng)的GM(1,1)模型對(duì)訓(xùn)練數(shù)據(jù),并預(yù)測(cè)后test_num期的結(jié)果disp(' ')disp('***下面是進(jìn)行新信息的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')result2 = new_gm11(train_x0, test_num); %使用新信息GM(1,1)模型對(duì)訓(xùn)練數(shù)據(jù),并預(yù)測(cè)后test_num期的結(jié)果disp(' ')disp('***下面是進(jìn)行新陳代謝的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')result3 = metabolism_gm11(train_x0, test_num); %使用新陳代謝GM(1,1)模型對(duì)訓(xùn)練數(shù)據(jù),并預(yù)測(cè)后test_num期的結(jié)果% 現(xiàn)在比較三種模型對(duì)于試驗(yàn)數(shù)據(jù)的預(yù)測(cè)結(jié)果disp(' ')disp('------------------------------------------------------------')% 繪制對(duì)試驗(yàn)數(shù)據(jù)進(jìn)行預(yù)測(cè)的圖形(對(duì)于部分?jǐn)?shù)據(jù),可能三條直線預(yù)測(cè)的結(jié)果非常接近)test_year = year(end-test_num+1:end); % 試驗(yàn)組對(duì)應(yīng)的年份figure(3)plot(test_year,test_x0,'o-',test_year,result1,'*-',test_year,result2,'+-',test_year,result3,'x-'); grid on;set(gca,'xtick',year(end-test_num+1): 1 :year(end)) % 設(shè)置x軸橫坐標(biāo)的間隔為1legend('試驗(yàn)組的真實(shí)數(shù)據(jù)','傳統(tǒng)GM(1,1)預(yù)測(cè)結(jié)果','新信息GM(1,1)預(yù)測(cè)結(jié)果','新陳代謝GM(1,1)預(yù)測(cè)結(jié)果') % 注意:如果lengend擋著了圖形中的直線,那么lengend的位置可以自己手動(dòng)拖動(dòng)xlabel('年份'); ylabel('排污總量'); % 給坐標(biāo)軸加上標(biāo)簽% 計(jì)算誤差平方和SSESSE1 = sum((test_x0-result1).^2);SSE2 = sum((test_x0-result2).^2);SSE3 = sum((test_x0-result3).^2);disp(strcat('傳統(tǒng)GM(1,1)對(duì)于試驗(yàn)組預(yù)測(cè)的誤差平方和為',num2str(SSE1)))disp(strcat('新信息GM(1,1)對(duì)于試驗(yàn)組預(yù)測(cè)的誤差平方和為',num2str(SSE2)))disp(strcat('新陳代謝GM(1,1)對(duì)于試驗(yàn)組預(yù)測(cè)的誤差平方和為',num2str(SSE3)))if SSE1<SSE2if SSE1<SSE3choose = 1; % SSE1最小,選擇傳統(tǒng)GM(1,1)模型elsechoose = 3; % SSE3最小,選擇新陳代謝GM(1,1)模型endelseif SSE2<SSE3choose = 2; % SSE2最小,選擇新信息GM(1,1)模型elsechoose = 3; % SSE3最小,選擇新陳代謝GM(1,1)模型endModel = {'傳統(tǒng)GM(1,1)模型','新信息GM(1,1)模型','新陳代謝GM(1,1)模型'};disp(strcat('因?yàn)?#39;,Model(choose),'的誤差平方和最小,所以我們應(yīng)該選擇其進(jìn)行預(yù)測(cè)'))disp('------------------------------------------------------------')%% 選用誤差最小的那個(gè)模型進(jìn)行預(yù)測(cè)predict_num = input('請(qǐng)輸入你要往后面預(yù)測(cè)的期數(shù): ');% 計(jì)算使用傳統(tǒng)GM模型的結(jié)果,用來(lái)得到另外的返回變量:x0_hat, 相對(duì)殘差relative_residuals和級(jí)比偏差eta[result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num); % 先利用gm11函數(shù)得到對(duì)原數(shù)據(jù)擬合的詳細(xì)結(jié)果% % 判斷我們選擇的是哪個(gè)模型,如果是2或3,則更新剛剛由模型1計(jì)算出來(lái)的預(yù)測(cè)結(jié)果if choose == 2result = new_gm11(x0, predict_num);endif choose == 3result = metabolism_gm11(x0, predict_num);end%% 輸出使用最佳的模型預(yù)測(cè)出來(lái)的結(jié)果disp('------------------------------------------------------------')disp('對(duì)原始數(shù)據(jù)的擬合結(jié)果:')for i = 1:ndisp(strcat(num2str(year(i)), ' : ',num2str(x0_hat(i))))enddisp(strcat('往后預(yù)測(cè)',num2str(predict_num),'期的得到的結(jié)果:'))for i = 1:predict_numdisp(strcat(num2str(year(end)+i), ' : ',num2str(result(i))))end%% 如果只有四期數(shù)據(jù),那么我們就沒(méi)必要選擇何種模型進(jìn)行預(yù)測(cè),直接對(duì)三種模型預(yù)測(cè)的結(jié)果求一個(gè)平均值~elsedisp('因?yàn)閿?shù)據(jù)只有4期,因此我們直接將三種方法的結(jié)果求平均即可~')predict_num = input('請(qǐng)輸入你要往后面預(yù)測(cè)的期數(shù): ');disp(' ')disp('***下面是傳統(tǒng)的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')[result1, x0_hat, relative_residuals, eta] = gm11(x0, predict_num);disp(' ')disp('***下面是進(jìn)行新信息的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')result2 = new_gm11(x0, predict_num);disp(' ')disp('***下面是進(jìn)行新陳代謝的GM(1,1)模型預(yù)測(cè)的詳細(xì)過(guò)程***')result3 = metabolism_gm11(x0, predict_num);result = (result1+result2+result3)/3;disp('對(duì)原始數(shù)據(jù)的擬合結(jié)果:')for i = 1:ndisp(strcat(num2str(year(i)), ' : ',num2str(x0_hat(i))))enddisp(strcat('傳統(tǒng)GM(1,1)往后預(yù)測(cè)',num2str(predict_num),'期的得到的結(jié)果:'))for i = 1:predict_numdisp(strcat(num2str(year(end)+i), ' : ',num2str(result1(i))))enddisp(strcat('新信息GM(1,1)往后預(yù)測(cè)',num2str(predict_num),'期的得到的結(jié)果:'))for i = 1:predict_numdisp(strcat(num2str(year(end)+i), ' : ',num2str(result2(i))))enddisp(strcat('新陳代謝GM(1,1)往后預(yù)測(cè)',num2str(predict_num),'期的得到的結(jié)果:'))for i = 1:predict_numdisp(strcat(num2str(year(end)+i), ' : ',num2str(result3(i))))enddisp(strcat('三種方法求平均得到的往后預(yù)測(cè)',num2str(predict_num),'期的得到的結(jié)果:'))for i = 1:predict_numdisp(strcat(num2str(year(end)+i), ' : ',num2str(result(i))))endend%% 繪制相對(duì)殘差和級(jí)比偏差的圖形(注意:因?yàn)槭菍?duì)原始數(shù)據(jù)的擬合效果評(píng)估,所以三個(gè)模型都是一樣的哦~~~)figure(4)subplot(2,1,1) % 繪制子圖(將圖分塊)plot(year(2:end), relative_residuals,'*-'); grid on; % 原數(shù)據(jù)中的各時(shí)期和相對(duì)殘差legend('相對(duì)殘差'); xlabel('年份');set(gca,'xtick',year(2:1:end)) % 設(shè)置x軸橫坐標(biāo)的間隔為1subplot(2,1,2)plot(year(2:end), eta,'o-'); grid on; % 原數(shù)據(jù)中的各時(shí)期和級(jí)比偏差legend('級(jí)比偏差'); xlabel('年份');set(gca,'xtick',year(2:1:end)) % 設(shè)置x軸橫坐標(biāo)的間隔為1disp(' ')disp('****下面將輸出對(duì)原數(shù)據(jù)擬合的評(píng)價(jià)結(jié)果***')%% 殘差檢驗(yàn)average_relative_residuals = mean(relative_residuals); % 計(jì)算平均相對(duì)殘差 mean函數(shù)用來(lái)均值disp(strcat('平均相對(duì)殘差為',num2str(average_relative_residuals)))if average_relative_residuals<0.1disp('殘差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度非常不錯(cuò)')elseif average_relative_residuals<0.2disp('殘差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度達(dá)到一般要求')elsedisp('殘差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度不太好,建議使用其他模型預(yù)測(cè)')end%% 級(jí)比偏差檢驗(yàn)average_eta = mean(eta); % 計(jì)算平均級(jí)比偏差disp(strcat('平均級(jí)比偏差為',num2str(average_eta)))if average_eta<0.1disp('級(jí)比偏差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度非常不錯(cuò)')elseif average_eta<0.2disp('級(jí)比偏差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度達(dá)到一般要求')elsedisp('級(jí)比偏差檢驗(yàn)的結(jié)果表明:該模型對(duì)原數(shù)據(jù)的擬合程度不太好,建議使用其他模型預(yù)測(cè)')enddisp(' ')disp('------------------------------------------------------------')%% 繪制最終的預(yù)測(cè)效果圖figure(5) % 下面繪圖中的符號(hào)m:洋紅色 b:藍(lán)色plot(year,x0,'-o', year,x0_hat,'-*m', year(end)+1:year(end)+predict_num,result,'-*b' ); grid on;hold on;plot([year(end),year(end)+1],[x0(end),result(1)],'-*b')legend('原始數(shù)據(jù)','擬合數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)') % 注意:如果lengend擋著了圖形中的直線,那么lengend的位置可以自己手動(dòng)拖動(dòng)set(gca,'xtick',[year(1):1:year(end)+predict_num]) % 設(shè)置x軸橫坐標(biāo)的間隔為1xlabel('年份'); ylabel('排污總量'); % 給坐標(biāo)軸加上標(biāo)簽
end% % 注意:代碼文件僅供參考,一定不要直接用于自己的數(shù)模論文中
% % 國(guó)賽對(duì)于論文的查重要求非常嚴(yán)格,代碼雷同也算作抄襲
function [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num)% 函數(shù)作用:使用傳統(tǒng)的GM(1,1)模型對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè)% x0:要預(yù)測(cè)的原始數(shù)據(jù)% predict_num: 向后預(yù)測(cè)的期數(shù)% 輸出變量 (注意,實(shí)際調(diào)用時(shí)該函數(shù)時(shí)不一定輸出全部結(jié)果,就像corrcoef函數(shù)一樣~,可以只輸出相關(guān)系數(shù)矩陣,也可以附帶輸出p值矩陣)% result:預(yù)測(cè)值% x0_hat:對(duì)原始數(shù)據(jù)的擬合值% relative_residuals: 對(duì)模型進(jìn)行評(píng)價(jià)時(shí)計(jì)算得到的相對(duì)殘差% eta: 對(duì)模型進(jìn)行評(píng)價(jià)時(shí)計(jì)算得到的級(jí)比偏差n = length(x0); % 數(shù)據(jù)的長(zhǎng)度x1=cumsum(x0); % 計(jì)算一次累加值z(mì)1 = (x1(1:end-1) + x1(2:end)) / 2; % 計(jì)算緊鄰均值生成數(shù)列(長(zhǎng)度為n-1)% 將從第二項(xiàng)開(kāi)始的x0當(dāng)成y,z1當(dāng)成x,來(lái)進(jìn)行一元回歸 y = kx +by = x0(2:end); x = z1;% 下面的表達(dá)式就是第四講擬合里面的哦~ 但是要注意,此時(shí)的樣本數(shù)應(yīng)該是n-1,少了一項(xiàng)哦k = ((n-1)*sum(x.*y)-sum(x)*sum(y))/((n-1)*sum(x.*x)-sum(x)*sum(x));b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/((n-1)*sum(x.*x)-sum(x)*sum(x));a = -k; %注意:k = -a哦% 注意: -a就是發(fā)展系數(shù), b就是灰作用量disp('現(xiàn)在進(jìn)行GM(1,1)預(yù)測(cè)的原始數(shù)據(jù)是: ')disp(mat2str(x0')) % mat2str可以將矩陣或者向量轉(zhuǎn)換為字符串顯示disp(strcat('最小二乘法擬合得到的發(fā)展系數(shù)為',num2str(-a),',灰作用量是',num2str(b)))disp('***************分割線***************')x0_hat=zeros(n,1); x0_hat(1)=x0(1); % x0_hat向量用來(lái)存儲(chǔ)對(duì)x0序列的擬合值,這里先進(jìn)行初始化for m = 1: n-1x0_hat(m+1) = (1-exp(a))*(x0(1)-b/a)*exp(-a*m);endresult = zeros(predict_num,1); % 初始化用來(lái)保存預(yù)測(cè)值的向量for i = 1: predict_numresult(i) = (1-exp(a))*(x0(1)-b/a)*exp(-a*(n+i-1)); % 帶入公式直接計(jì)算end% 計(jì)算絕對(duì)殘差和相對(duì)殘差absolute_residuals = x0(2:end) - x0_hat(2:end); % 從第二項(xiàng)開(kāi)始計(jì)算絕對(duì)殘差,因?yàn)榈谝豁?xiàng)是相同的relative_residuals = abs(absolute_residuals) ./ x0(2:end); % 計(jì)算相對(duì)殘差,注意分子要加絕對(duì)值,而且要使用點(diǎn)除% 計(jì)算級(jí)比和級(jí)比偏差class_ratio = x0(2:end) ./ x0(1:end-1) ; % 計(jì)算級(jí)比 sigma(k) = x0(k)/x0(k-1)eta = abs(1-(1-0.5*a)/(1+0.5*a)*(1./class_ratio)); % 計(jì)算級(jí)比偏差
end
function [result] = metabolism_gm11(x0, predict_num)
% 函數(shù)作用:使用新陳代謝的GM(1,1)模型對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè)
% 輸入變量
% x0:要預(yù)測(cè)的原始數(shù)據(jù)
% predict_num: 向后預(yù)測(cè)的期數(shù)
% 輸出變量
% result:預(yù)測(cè)值result = zeros(predict_num,1); % 初始化用來(lái)保存預(yù)測(cè)值的向量for i = 1 : predict_num result(i) = gm11(x0, 1); % 將預(yù)測(cè)一期的結(jié)果保存到result中x0 = [x0(2:end); result(i)]; % 更新x0向量,此時(shí)x0多了新的預(yù)測(cè)信息,并且刪除了最開(kāi)始的那個(gè)向量end
end
function [result] = new_gm11(x0, predict_num)
% 函數(shù)作用:使用新信息的GM(1,1)模型對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè)
% 輸入變量
% x0:要預(yù)測(cè)的原始數(shù)據(jù)
% predict_num: 向后預(yù)測(cè)的期數(shù)
% 輸出變量
% result:預(yù)測(cè)值result = zeros(predict_num,1); % 初始化用來(lái)保存預(yù)測(cè)值的向量for i = 1 : predict_num result(i) = gm11(x0, 1); % 將預(yù)測(cè)一期的結(jié)果保存到result中x0 = [x0; result(i)]; % 更新x0向量,此時(shí)x0多了新的預(yù)測(cè)信息end
end
- 新信息就是不斷添加新數(shù)據(jù)
- 新陳代謝就是去掉舊數(shù)據(jù),添加新數(shù)據(jù)
BP神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)介紹
原理的視頻介紹(只看前20分鐘,后面的講的不怎么好,可跳過(guò))神經(jīng)網(wǎng)絡(luò)原理的簡(jiǎn)單介紹神經(jīng)網(wǎng)絡(luò)的應(yīng)用
鏈接:https://pan.baidu.com/s/1hu7x_LC65Ez382725sqU4g (提取碼:dwla)
備用下載鏈接:https://pan.baidu.com/s/1tHOA9rIMNYgFqHfIqCMwlQ
----》詳解:https://blog.csdn.net/liushiqi0826/article/details/86514585
例題一:辛烷值的預(yù)測(cè)
- 不能使用回歸?
: 因?yàn)榛貧w的使用前提是樣本數(shù) n 大于 自變量的個(gè)數(shù) 題目中的樣本數(shù)為50組,而自變量有401個(gè) - 也可以降維使得自變量減少,再使用回歸
- 可以選擇不同的訓(xùn)練算法來(lái)比較MSE ,選擇 MSE 最小的訓(xùn)練算法
load data_Octane.mat
% 盡量使用新版的Matlab
% 在Matlab的菜單欄點(diǎn)擊APP,再點(diǎn)擊Neural Fitting app.% 利用訓(xùn)練出來(lái)的神經(jīng)網(wǎng)絡(luò)模型對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè)
% 例如我們要預(yù)測(cè)編號(hào)為51的樣本,其對(duì)應(yīng)的401個(gè)吸光度為:new_X(1,:)
% sim(net, new_X(1,:))
% 錯(cuò)誤使用 network/sim (line 266)
% Input data sizes do not match net.inputs{1}.size.
% net.inputs{1}.size% 這里要注意,我們要將指標(biāo)變?yōu)榱邢蛄?#xff0c;然后再用sim函數(shù)預(yù)測(cè)
sim(net, new_X(1,:)') %net就是訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)% 寫(xiě)一個(gè)循環(huán),預(yù)測(cè)接下來(lái)的十個(gè)樣本的辛烷值
predict_y = zeros(10,1); % 初始化predict_y
for i = 1: 10result = sim(net, new_X(i,:)');predict_y(i) = result;
end
disp('預(yù)測(cè)值為:')
disp(predict_y)
- 如果出現(xiàn)過(guò)擬合怎么辦?
- 可以只選取大部分?jǐn)?shù)據(jù)進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練,保留部分真實(shí)數(shù)據(jù),帶入訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)來(lái)看MSE或者SSE
例題二:神經(jīng)網(wǎng)絡(luò)在多輸出中的運(yùn)用
預(yù)測(cè)模型的建議
總結(jié)
以上是生活随笔為你收集整理的预测算法模型(灰色预测和BP神经网络)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。