首页 > 解决方案 > 条件概率 - Python

问题描述

我正在解决这个 python 问题:

给定 DNA 碱基 {A, C, G, T} 的序列,存储为字符串,返回数据结构中的条件概率表,以便可以查找一个碱基 (b1),然后查找第二个碱基 (b2) ,以获得第二个碱基在第一个碱基之后立即发生的概率 p(b2 | b1)。(假设 seq 的长度 >= 3,并且从未一起见过的任何 b1 和 b2 的概率为 0。忽略 b1 后面跟着字符串结尾的概率。)

您可以使用 collections 模块,但不能使用其他库。

但是我遇到了障碍:

word = 'ATCGATTGAGCTCTAGCG'

def dna_prob2(seq):
    tbl = dict()
    levels = set(word)
    freq = dict.fromkeys(levels, 0)
    for i in seq:
        freq[i] += 1
    for i in levels:
        tbl[i] = {x:0 for x in levels}
    lastlevel = ''
    for i in tbl:
        if lastlevel != '':
             tbl[lastlevel][i] += 1
        lastlevel = i
    for i in tbl:
        print(i,tbl[i][i] / freq[i])
    return tbl

tbl['T']['T'] / freq[i] 

基本上,最终结果应该是tbl您在上面看到的最后一行。但是,当我尝试在print(i,tbl[i][i] /freq[i)和 run中执行此操作时dna_prob2(word),所有内容都会得到 0.0s。

想知道这里是否有人可以提供帮助。

谢谢!

标签: pythonprobability

解决方案


我不确定您的代码在做什么,但这有效:

def makeprobs(word):
  singles = {}
  probs = {}
  thedict={}
  ll = len(word)
  for i in range(ll-1):
    x1 = word[i]
    x2 = word[i+1]
    singles[x1] = singles.get(x1, 0)+1.0
    thedict[(x1, x2)] = thedict.get((x1, x2), 0)+1.0
  for i in thedict:
    probs[i] = thedict[i]/singles[i[0]]
  return probs

推荐阅读