序列的熵

时间:2014-01-14 15:20:33

标签: python sequences entropy

有人可以帮我纠正我的代码吗? 我有3个序列

 seq1='AATC'
 seq2='GCCT'
 seq3='ATCA'

我想计算三个序列的熵,其公式为:

Entropy (A[:][i])= - ∑  p_ia log( p_ia)
p_ia = C_ia /∑  C_ia'

其中p_ia是第i列中字母a的概率,而C_ia是A列中字母a的数字[:] [i]

示例:来自以上3个序列:第一列:a'取值C,A和C,这里C_ia'= 3,如果a ='C'C_ia = 2所以p_ia = 2/3,

如果a ='A'C_ia = 1,那么p_ia = 1/3

Entropy (A[:][0])=-(2/3 log (2/3)+1/3 log(1/3))

其他列的相同内容。 我试过这个: 此函数计算给定字符串中每个字母的出现次数(频率),l是字符串的长度,表示l=∑ C_ia'.

def occ(source):
    occ={}
    l=0
    for e in source:
        l +=1
        if e not in occ:
            occ[e]=0
        occ[e]+=1
    return (l,occ)

示例:

>>> source='aaazzzedc'
>>> occ(source)
(9, {'z': 3, 'c': 1, 'a': 3, 'd': 1, 'e': 1})

然后,这是熵的函数:

def entropy(occ,l):
    elist=[]
    for v in occ.values():
        c=v/l
        elist.append(-c *math.log(c, 2))
    return sum(elist)

示例:

>>> (l,h)=occ(source)
>>> entropy(h,l)
2.113283334294875

行。 这是一个简单的例子,但对我来说,我想将它应用于序列列。

>>> source=[occ(t) for t in zip(seq1,seq2,seq3)]
>>> source
[(3, {'A': 2, 'G': 1}), (3, {'C': 1, 'A': 1, 'T': 1}), (3, {'C': 2, 'T': 1}), (3, {'C': 1, 'A': 1, 'T': 1})]

如何计算这些序列的熵? 这由第一栏给出:

(3, {'A': 2, 'G': 1})
2/3 * log(2/3)+ 1/3 * log (1/3)

如何写出所有列的熵?

0 个答案:

没有答案