Python 来自字符串的马尔可夫链

Python 来自字符串的马尔可夫链,python,markov-chains,Python,Markov Chains,我目前正在考虑一个问题,即马尔可夫链是以字符串列表的形式给出的输入。该输入必须转换为马尔可夫链。我已经在这个问题上坐了几个小时了 我的想法:正如你在下面看到的,我尝试使用集合中的计数器来计算所有的转换,这是有效的。现在我试图计算所有元组,其中A和B是第一个元素。这给了我A的所有可能的转换 然后我将计算转换,如(A,B)。 然后我想用这些来创建一个包含所有概率的矩阵 def markov(seq): 状态=计数器(seq).keys() 列表=[] 印刷品(美国) a=zip(seq[:-1],s

我目前正在考虑一个问题,即马尔可夫链是以字符串列表的形式给出的输入。该输入必须转换为马尔可夫链。我已经在这个问题上坐了几个小时了

我的想法:正如你在下面看到的,我尝试使用集合中的计数器来计算所有的转换,这是有效的。现在我试图计算所有元组,其中A和B是第一个元素。这给了我A的所有可能的转换

然后我将计算转换,如(A,B)。 然后我想用这些来创建一个包含所有概率的矩阵

def markov(seq):
状态=计数器(seq).keys()
列表=[]
印刷品(美国)
a=zip(seq[:-1],seq[1:]
打印(列表(a))
打印(马尔可夫([“A”、“A”、“B”、“B”、“A”、“B”、“B”、“A”、“B”、“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)