字符串的马尔可夫链

时间:2019-05-27 17:14:02

标签: python markov-chains

考虑到以字符串列表形式输入的马尔可夫链,我目前正面临一个问题。此输入必须转换为马尔可夫链。我已经坐了两个小时了。

我的想法:正如您在下面看到的那样,我尝试使用集合中的计数器来计算所有转换,这是可行的。现在,我要计算所有以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"]))

到目前为止,我还无法计算出元组。 任何有关解决此问题的帮助或新想法都将受到赞赏

2 个答案:

答案 0 :(得分:1)

要计算元组,可以创建另一个计数器。

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的任务。

答案 1 :(得分: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)