Я пытаюсь свернуть логнормальный 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 )
, я получаю совсем другие результаты:
Здесь явно что-то не так. Результат моего интеграла свертки F(x) = int (g(t)*f(x-t))dt
не должен зависеть от диапазона "x". Затем я сделал домен большим, то есть x = np.linspace( 0.00001, 100, 10000 )
, что дает мне такую ерунду:
Либо в моем сценарии есть простая ошибка, либо я неправильно понимаю дискретную свертку.
scipy.stats.lognorm
- person percusse   schedule 06.11.2017scipy.stats.lognorm.pdf
. Я просто скопировал формулу из Википедии. Я подозреваю, что моя проблема заключается в моем понимании того, что делаетscipy.signal.convolve
(синяя пунктирная линия на графиках). - person Sebastiano1991   schedule 06.11.2017