能24小時(shí)掛機(jī)的云電腦網(wǎng)站優(yōu)化關(guān)鍵詞價(jià)格
Python實(shí)現(xiàn)馬爾科夫鏈預(yù)測(cè)
馬爾科夫鏈原理
馬爾科夫鏈?zhǔn)且环N進(jìn)行預(yù)測(cè)的方法,常用于系統(tǒng)未來時(shí)刻情況只和現(xiàn)在有關(guān),而與過去無關(guān)。
用下面這個(gè)例子來講述馬爾科夫鏈。
如何預(yù)測(cè)下一時(shí)刻計(jì)算機(jī)發(fā)生故障的概率?
當(dāng)前狀態(tài)只存在0(故障狀態(tài))和1(正常狀態(tài))兩種,每種狀態(tài)下各存在兩個(gè)未來狀態(tài)(00,01,11,10),那么統(tǒng)計(jì)出這整個(gè)序列中00,01,11,10出現(xiàn)的次數(shù)。即求得轉(zhuǎn)移矩陣。
進(jìn)而求得轉(zhuǎn)移概率矩陣
如果當(dāng)前是0,那么下一個(gè)是0的概率為30.77%,下一步為1的概率為69.23%。
對(duì)當(dāng)前數(shù)據(jù),最后一個(gè)為1,那么預(yù)測(cè)下一步,有74.3%的概率不發(fā)生故障。
上面的方法不僅限于兩個(gè)類別0和1,多類別也是可以預(yù)測(cè)的
比如
str = “4321431123212344331113321222442323112431”
用同樣的方法計(jì)算轉(zhuǎn)移概率矩陣
問題描述
源代碼
計(jì)算轉(zhuǎn)移矩陣部分
def str_count(str, sub):count = 0for i in range(0, len(str) - 1):if str[i:i+2] == sub:count = count + 1return countdef data_to_matrix():str = "1110010011111110011110111111001111111110001101101111011011010111101110111101111110011011111100111"count00 = str_count(str, "00")count01 = str_count(str, "01")count10 = str_count(str, "10")count11 = str_count(str, "11")print("count00:", count00)print("count01:", count01)print("count10:", count10)print("count11:", count11)
if __name__ == '__main__':data_to_matrix()
問題解決部分
import numpy as np
p1 = np.array([0.2, 0.4, 0.4])
p = np.array([[0.8, 0.1, 0.1],[0.5, 0.1, 0.4],[0.5, 0.3,0.2]
])
p3 = np.linalg.matrix_power(p, 3)
p4 = np.dot(p1, p3)
print(p4)
1、np.linalg.matrix_power(p, 3) 是一個(gè)用來計(jì)算矩陣 p 的 3 次冪的函數(shù)。它使用 NumPy 庫中的 linalg 子模塊來執(zhí)行矩陣乘法運(yùn)算。這個(gè)函數(shù)的返回值是將矩陣 p 自乘 3 次后得到的新矩陣。
2、dot指的是兩個(gè)向量之間的點(diǎn)積運(yùn)算
結(jié)果
參考博文
數(shù)學(xué)建模入門-python實(shí)現(xiàn)簡單的馬爾可夫鏈
馬爾科夫鏈預(yù)測(cè),Python實(shí)現(xiàn)