use*_*261 2 python curve-fitting scipy
我正在做生物信息学,我们在mRNA上绘制小RNA.我们在每个mRNA上具有蛋白质的作图坐标,并且我们计算蛋白质结合mRNA的位置与由小RNA结合的位点之间的相对距离.
我获得以下数据集:
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
Run Code Online (Sandbox Code Playgroud)
当我绘制数据时,我有3张照片:1在3到4左右,另一张在20左右,最后一张在-50左右.
我尝试立方样条插值,但它对我的数据不起作用.
我的想法是用一些高斯人进行曲线拟合.例如,在我的情况下,估计在点5,20和-50处的3高斯曲线.
我怎么能这样做?
我看了scipy.optimize.curve_fit(),但我怎样才能在精确的间隔时间拟合曲线?如何将曲线添加到单曲线?
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()
Run Code Online (Sandbox Code Playgroud)

>>> fitted_params
array([ -60.46845528, 3.801281 , 13.66342073, 28.26485602,
1.63256981, 10.31905367, 110.51392765, 69.11867159,
63.2545624 ])
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到您对三个峰值函数的想法与您的实际数据不太一致.
| 归档时间: |
|
| 查看次数: |
3686 次 |
| 最近记录: |