Python: как получить свертку двух непрерывных распределений?

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

Спасибо

@Goyo Это функции плотности вероятности

Pasindu Tennage 16.09.2018 14:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
1
6 374
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Обратите внимание, что fftconvolve не может сделать это сам по себе, поскольку он не знает фактических 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, есть ли способ использовать эту функцию свертки для подбора этих данных?

Arturo Rodriguez 03.07.2020 17:41

Другая проблема заключается в том, предполагает ли свертка в python независимость компонентов, что всегда предполагает большая часть теории, лежащей в основе сверток и характеристических функций. В реальном мире эмпирические данные не зависят от нет.

develarist 04.12.2020 12:17

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

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

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

Другие вопросы по теме