2013-04-18 446 views
2

我在做生物信息學,我們在mRNA上繪製小RNA。我們有每個mRNA上蛋白質的映射座標,我們計算蛋白質結合mRNA的位置和被小RNA結合的位點之間的相對距離。通過高斯和scipy相加的曲線擬合

我獲得以下數據集:

dist eff 
-69 3 
-68 2 
-67 1 
-66 1 
-60 1 
-59 1 
-58 1 
-57 2 
-56 1 
-55 1 
-54 1 
-52 1 
-50 2 
-48 3 
-47 1 
-46 3 
-45 1 
-43 1 
0 1 
1 2 
2 12 
3 18 
4 18 
5 13 
6 9 
7 7 
8 5 
9 3 
10 1 
13 2 
14 3 
15 2 
16 2 
17 2 
18 2 
19 2 
20 2 
21 3 
22 1 
24 1 
25 1 
26 1 
28 2 
31 1 
38 1 
40 2 

當我繪製數據,我有3張圖片:1在另一個大約3 -4 大約20和圍繞-50最後一個。

我嘗試三次樣條插值,但它對我的數據不起作用。

我的想法是用高斯總和做曲線擬合。例如在我的情況下,在點5,20和-50估計3高斯曲線。

我該怎麼做?

我看着scipy.optimize.curve_fit(),但我怎麼能適應曲線精確intervalle? 如何添加曲線使其具有單一曲線?

+0

'K-means'集羣會爲你工作嗎? – Geoff

+0

儘管Jaime的良好答案顯示您的數據不太合適,請參閱[python中單獨混合使用的高斯混合體](http://下的[PyMix] stackoverflow.com/questions/14189937/separate-mixture-of-gaussians-in-python)。 – denis

回答

5
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats 
import scipy.optimize 

data = np.array([-69,3, -68, 2, -67, 1, -66, 1, -60, 1, -59, 1, 
       -58, 1, -57, 2, -56, 1, -55, 1, -54, 1, -52, 1, 
       -50, 2, -48, 3, -47, 1, -46, 3, -45, 1, -43, 1, 
       0, 1, 1, 2, 2, 12, 3, 18, 4, 18, 5, 13, 6, 9, 
       7, 7, 8, 5, 9, 3, 10, 1, 13, 2, 14, 3, 15, 2, 
       16, 2, 17, 2, 18, 2, 19, 2, 20, 2, 21, 3, 22, 1, 
       24, 1, 25, 1, 26, 1, 28, 2, 31, 1, 38, 1, 40, 2]) 
x, y = data.reshape(-1, 2).T 

def tri_norm(x, *args): 
    m1, m2, m3, s1, s2, s3, k1, k2, k3 = args 
    ret = k1*scipy.stats.norm.pdf(x, loc=m1 ,scale=s1) 
    ret += k2*scipy.stats.norm.pdf(x, loc=m2 ,scale=s2) 
    ret += k3*scipy.stats.norm.pdf(x, loc=m3 ,scale=s3) 
    return ret 


params = [-50, 3, 20, 1, 1, 1, 1, 1, 1] 

fitted_params,_ = scipy.optimize.curve_fit(tri_norm,x, y, p0=params) 

plt.plot(x, y, 'o') 
xx = np.linspace(np.min(x), np.max(x), 1000) 
plt.plot(xx, tri_norm(xx, *fitted_params)) 
plt.show() 

enter image description here

>>> fitted_params 
array([ -60.46845528, 3.801281 , 13.66342073, 28.26485602, 
      1.63256981, 10.31905367, 110.51392765, 69.11867159, 
     63.2545624 ]) 

所以,你可以看到你的三個峯函數的想法並不認同太多與你的真實數據。