Python scipy卷积依赖于x

Python scipy卷积依赖于x,python,scipy,convolution,Python,Scipy,Convolution,我试图将对数正态PDF和高斯PDF进行卷积。因此,我以以下方式定义了这些功能: def PDF_log(x,sig,mu): # log normal PDF mu = np.log(mu) return( (1/x)*(1/(sig*np.sqrt(2*np.pi))) * np.exp(-(np.log(x)-mu)**2/(2*sig**2)) ) def gauss(x,sig,mu): # a noraml PDF return( 1/(np.sqrt(2*n

我试图将对数正态PDF和高斯PDF进行卷积。因此,我以以下方式定义了这些功能:

def PDF_log(x,sig,mu): # log normal PDF
   mu = np.log(mu)
   return( (1/x)*(1/(sig*np.sqrt(2*np.pi))) * np.exp(-(np.log(x)-mu)**2/(2*sig**2)) )   

def gauss(x,sig,mu): # a noraml PDF
   return( 1/(np.sqrt(2*np.pi*sig**2)) * np.exp(-(x-mu)**2/(2.*sig**2)) )

def gauss_log(x, sig, mu, sig0, mu0):
    a = signal.convolve(PDF_log(x,sig,mu),gauss(x,sig0,mu0),mode='same')/np.sum(gauss(x,sig0,mu0)) 


def test():
    mu = 0.6
    sig = 0.2
    sig0 = 0.05
    mu0 = mu
    x = np.linspace( 0.5, 0.6, 10000 )
    plt.plot( x, gauss_log(x, sig, mu, sig0, mu0), '--', label='gauss_X_log', zorder=10 )
    plt.plot( x, gauss(x,sig0,mu0), label='gauss' )
    plt.plot( x, PDF_log(x,sig,mu), label='log' )
    plt.legend()
    plt.show()
这给了我以下结果:

红线表示对数正态PDF,绿线表示高斯分布。卷积是蓝色虚线。 当我改变x域x=np.linspace 0.5,0.8,10000时,我得到了非常不同的结果:

很明显这里有点不对劲。卷积积分Fx=int gt*Fx tdt的结果不应取决于x的范围。 然后,我将域变大,即x=np.linspace 0.0000110010000,这给了我这样的废话:


要么是我的脚本中有一个简单的错误,要么是我误解了离散卷积

我找到了我的错误所在:

而不是有一个合适的核函数gaussx0,sig0,mu;我用同样的x表示高斯分布

这就是我认为上面的PDF是正确的:

def gauss_log(x, x0, sig, mu, sig0, mu0):
    a = signal.convolve(gauss(x0,sig0,mu0),PDF_log(x,sig,mu),mode='same')/np.sum(gauss(x0,sig0,mu0))
    return( a )

def test(lightcurve,noisecurve):
    mu = 0.1 #can now put arbitrary small values of mu
    sig = 0.1
    sig0 = 0.05
    mu0 = 0
    x = np.linspace( 0.00001, 5, 1000 )
    x0 = np.linspace(-5,5,1000) #note that arrays need to be equal length!
    g_log = gauss_log(x, x0, sig, mu, sig0, mu0)
    plt.plot( x, g_log, '--', label='gauss_X_log', zorder=10 )
    plt.plot( x0, gauss(x0,sig0,mu0), label='gauss' )
    plt.plot( x, PDF_log(x,sig,mu), label='log' )
    plt.legend()
    plt.show()

    ###testing normalization!
    print(np.trapz(gauss(x0,sig0,mu0),x0))
    print(np.trapz(g_log,x))
    print(np.trapz(PDF_log(x,sig,mu),x))
1.0

0.999938903253

1.0


你可以将你的lognormal与scipy.stats.lognormal进行比较。我认为我的lognormal PDF还可以,至少我可以在使用scipy.stats.lognorm.PDF时匹配它们。我只是从维基百科复制了这个公式。我怀疑我的问题在于我对scipy.signal.convolve在图中的蓝色虚线所做的理解。@Sebastiano1991要恢复预期结果,必须在信号的整个域上进行卷积-从无穷到无穷。对于正态分布,您可以将积分限制为平均值-几倍标准偏差为平均值+几倍标准偏差,具有合理的精度,但这里的域太小。这就是我所期望的-因此我将第三个图中的“积分域”增加到[~0100]。这对于“较小的均值侧”是否仍然很小,即对于所有较小的均值,这是否会失败?是否有潜在的解决方法?在一个站点上注意:scipy.signal.convolve是两个数组的离散卷积。对于大量的阵列点,这种方法非常有效。在我的实际情况中,我只有11个数组条目,这会导致问题。为了避免这种情况,我选择使用scipy.integrate.quad对卷积积分进行数值计算,这以计算时间为代价显著改善了结果。或者,可以选择最具约束性的PDF值,例如中位数周围。