我想从给定的数据生成一个Markov Chain
。
我要解决的是PG
的第一个字符串是否为M vs. S type
。好吧,很明显,字符串A-G-T-T-C-A-G-T-G-T-A
是M 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,并对以后的列表(或您使用的任何数据结构)执行相同的操作。
我希望这会有所帮助-让我知道是否还有其他使您感到困惑的地方,或者是否有任何不清楚的代码。祝好运!