我想从给定的数据生成一个Markov Chain

我要解决的是PG的第一个字符串是否为M vs. S type。好吧,很明显,字符串A-G-T-T-C-A-G-T-G-T-AM type(一般观察到),但是我想准备一个markov模型来测试此问题。

不必直接提供transition probability matrix for M vs. S,而是必须随时进行计算。因此,我必须为所有列(按块)的每个观察到的序列设置markov chain

问题1:与在大多数情况下基于文本的同一行生成链的情况不同,我必须根据文本的两行不同生成MC

block    PG    M1  M2  M3  M4  S1  S2  S3  S4
15       A|T   A   A   C   G   T   T   C   T
15       G|C   G   G   G   C   C   C   G   A
15       T|A   T   C   T   T   A   A   C   A
15       T|C   T   T   T   A   C   C   G   C
15       C|G   C   A   C   A   G   G   T   G
15       A|C   A   A   A   C   C   C   G   C
15       G|T   G   C   G   C   T   T   G   T
17       T|G   T   T   A   T   G   C   G   C
17       G|A   G   G   G   C   A   A   A   C
17       T|C   C   T   T   C   C   C   G   T
17       A|T   A   A   A   C   T   T   T   A


可以说我想创建一个first order markov chain来解决PG的第一个字符串是否为M type vs. S type

我将我的first order markov chain准备为:

Note: the opening states and closing states in each chain are repeated it self.


block    PG        M1    M2    M3    M4    S1    S2    S3    S4
15       AgA|TgT   AgA   AgA   CgC   GgG   TgT   TgT   CgC   TgT # opening state (repeated itself)
15       GgA|CgT   GgA   GgA   GgC   CgG   CgT   CgT   GgC   AgT
15       TgG|AgC   TgG   CgG   TgG   TgC   AgC   AgC   CgG   AgA
15       TgT|CgA   TgT   TgC   TgT   AgT   CgA   CgA   GgC   CgA
15       CgT|GgC   CgT   AgT   CgT   AgA   GgC   GgC   TgG   GgC
15       AgC|CgG   AgC   AgA   AgC   CgA   CgG   CgG   GgT   CgG
15       GgA|TgC   GgA   CgA   GgA   CgC   TgC   TgC   GgG   TgC
15       GgG|TgT   GgG   CgC   GgG   CgC   TgT   TgT   GgG   TgT
# this last one was closing state so repeating the transition for it's own state

# new opening transition state for another block 17
17       TgT|GgG   TgT   TgT   AgA   TgT   GgT   CgC   GgG   CgC
17       GgT|AgG   GgT   GgT   GgA   CgT   AgG   AgC   AgG   CgC
17       TgG|CgA   CgG   TgG   TgG   CgC   CgA   CgA   GgA   TgC
17       AgT|TgC   AgC   AgT   AgT   CgC   TgC   TgC   TgG   AgT
17       AgA|TgT   AgA   AgA   AgA   CgC   TgT   TgT   TgT   AgA
# the last line is closing state for another block 17


问题02:但是,如果我想使用second state markov chain,则按原样重复打开和关闭状态,但是现在不用准备相邻行的链条,而是使用第1行和第3行,第2行和第7行来准备其他MC 4,第3行与第5行。依此类推。

我尝试使用此处https://pypi.python.org/pypi?:action=search&term=markov中提供的几个markov模块,但似乎没有一个模块对我想做的事情有用(或者可能我不知道)。我认为准备我自己的功能很容易。

有人可以就此进行一些想法或帮助吗?

最佳答案

我没有足够地研究这些库,以确保其中之一不会更有帮助,但是第二种状态不需要处理向下看多行的尴尬。

拥有一阶马尔可夫链后,该表中的相邻行会告诉您原始矩阵中的3条信息行。您需要做的就是使用一组类似的for循环来解析它。

例如,查看一阶“ PG”列的前三行,我们得到:

AgA
GgA
TgG


前两行告诉您AgA是以A开头的起始行,第二行是G。这使您的第一个第二顺序开始:GgAgA。然后,第2行和第3行告诉您原始表中的1-3行,因此您可以使用它们将第二个订单表的第二行放在一起:TgGgA。在完成此过程之后,您应该能够构建第二个订单表,而不会太大地更改第一个订单代码(如果需要,甚至可以更改更高的订单)。

希望有帮助!

编辑:一阶链

要将第一顺序链放在首位,您可能需要使用一些for循环,将结果存储在列表中,或者存储一些更有效的数据类(例如集合)。现在,我将使用列表,因为它们易于使用且易于使用。

一方面,如果您要处理数百万行的数据,请注意存储的每件事。务必找到正确的数据结构,并且不要包含任何额外的信息(例如每个字符之间的“ g”)。但是目前,基本结构是什么样的?

好吧,您想遍历行和列,同时确切地知道我们需要跳多远才能从多行中获取信息。为此,我们应该先找出这些跳过距离,然后进入二维for循环。这是该程序的示意图:

dataString = *given data*
colNames = []
row = 0
col = 0
totalLines = *number of lines*
startChar = *number of characters before first M column*
skipDist = *number of characters between columns*
n = startChar
while (dataString[n] != “\n”):  # get all of the column names
    if dataString[n] == “M” or dataString[n] == “S”:
        colNames += dataString[n:n+2]
lineLength = n
numCols = len(colNames)
mcOrder1 = [[] for i in range(numCols)]

# now loop over the columns, storing the new data as you go
for row in range(totalLines)
    for col in range(numCols):
        currentChar = row*lineLength+startChar+skipDist*col
        nextLineChar = currentChar + lineLength
        mcOrder1[col] += [dataString[currentChar] + dataString[nextLineChar]]


尽管此代码中肯定有一些漏洞,但我希望它给您一些直觉,使您可以自己编写函数而不是使用外部库,应该做什么。填写mcOrder1列表后,您还应该能够构建这些循环的反向版本,以将mcOrder1转换为大字符串并再次执行。或者,您可以使用一个辅助函数将dataString分成一个列表,然后更有效地处理该MUCH,并对以后的列表(或您使用的任何数据结构)执行相同的操作。

我希望这会有所帮助-让我知道是否还有其他使您感到困惑的地方,或者是否有任何不清楚的代码。祝好运!

09-11 18:34