Python 这是两个PDF的卷积吗?

Python 这是两个PDF的卷积吗?,python,statistics,distribution,Python,Statistics,Distribution,这是我在网站上的第一个问题! 我想得到两个(或更多)随机变量的和,所以我这样做了 from scipy.stats import exponweib import numpy as np import matplotlib.pyplot as plt # Parameters shape, scale, delta = 1.3, 12, 1e-2 dist = exponweib(a=1, loc=0, c=shape, scale=scale) grid = np.arange(0, 10

这是我在网站上的第一个问题! 我想得到两个(或更多)随机变量的和,所以我这样做了

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

# Parameters
shape, scale, delta = 1.3, 12, 1e-2

dist = exponweib(a=1, loc=0, c=shape, scale=scale)
grid = np.arange(0, 100, delta)
pmfs = dist.pdf(grid)*delta

# Do convolution (?)
def conv(a,b):
    x = np.array([sum(a[:i+1]*b[i::-1]) for i in range(len(a))])
    return x

# Loop to convolve over multiple RVs
c = {1: pmfs}
for i in range(2, 4):
    c[i] = conv(c[i-1], pmfs)

plt.plot(grid, c[1])
plt.plot(grid, c[2])
plt.plot(grid, c[3]);
所以,我明白了 ,这看起来像我想要的,但它运行起来非常慢

我想实现对两个独立随机变量求和,得到它们的离散化PDF。建议使用scipy.signal.fftconvolve的其他问题

x = fftconvolve(pmfs, pmfs, 'same')
plt.plot(grid, x);

但这让我很难过。为什么不同?

在计算PDF网格时,必须在左侧(和右侧)有零,否则F-image将无法正确计算

运行下面的代码之后

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

shape, scale, delta = 1.3, 12.0, 1.0e-1
dist = exponweib(a=1, loc=0, c=shape, scale=scale)

grid = np.arange(-50, 100, delta)
ewei = dist.pdf(grid)*delta

plt.plot(grid, ewei)
plt.show()

# %%
t = signal.fftconvolve(ewei, ewei, 'same')
plt.plot(grid, t)
plt.show()
我得到了很好的卷积分布图


您的函数
conv
看起来方向正确,尽管
b
不需要从末尾开始向后运行吗?在尝试更大的示例之前,您应该在一些小示例上测试
conv
。例如,[1,1]与[1,1]的卷积应该是[1,2,1],conv([1,1],[1,2,1])应该是[1,3,3,1],等等;conv(a,b)应该是conv(b,a),等等。我发现对这样的东西使用八度音阶很有用,它有一个函数,也叫
conv
。fftconvolve的图对我来说很合适——凹凸应该越卷积越平滑。谢谢你的回答,看看你的例子,我看到的可能不是“卷积”。我对这个问题稍加修改以澄清我的意图。这里有点混乱是的,对于变量之和,你需要卷积。如果使用的是连续密度,则必须小心规范化。我的建议是首先尝试使用Octave来了解这个问题,因为它的
conv
函数做的事情完全正确,然后在需要时用Python实现一些东西。