如何处理卷积中的离一问题(Python)?

问题描述 投票:0回答:1

我正在尝试编写一个函数来添加两个随机变量

X1
X2
。就我而言,它们都是从
0
a1
0
a2
的统一随机变量。为了计算随机变量
Y = X1 + X2
,我需要对
X1
X2
的概率分布进行卷积。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import simps

def convolution(f, g, x_range):
    delta = (x_range[-1] - x_range[0])/len(x_range)
    result = np.convolve(f(x_range), g(x_range), mode = 'full')*delta
    return result

# Define uniform distribution for some a > 0. This part can be adapted to arbitrary distributions
def uniform_dist(x, a):
    return np.where((x >= 0) & (x <= a), 1/a, 0)

# Set the range of x values, y values and constants
delta = 0.1
x_lim_low = -5
x_lim_upp = 5
a1 = 1
a2 = 1
x_range = np.arange(x_lim_low,x_lim_upp+delta,delta)
y_range = np.arange(2*x_lim_low,2*x_lim_upp+delta,delta)


# Perform convolution
convolution_pdf = convolution(lambda x: uniform_dist(x, a1), lambda x: uniform_dist(x, a2), x_range)


# Find mean of convolution
convolution_mean = np.sum(convolution_pdf*y_range)*delta

我尝试了各种组合,但平均值存在小误差。我认为这是因为卷积是一个维度为

2*len(x_range) - 1
的数组,并且不清楚如何处理这个错误。

卷积到变量的正确方法是什么,以便我可以正确计算卷积的平均值?

python probability convolution off-by-one
1个回答
0
投票

convolution
中,您计算出的
delta
不正确。

要获得更好的样本点,不要使用

np.arange
而是使用
np.linspace

现在

convolution_mean = 1.21

import numpy as np

def convolution(f, g, x_range):
    delta = x_range[1]-x_range[0]
    return np.convolve(f(x_range), g(x_range), mode = 'full') * delta

# Define uniform distribution for some a > 0. This part can be adapted to arbitrary distributions
def uniform_dist(x, a):
    return np.where((x >= 0) & (x <= a), 1/a, 0)

# Set the range of x values, y values and constants
delta = 0.1
one_over_delta = 10
x_lim_low = -5
x_lim_upp = 5
a1 = 1
a2 = 1

x_range = np.linspace(x_lim_low*one_over_delta, x_lim_upp*one_over_delta, (x_lim_upp - x_lim_low)*one_over_delta + 1) / one_over_delta
y_range = np.linspace(2*x_lim_low*one_over_delta, 2*x_lim_upp*one_over_delta, 2*(x_lim_upp - x_lim_low)*one_over_delta + 1) / one_over_delta

# Perform convolution
convolution_pdf = convolution(lambda x: uniform_dist(x, a1), lambda x: uniform_dist(x, a2), x_range)

# Find mean of convolution
convolution_mean = np.sum(convolution_pdf * y_range) * delta

print(convolution_mean)
© www.soinside.com 2019 - 2024. All rights reserved.