8

我想使用 SciPy 的反卷积函数来查找给定两个高斯分布的未知分布。SciPy中没有与此函数相关的文档,因此我只是在寻找一个示例,说明如何在我的情况下使用此函数。例如,给定两个正态分布 N(100, 1)、N(300, 2),我想了解如何找到反卷积 N(200, 1) 的分布。

>>> sample1 = np.round(scipy.around(scipy.stats.norm(100, 1).rvs(size=1000)))
>>> sample2 = np.round(scipy.stats.norm(300, 2).rvs(size=2000))
>>> signal.deconvolve(sample1, sample2)

上面的代码给了我负值,这似乎是错误的。如何从此反卷积中恢复分布 N(200, 1)?特别是,我认为我的问题是我不明白如何获得除数。

我真正想看到的是如何使用 SciPy 的反卷积从这些样本中恢复 ~ N(200, 1) 的示例。

4

1 回答 1

5

我认为你对你的期望有点困惑......因为我们都知道两个正态分布的卷积另一个正态分布,平均值是平均值之和,方差是方差之和,你似乎期望两个正态随机样本的卷积也将是一个正态随机样本。事实并非如此:

a = scipy.stats.norm(100, 1).rvs(size=1000)
b = scipy.stats.norm(200, 1).rvs(size=1000)
c = scipy.convolve(a, b)
plt.subplot(311)
plt.hist(a, bins=50)
plt.subplot(312)
plt.hist(a, bins=50)
plt.subplot(313)
plt.hist(a, bins=50)

在此处输入图像描述

您可能正在考虑以下内容:

a = scipy.stats.norm(100, 10).pdf(np.arange(500))
b = scipy.stats.norm(200, 20).pdf(np.arange(500))
c = scipy.convolve(a, b)
m_ = max(a.max(), b.max(), c.max())
plt.subplot(311)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(a)
plt.subplot(312)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(b)
plt.subplot(313)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(c)

在此处输入图像描述

无论如何,回到deconvolve......如果你用两个长度为mand的数组调用它n,它将返回一个包含两个数组的元组:

  • lengthm - n + 1中的第一个是反卷积数组,即您应该将第二个数组与之卷积的数组,以获得第一个
  • 长度的第二个m是用第二个与第一个返回的卷积替换第一个数组时的错误。
于 2013-03-18T19:26:52.993 回答