使用所述mchmm库,使用特定大小的转移矩阵和给定种子生成马尔可夫链模拟



我正试图使用scipy和numpy编码的mchmm库,以特定序列为起点生成马尔可夫模拟。我不确定我是否正确地使用了它,因为该库在马尔可夫的上下文中也有Viterbi和Baum-Welch算法,我对此并不熟悉。

为了说明这一点,我将继续举一个例子。

data = 'AABCABCBAAAACBCBACBABCABCBACBACBABABCBACBBCBBCBCBCBACBABABCBCBAAACABABCBBCBCBCBCBCBAABCBBCBCBCCCBABCBCBBABCBABCABCCABABCBABC'
a = mc.MarkovChain().from_data(data)

我想要一个基于3状态转换矩阵的马尔可夫模拟,从上面("ABC"(序列中的最后3个字符开始

start_sequence = data[-3:]
tfm3 = a.n_order_matrix(a.observed_p_matrix, order=3) #this is because  I want an order 3 transition matrix
ids, states = a.simulate(n=10, tf=tfm3, start=start_sequence)

返回:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_2552615/2308700615.py in <module>
----> 1 ids, states = a.simulate(n=10, tf=tfm3, start=start_sequence)
~/anaconda3/lib/python3.8/site-packages/mchmm/_mc.py in simulate(self, n, tf, states, start, ret, seed)
304             _start = np.random.randint(0, len(states))
305         elif isinstance(start, str):
--> 306             _start = np.argwhere(states == start).item()
307 
308         # simulated sequence init
ValueError: can only convert an array of size 1 to a Python scalar

我希望得到一个10个字符的序列,从字符串"ABC"(数据[-3:](开始,因为我想约束马尔可夫模拟从该特定序列所暗示的概率开始,并遵循3阶马尔可夫。

有什么反馈吗?

MarkovChain实例a中的状态为'A''B''C'。当给simulate方法一个state的字符串时,它希望它是其中一个状态的名称,即'A''B''C'。您得到这个错误是因为data[-3:]不是其中一个状态。

例如,在下面的例子中,我在调用simulate()时使用start='A',它从'A'开始生成一个10个状态的序列:

In [26]: data = 'AABCABCBAAAACBCBACBABCABCBACBACBABABCBACBBCBBCBCBCBACBABABCBCBA
...: AACABABCBBCBCBCBCBCBAABCBBCBCBCCCBABCBCBBABCBABCABCCABABCBABC'
In [27]: a = mc.MarkovChain().from_data(data)
In [28]: tfm3 = a.n_order_matrix(a.observed_p_matrix, order=3)
In [29]: ids, states = a.simulate(n=10, tf=tfm3, start='A')
In [30]: states
Out[30]: array(['A', 'C', 'A', 'C', 'C', 'C', 'A', 'A', 'C', 'B'], dtype='<U1')

如果你试图创建一个状态是三个符号序列的马尔可夫链(添加包括前两个状态的"历史"(,你可以创建一个.from_data()的新输入,它由data的长度为3的重叠子序列组成(也称为3克(。例如,

In [65]: data3 = [data[k:k+3] for k in range(len(data)-2)]
In [66]: data3[:4]
Out[66]: ['AAB', 'ABC', 'BCA', 'CAB']
In [67]: data3[-8:]
Out[67]: ['CAB', 'ABA', 'BAB', 'ABC', 'BCB', 'CBA', 'BAB', 'ABC']
In [68]: a = mc.MarkovChain().from_data(data3)

看看这个马尔可夫链的状态:

In [69]: a.states
Out[69]: 
array(['AAA', 'AAB', 'AAC', 'ABA', 'ABC', 'ACA', 'ACB', 'BAA', 'BAB',
'BAC', 'BBA', 'BBC', 'BCA', 'BCB', 'BCC', 'CAB', 'CBA', 'CBB',
'CBC', 'CCA', 'CCB', 'CCC'], dtype='<U3')

模拟10个转换,从data3:中的最后一个状态开始

In [70]: ids, states = a.simulate(n=10, start=data3[-1])
In [71]: states
Out[71]: 
array(['ABC', 'BCA', 'CAB', 'ABC', 'BCB', 'CBC', 'BCB', 'CBA', 'BAA',
'AAB'], dtype='<U3')

压缩状态以只包括最后一个字符,因此它以原始data输入的形式返回:

In [72]: ''.join([state[-1] for state in states])
Out[72]: 'CABCBCBAAB'

最新更新