Могут ли мне помочь исправить мой код? У меня есть 3 последовательности
seq1='AATC'
seq2='GCCT'
seq3='ATCA'
Я хочу вычислить энтропию трех последовательностей, ее формула:
Entropy (A[:][i])= - ∑ p_ia log( p_ia)
p_ia = C_ia /∑ C_ia'
где p_ia - это вероятность появления буквы a в столбце i, а C_ia - это номер буквы a в столбце A [:] [i]
пример: из трех приведенных выше последовательностей: первый столбец: a 'принимает значения C, A и C, здесь C_ia' = 3, если a = 'C' C_ia = 2, поэтому p_ia = 2/3,
if a='A' C_ia=1 so 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
OK. это простой пример, но я хочу применить его к столбцам последовательностей.
>>> 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)
Как мне записать энтропию всех столбцов?
for
(for v in occ.values():
), распаковывать кортежи ((l,h)=occ(source)
) и вызывать функции (entropy(h,l)
). Что еще нужно делать? - person jonrsharpe   schedule 14.01.2014opp
иentropy
функций в нужное место и создать новые списки (например,entropies = []
для хранения результатов. - person jonrsharpe   schedule 14.01.2014>> entropies=[]. >>> for position in zip(seq1,seq2,seq3): (l,h)=occ(position) m=entropy(h,l) entropies.append(m)
- person user3184809   schedule 14.01.2014entropy
в том же порядке, что и возвращаемые значения изocc
, вы можете сократить три строки до одной (entropies.append(entropy(*occ(position)))
- обратите внимание на*
). - person jonrsharpe   schedule 14.01.2014