Matlab實(shí)現(xiàn)灰色預(yù)測(cè)的示例代碼
模型介紹
略微帶過(guò)一下原理:
灰色預(yù)測(cè)對(duì)于趨勢(shì)不強(qiáng)的數(shù)據(jù),將其原始數(shù)據(jù)進(jìn)行累加后得到具有明顯趨勢(shì)的新數(shù)據(jù)進(jìn)行擬合,假設(shè)原數(shù)據(jù)為:

則新數(shù)據(jù)集X(1)中數(shù)據(jù)為:

通常認(rèn)為累加數(shù)據(jù)服從指數(shù)分布,欸那我們直接假設(shè):

直接進(jìn)行一個(gè)非線性擬合不就完事了,但是,從小學(xué)二年級(jí)開(kāi)始,老師就教導(dǎo)我們,像這用指數(shù)函數(shù)擬合啊,各個(gè)參數(shù)的變化對(duì)于整體曲線的影響效果差別很大啊,直接擬合誤差會(huì)很大啊,怎么能給他整成一個(gè)線性擬合???(直接擬合我有試過(guò),能夠大體描述趨勢(shì)并做出預(yù)測(cè),但是誤差會(huì)比灰色預(yù)測(cè)大一點(diǎn))。
指數(shù)函數(shù)一般符合一個(gè)微分方程:

解常微分方程易得:

這樣我們只需要將a,u這倆常數(shù)求出來(lái)就能得到x(1)(t) ,就能得到X(1)序列然后逐項(xiàng)做差就能得到X(0)序列。
當(dāng)k≤t≤k+1時(shí),有:

帶入回之前的微分方程就有:

實(shí)際上直接進(jìn)行線性擬合就好了,當(dāng)然我們也可以拿最小二乘法裝模作樣的分析一下,令:

基礎(chǔ)代碼
核心代碼非常短,只有六行,代碼中給出了詳細(xì)的注釋,基礎(chǔ)繪圖還是MATLAB風(fēng)比較簡(jiǎn)陋,后面會(huì)給出圖像修飾代碼。
X0=[15 16.1 17.3 18.4 18.7 19.1 19.9 21.3 22.5];
t=1:9; % 原始數(shù)據(jù)自變量范圍
pt=10:12; % 預(yù)測(cè)數(shù)據(jù)自變量范圍
X1=cumsum(X0); % 累加生成趨勢(shì)明顯新序列
Z=X1(1:end-1)+diff(X1)./2; % 均值,即(X1(1:end-1)+X1(2:end))./2
a_u=polyfit(-Z,X0(2:end),1); % a_u=(B'*B)\B'*Y,B=[-Z,ones]
a=a_u(1);u=a_u(2);
P=(X1(1)-u/a)./exp(a.*([t,pt]-1))+u/a; % 求X1擬合值
P=[P(1),diff(P)]; % X1逐項(xiàng)做差求預(yù)測(cè)值
% 繪圖
plot([t,pt],P,'*-');
hold on
plot(t,X0,'s-')
legend('預(yù)測(cè)值','真實(shí)值');
基礎(chǔ)代碼+修飾
X0=[15 16.1 17.3 18.4 18.7 19.1 19.9 21.3 22.5];
t=1:9; % 原始數(shù)據(jù)自變量范圍
pt=10:12; % 預(yù)測(cè)數(shù)據(jù)自變量范圍
X1=cumsum(X0); % 累加生成趨勢(shì)明顯新序列
Z=X1(1:end-1)+diff(X1)./2; % 均值,即(X1(1:end-1)+X1(2:end))./2
a_u=polyfit(-Z,X0(2:end),1); % a_u=(B'*B)\B'*Y,B=[-Z,ones]
a=a_u(1);u=a_u(2);
P=(X1(1)-u/a)./exp(a.*([t,pt]-1))+u/a; % 求X1擬合值
P=[P(1),diff(P)]; % X1逐項(xiàng)做差求預(yù)測(cè)值
% 繪圖
plot([t,pt],P,'s-','Color',[82,124,179]./255,'MarkerFaceColor',[82,124,179]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',16)
hold on
plot(t,X0,'d-.','Color',[169,64,71]./255,'MarkerFaceColor',[169,64,71]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',16)
% 增添圖例
lgd=legend('fitting result','original data');
lgd.Location='best';
lgd.FontSize=16;
% 坐標(biāo)區(qū)域修飾
ax=gca;grid on;box off
ax.LineWidth=2;
ax.Color=[249,250,245]./255;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.GridLineStyle='-.';
ax.XColor=[1,1,1].*.2;
ax.YColor=[1,1,1].*.2;
ax.FontName='Cambria';
ax.FontSize=14;
到此這篇關(guān)于Matlab實(shí)現(xiàn)灰色預(yù)測(cè)的示例代碼的文章就介紹到這了,更多相關(guān)Matlab灰色預(yù)測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能
這篇文章主要通過(guò)C語(yǔ)言函數(shù)指針數(shù)組實(shí)現(xiàn)了計(jì)算器的功能,是一個(gè)很好而且流程詳細(xì)的小例子,感興趣的新手朋友們可以自己動(dòng)手也寫(xiě)一遍2022-04-04
詳解C語(yǔ)言實(shí)現(xiàn)空間索引四叉樹(shù)
本文主要介紹了用C語(yǔ)言實(shí)現(xiàn)四叉樹(shù),對(duì)算法感興趣的同學(xué),可以參考下,并且試驗(yàn)一下。2021-05-05
C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸
這篇文章主要為大家介紹了C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C++實(shí)現(xiàn)將長(zhǎng)整型數(shù)轉(zhuǎn)換為字符串的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)將長(zhǎng)整型數(shù)轉(zhuǎn)換為字符串的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
哈希表實(shí)驗(yàn)C語(yǔ)言版實(shí)現(xiàn)
以下是對(duì)哈希表實(shí)驗(yàn)用C語(yǔ)言實(shí)現(xiàn)的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
C語(yǔ)言字符串函數(shù)介紹與模擬實(shí)現(xiàn)詳解
字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語(yǔ)言中用來(lái)進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長(zhǎng)度,字符查找等的函數(shù)2022-02-02
C語(yǔ)言實(shí)現(xiàn)掃雷游戲(含注釋詳解)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,含注釋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

