簡體   English   中英

來自字符串的馬爾可夫鏈

[英]Markov Chain from String

考慮到馬爾可夫鏈是以字符串列表的形式給出的輸入,我目前正面臨一個問題。 該輸入必須轉換為馬爾可夫鏈。 我已經坐在這個問題上幾個小時了。

我的想法:正如您在下面看到的,我嘗試使用集合中的計數器來計算所有轉換,這很有效。 現在我正在嘗試計算 A 和 B 是第一個元素的所有元組。 這給了我所有可能的 A 轉換。

然后我將計算像(A,B)這樣的轉換。 然后我想用這些來創建一個具有所有概率的矩陣。

def markov(seq):

    states = Counter(seq).keys()
    liste = []
    print(states)
    a = zip(seq[:-1], seq[1:])
    print(list(a))

print(markov(["A","A","B","B","A","B","A","A","A"]))

到目前為止,我無法計算元組的數量。 任何有關如何解決此問題的幫助或新想法表示贊賞

要計算元組,可以創建另一個計數器。

b = Counter()
for word_pair in a:
    b[word_pair] += 1

b將保留該對的計數。

要創建矩陣,可以使用numpy。

c = np.array([[b[(i,j)] for j in states] for i in states], dtype = float)

我將保留將每行總和標准化為1的任務作為練習。

我沒有完全得到您想要的東西,但是我想的是:

from collections import Counter

def count_occurence(seq):

    counted_states = []
    transition_dict = {}
    for tup in seq:
        if tup not in counted_states:
            transition_dict[tup] = seq.count(tup)
        counted_states.append(tup)
    print(transition_dict)
    #{('A', 'A'): 3, ('A', 'B'): 2, ('B', 'B'): 1, ('B', 'A'): 2}

def markov(seq):

    states = Counter(seq).keys()
    print(states)
    #dict_keys(['A', 'B'])
    a = list(zip(seq[:-1], seq[1:]))
    print(a)
    #[('A', 'A'), ('A', 'B'), ('B', 'B'), ('B', 'A'), ('A', 'B'), ('B', 
    #'A'), ('A', 'A'), ('A', 'A')]
    return a

seq = markov(["A","A","B","B","A","B","A","A","A"])
count_occurence(seq)

您想要一個 python 示例,但是,我有一個本機 Javascript 示例。 首先,必須使用離散概率檢測器 (DPD) 算法從“AABBABAAAA”序列中提取轉移概率。

 // Paul A. Gagniuc. Markov chains: from theory to implementation and experimentation. // Hoboken, NJ, John Wiley & Sons, USA, 2017, ISBN: 978-1-119-38755-8. var z = "AABBABAAA"; var tmp = DPD(z, '(p)') document.write(SMC(tmp)); function DPD(s, n){ //--------------[ Phase one ]--------------| var a = []; var k = s.length; for(var i=0; i<=k; i++){ var q = 1; for(var j=0; j<=a.length; j++){ if (s[i] === a[j]) {q = 0;} } if (q === 1) {a.push(s[i]);} } //--------------[ Phase two ]--------------| var d = a.length-1; var m = []; var e = []; var l = []; for(var i=0; i<=d; i++){ m[i]=[]; e[i]=[]; for(var j=0; j<=d; j++){ m[i][j]=0; if (j === 0) { e[i][0]=a[i]; e[i][1]=0; } } } //-------------[ Phase three ]-------------| l[0]=""; l[1]=""; for(var i=0; i<s.length-1; i++){ l[0] = s.substr(i, 1); l[1] = s.substr(i + 1, 1); for(var j=0; j<=d; j++){ if (l[0] === e[j][0]) { e[j][1] = e[j][1] + 1; r = j; } if (l[1] === e[j][0]) {c=j;} } m[r][c] = m[r][c] + 1; } //-------------[ Phase four ]--------------| for(var i=0; i<=d; i++){ for(var j=0; j<=d; j++){ if (e[i][1] > 0) { m[i][j]=(m[i][j]/e[i][1]).toFixed(2); } } } //----------------[ END ]------------------| var t = []; for(var i=0; i<=d+1; i++){ t[i]=[]; for(var j=0; j<=d+1; j++){ if (j == 0 && i == 0) {t[i][j] = n;} if (i>0 && j>0) {t[i][j] = m[i-1][j-1];} if (i == 0 && j>0 && j<=d+1) {t[i][j]=a[j-1];} if (j == 0 && i>0 && i<=d+1) {t[i][j]=a[i-1];} } } return t; } // SHOW MATRIX CONTENT function SMC(m) { var r = "<table border=1>"; for(var i=0; i<m.length; i++) { r += "<tr>"; for(var j=0; j<m[i].length; j++){ r += "<td>"+m[i][j]+"</td>"; } r += "</tr>"; } r += "</table>"; return r; }

github上的項目:

https://github.com/gagniuc/Markov-Chains-Java-Script

https://github.com/gagniuc/Discrete-Probability-Detector

https://github.com/gagniuc/Discrete-Probability-Detector-in-VB6

參考

保羅·加格紐克。 馬爾可夫鏈:從理論到實現和實驗。 新澤西州霍博肯,美國約翰威利父子公司,2017 年,ISBN:978-1-119-38755-8。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM