Пусть 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-файлу». Так что здесь не так? Есть ли лучший подход к решению этой проблемы?
Спасибо






Перед сверткой вы должны описать свой 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()
Извините за то, что снова оживил эту ветку. Предположим, у вас есть данные, следующие за conv_pdf, есть ли способ использовать эту функцию свертки для подбора этих данных?
Другая проблема заключается в том, предполагает ли свертка в python независимость компонентов, что всегда предполагает большая часть теории, лежащей в основе сверток и характеристических функций. В реальном мире эмпирические данные не зависят от нет.
Помимо дискретизации, это, похоже, в настоящее время невозможно с непрерывными распределениями scipy.stats, поскольку свертка порождает уникальные распределения. Если одна функция плотности является гауссовой, а другая однородной, их свертка является «размытой гауссовой». Это ни гауссово, ни однородное.
Однако есть несколько полезных частных случаев. Например, если вы имеете дело с нормальными распределениями, свертка двух независимых распределений также будет нормальной.
Только одна деталь, не подчеркнутая в вашем вопросе, - формула свертки выполняется, только если X и Y независимы.
@Goyo Это функции плотности вероятности