如何用MATLAB計(jì)算轉(zhuǎn)移矩陣
如何用MATLAB計(jì)算馬爾科夫矩陣
如何用MATLAB實(shí)現(xiàn)馬爾科夫過程
這些都是一樣的問題。
一. 轉(zhuǎn)移矩陣算法描述
簡(jiǎn)書沒有公式編輯器,敲在 Word 里,直接扔截圖。
二. 引例
引例來源:引例
1. 例子
2. 解法
1)數(shù)據(jù)處理與分析
將數(shù)據(jù)在 Excel 中處理成以下形式。把你的數(shù)據(jù)元素變成”某種意義的比值“,分析確定你的模型中”狀態(tài)數(shù)“和所謂”相同狀態(tài)年份間隔數(shù)“。本例中狀態(tài)數(shù)為5,年份間隔數(shù)為5。每一個(gè)年份間隔都會(huì)輸出一個(gè)轉(zhuǎn)移概率矩陣,所以本例結(jié)果會(huì)輸出 5 個(gè) P。
2)輸入info矩陣
此處有技巧,無需手工單個(gè)數(shù)據(jù)錄入。先在 MATLAB 中輸入info=[];
,然后將 Excel 中整理好的數(shù)據(jù)全選復(fù)制,將光標(biāo)移動(dòng)到方括號(hào)中間,粘貼后按回車即可。
3)修改代碼
按照代碼中注釋修改部分參數(shù)。
%--此時(shí)你已經(jīng)輸入比例矩陣info
%--參數(shù)修改
P = zeros(5); %所求轉(zhuǎn)移矩陣階數(shù),本例中為5。
for k = 1:5 %k為年份間隔數(shù),本例中為5。
for i = 1:5 %i為狀態(tài)數(shù),本例中為5。
%--此處參數(shù)修改結(jié)束,后面還有一處修改
%--以下內(nèi)容無需改動(dòng)--%
front = 0;
back = 0;
if (i ~= 1) %對(duì)應(yīng)(2)(3)
up = info(k+1,i);
if(info(k+1,1)>info(k,1))
for n = 2:i
front = front + info(k,n);
end
for n = 2:i-1
back = back + info(k+1,n);
end
down = front - back;
P(i,i) = up / down;
elseif(info(k+1,1)<info(k,1))
for n = 1:i
front = front + info(k,n);
end
for n = 1:i-1
back = back + info(k+1,n);
end
down = front - back;
P(i,i) = up / down;
end
%--無需改動(dòng)結(jié)束--%
%--bug修復(fù)--%
%--注意!注意!注意!--%
%--在計(jì)算5階這種小的轉(zhuǎn)移矩陣還沒什么問題,計(jì)算20階時(shí)出現(xiàn)元素為負(fù)的情況,顯然不合常理--%
%--此時(shí)需要進(jìn)行bug修復(fù),將以下三行代碼前注釋符%去掉即可。會(huì)大幅影響計(jì)算結(jié)果!--%
%--也許是我的代碼邏輯有問題,如果你發(fā)現(xiàn)了,請(qǐng)指正,不勝感激--%
% if(P(i,i)>1)
% P(i,i)= 1;
% end
%--bug修復(fù)結(jié)束--%
%--對(duì)應(yīng)(5)--%
if(i == 5) %i為狀態(tài)數(shù),本例中為5
P(i,1) = 1 - P(i,i);
else
P(i,i+1) = 1 - P(i,i);
end
elseif (info(k+1,i)>info(k,i))
P(i,i) = 1;
%--對(duì)應(yīng)(1)-%
else
up = info(k+1,i);
down = info(k,i);
P(i,i) = up / down;
P(i,i+1) = 1 - P(i,i);
end
end
P
end
3)輸入代碼
代碼在 Windows 10,MATLAB 2014a 環(huán)境下測(cè)試通過,可以輸出狀態(tài)轉(zhuǎn)移矩陣 P。
4)其他
輸出多個(gè)轉(zhuǎn)移概率矩陣 P ,可以求一下均值當(dāng)作接下來預(yù)測(cè)用的轉(zhuǎn)移概率矩陣,嫌麻煩直接從幾個(gè) P 里挑一個(gè)好看的進(jìn)行預(yù)測(cè)。
關(guān)于代碼準(zhǔn)確性,我算了以下五個(gè) P 的均值,和引力來源中的論文比較了下,誤差在小數(shù)點(diǎn)四位后。
三. 寫在后面
把論文寫成教程的既視感有沒有...
在建模搜索資料的過程中發(fā)現(xiàn),關(guān)于 MATLAB 在馬爾科夫過程中特別是轉(zhuǎn)移矩陣的計(jì)算中,無論使用 Google 還是百度,都搜不到現(xiàn)成的代碼。也許這些代碼對(duì)大牛來說隨手寫,但寫完不分享令我等渣渣深感困擾,只好花了一晚上來自己寫。代碼的質(zhì)量很差,但又不是不能用,斜眼笑。有錯(cuò)誤和不足歡迎在評(píng)論區(qū)指正,謝謝。原理在引例鏈接中的論文有詳細(xì)說明,可以點(diǎn)進(jìn)去仔細(xì)看看。代碼不會(huì)用也可以在評(píng)論區(qū)說。