我原本打算使用MATLAB來解決這個問題,但內置函數的侷限性不符合我的目標。 NumPy中出現相同的限制。Python - 計算大數據集上的多項式概率密度函數?
我有兩個製表符分隔的文件。首先是一個文件表示的氨基酸殘基,頻率和計數蛋白質結構的一個內部數據庫,即
A 0.25 1
S 0.25 1
T 0.25 1
P 0.25 1
第二個文件由氨基酸四胞胎和它們發生的次數,即,
的ASTP 1
請注意,有> 8000這樣的四聯組。
根據每個氨基酸出現的背景頻率和四聯體計數,我的目標是計算每個四聯體的多項式概率密度函數,並隨後將其用作最大似然計算中的期望值。
的多項分佈如下:
f(x|n, p) = n!/(x1!*x2!*...*xk!)*((p1^x1)*(p2^x2)*...*(pk^xk))
其中x是每個k成果的與固定概率p n次試驗的數目。在我的計算中,n總共是4。
我創建了四個函數來計算這個分佈。
# functions for multinomial distribution
def expected_quadruplets(x, y):
expected = x*y
return expected
# calculates the probabilities of occurence raised to the number of occurrences
def prod_prob(p1, a, p2, b, p3, c, p4, d):
prob_prod = (pow(p1, a))*(pow(p2, b))*(pow(p3, c))*(pow(p4, d))
return prob_prod
# factorial() and multinomial_coefficient() work in tandem to calculate C, the multinomial coefficient
def factorial(n):
if n <= 1:
return 1
return n*factorial(n-1)
def multinomial_coefficient(a, b, c, d):
n = 24.0
multi_coeff = (n/(factorial(a) * factorial(b) * factorial(c) * factorial(d)))
return multi_coeff
的問題是如何最好地結構中的數據,以便最有效地解決計算的方式,我可以讀(你們寫一些神祕的代碼:-)),並且不會產生溢出或運行時錯誤。
迄今爲止,我的數據被表示爲嵌套列表。
amino_acids = [['A', '0.25', '1'], ['S', '0.25', '1'], ['T', '0.25', '1'], ['P', '0.25', '1']]
quadruplets = [['ASTP', '1']]
我最初打算在嵌套for循環內調用這些函數,但這會導致運行時錯誤或溢出錯誤。我知道我可以重置遞歸限制,但我寧願更優雅地做這件事。
我有以下幾點:
for i in quadruplets:
quad = i[0].split(' ')
for j in amino_acids:
for k in quadruplets:
for v in k:
if j[0] == v:
multinomial_coefficient(int(j[2]), int(j[2]), int(j[2]), int(j[2]))
我haven'te真正得到如何整合其他功能呢。我認爲我目前的嵌套列表安排是次優的。
我希望將字符串'ASTP'中的每個字母與amino_acids中每個子列表的第一個組件進行比較。如果存在匹配,我希望將適當的數值傳遞給使用索引的函數。
他們是更好的方法嗎?我可以將每個氨基酸和四聯體的適當數字附加到循環中的臨時數據結構中,將其傳遞給函數並將其清除以用於下一次迭代?
感謝,S :-)
真的很有幫助的答案,但我認爲你的最後一行應該是(n,counts,probs)? – hardingnj 2014-11-18 13:40:01
另外,'n'是多餘的,因爲它總是計數的總和? – hardingnj 2014-11-18 13:41:18
是的,你是對的,謝謝 - 我已經解決了我的答案。 – 2014-11-18 13:48:00