Python: Как получить свертку двух непрерывных распределений? - PullRequest
0 голосов
/ 16 сентября 2018

Пусть X, Y - 2 случайные величины с функциями плотности вероятности pdf1 и pdf2.

Z = X + Y

Тогда функция плотности вероятности Z задается сверткой pdf1 и pdf2.Поскольку мы не можем иметь дело с непрерывными распределениями, мы описываем непрерывные распределения и разбираемся с ними.

Чтобы найти свертку равномерного и нормального распределения, я придумал следующий код.

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from scipy import signal


uniform_dist = stats.uniform(loc=2, scale=3)
std = 0.25
normal_dist = stats.norm(loc=0, scale=std)

delta = 1e-4
big_grid = np.arange(-10,10,delta)

pdf1 = uniform_dist.pdf(big_grid)
print("Integral over uniform pdf: "+str(np.trapz(pdf1, big_grid)))

pdf2 = normal_dist.pdf(big_grid)
print("Integral over normal pdf: "+str(np.trapz(pdf2, big_grid)))


conv_pdf = signal.fftconvolve(pdf1,pdf2,'same')
print("Integral over convoluted pdf: "+str(np.trapz(conv_pdf, big_grid)))

plt.plot(big_grid,pdf1, label='Tophat')
plt.plot(big_grid,pdf2, label='Gaussian error')
plt.plot(big_grid,conv_pdf, label='Sum')
plt.legend(loc='best'), plt.suptitle('PDFs')
plt.show() 

Это вывод, который я получаю.

Интеграл по униформе pdf: 0.9999999999976696

Интеграл по нормальному pdf: 1.0

Интеграл по запутанному pdf: 10000.0

Если свертка была правильной, я должен получить значение, близкое к 1, для «Интегральный над извитым pdf»Так что здесь не так?Есть ли лучший подход для решения этой проблемы?

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Перед сверткой вы должны описать свой pdf в функции вероятности.

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from scipy import signal


uniform_dist = stats.uniform(loc=2, scale=3)
std = 0.25
normal_dist = stats.norm(loc=0, scale=std)

delta = 1e-4
big_grid = np.arange(-10,10,delta)

pmf1 = uniform_dist.pdf(big_grid)*delta
print("Sum of uniform pmf: "+str(sum(pmf1)))

pmf2 = normal_dist.pdf(big_grid)*delta
print("Sum of normal pmf: "+str(sum(pmf2)))


conv_pmf = signal.fftconvolve(pmf1,pmf2,'same')
print("Sum of convoluted pmf: "+str(sum(conv_pmf)))

pdf1 = pmf1/delta
pdf2 = pmf2/delta
conv_pdf = conv_pmf/delta
print("Integration of convoluted pdf: " + str(np.trapz(conv_pdf, big_grid)))


plt.plot(big_grid,pdf1, label='Uniform')
plt.plot(big_grid,pdf2, label='Gaussian')
plt.plot(big_grid,conv_pdf, label='Sum')
plt.legend(loc='best'), plt.suptitle('PDFs')
plt.show()
0 голосов
/ 19 сентября 2018

Помимо дискретизации, в настоящее время это представляется невозможным для непрерывных распределений scipy.stats, поскольку свертка приводит к появлению уникальных распределений.Если одна функция плотности гауссова, а другая равномерна, их свертка является «размытой гауссовой».Это не является ни гауссовым, ни равномерным.

Однако, есть несколько полезных частных случаев.Например, если вы имеете дело с нормальными распределениями, свертка двух независимых распределений также будет нормальной.

Только одна деталь, не подчеркнутая в вашем вопросе - формула свертки имеет место только в том случае, если X и Y независимы.

0 голосов
/ 16 сентября 2018

Чтобы это работало с дискретизированными PDF-файлами, вам нужно нормализовать вывод fftconvolve:

conv_pdf = signal.fftconvolve(pdf1, pdf2, 'same') * delta

enter image description here

Обратите внимание, что fftconvolve не может сделать это сам по себе, так как он не знает фактических PDF, только значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...