有人可以帮我纠正我的代码吗? 我有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)
如何写出所有列的熵?