Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用scipy的高斯和拟合曲线_Python_Scipy_Curve Fitting - Fatal编程技术网

Python 用scipy的高斯和拟合曲线

Python 用scipy的高斯和拟合曲线,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我在做生物信息学,我们在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

我在做生物信息学,我们在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
当我绘制数据时,我有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()


因此,您可以看到,您对三峰函数的想法与您的实际数据不太相符。

聚类对您有用吗?K-means虽然Jaime的好答案表明它不适合您的数据,但请参见下面的。
>>> fitted_params
array([ -60.46845528,    3.801281  ,   13.66342073,   28.26485602,
          1.63256981,   10.31905367,  110.51392765,   69.11867159,
         63.2545624 ])