将两个高斯组合成另一个高斯

时间:2013-08-06 19:33:41

标签: python numpy matplotlib scipy

在下面的代码中,我有两个高斯一个红色,另一个是紫色曲线。我想知道在python中是否有一种方法可以将高斯与第三条曲线结合起来,假设它看起来像蓝色曲线(它只是作为高斯的一个例子,据说更高更宽)?任何帮助将不胜感激。

import numpy as np
import scipy.optimize as opt
import matplotlib.pyplot as plt

def gauss(x, p): # p[0]==mean, p[1]==stdev, p[2]==heightg, p[3]==baseline                   
    a = p[2]
    mu = p[0]
    sig = p[1]
    base = p[3]
    return a * np.exp(-1.0 * ((x - mu)**2.0) / (2.0 * sig**2.0)) + base

p0 = [6804.5, 1.2, 23.0, 25.3532] # Inital guess is a normal distribution
p02 = [6804.5, 6.5, 5.0, 25.09098]

xp = np.linspace(6780, 6810, 200)
fig = plt.figure()
a1 = fig.add_subplot(111)
a1.plot(xp, gauss(xp, p0), lw=3, alpha=2.5, color='r')
a1.plot(xp, gauss(xp, p02), lw=3, alpha=2.5, color='purple')
a1.set_xlim([6798, 6810])

plt.tight_layout()
plt.show()

enter image description here

2 个答案:

答案 0 :(得分:1)

在我看来,你正在寻找两位高斯人的卷积?在这种情况下,您可以使用函数numpy.convolve(http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html#numpy.convolve)。请注意,输出数组将是两个输入数组长度的两倍。这与该卷积的定义有关,其中函数彼此相互转移。请参阅维基百科,了解一个很好的例子,显示卷积,互相关和自动关联之间的差异:http://en.wikipedia.org/wiki/Convolution

答案 1 :(得分:0)

我没有看到蓝色曲线,但我猜你正在寻找两个独立高斯之和的分布

如果

X1 ~ Gaussian(mean1,std1), and X2 ~ Gaussian(mean2, std2),

然后

X1+X2 ~ Gaussian(mean1+mean2, sqrt(std1^2 + std2^2))