根据我的理解,独立随机变量的总和将与输入分布的卷积相同。
但是,在进行实验时,我发现变量总和的分布与卷积结果的分布不匹配。
例如:均匀分布的两个独立随机变量的总和应遵循三角形分布。但卷积则不然。我尝试使用
numpy.convolve
。
我错过了什么吗?
import numpy as np
import matplotlib.pyplot as plt
# Generate two uniform distributions
uniform1 = np.random.uniform(0, 1, 100000)
uniform2 = np.random.uniform(0, 1, 100000)
# Convolution of two uniform distributions
convolution_result = np.convolve(uniform1, uniform2, mode='full')
# Plot the histograms
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.hist(uniform1 + uniform2, bins=50, density=True, alpha=0.7)
plt.title('Sum of Uniform Distributions')
plt.subplot(1, 2, 2)
plt.hist(convolution_result, bins=50, density=True, alpha=0.7)
plt.title('Convolution of Uniform Distributions')
plt.show()
enter image description here
上下文:
我有一个状态转换矩阵(概率),其中每个转换都与奖励/成本相关联,例如延迟、价格等。每个步骤可以与延迟的概率分布相关联,而不是恒定的延迟。
假设有一个起始状态和一个最终状态,我想找到总成本的分布。
在实践中,会存在大量每次转换具有不同概率的转换,并且成本/奖励可能具有任意频率分布,我应该能够找到总成本/奖励的直方图。
注意:我之前在数学社区问过这个问题,但到目前为止我无法理解回应。 https://math.stackexchange.com/questions/4855739/sum-of-Frequency-distributions-vs-convolutions
通过生成两个样本、将它们相加并构建直方图来近似变量总和的分布是有效的,因此代码的第一部分是可以的。
第二部分是出了问题的地方。您需要做的不是对样本进行卷积并绘制结果直方图,而是对密度(或至少是其近似值)进行卷积并绘制结果本身,而不是直方图。
我无法让 matplotlib 在这个古老的系统上工作,但我想你可以在这个结果中看到三角密度是如何从卷积生成的。
>>> [1 for k in range(0, 10)]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>>> np.convolve ([1 for k in range(0, 10)], [1 for k in range(0, 10)])
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3,
2, 1])
请注意,
[1 for k in range(0, 10)]
只是常数[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
——这是连续均匀分布的离散近似。
请注意,
convolve
的输出线性上升并线性下降——如果你绘制它,它看起来像一个三角形。