SciPy去卷积函数

8
我想使用SciPy的deconvolve函数,给定两个高斯分布,找到一个未知的分布。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)。

2
你说得对,这个文档确实没有很好的记录,但是你可以查看源代码,然后再查看convolve的文档。 - askewchan
1
谢谢,我尝试以这种方式理解,但似乎无法理解。如果有一个例子会非常有帮助,这样我就可以理解了。 - user1728853
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)

enter image description here

你可能想到了类似以下内容:

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)

enter image description here

无论如何,回到deconvolve的问题...... 如果你用两个长度为mn的数组调用它,则会返回一个由两个数组组成的元组:

  • 第一个数组的长度为m-n+1 ,表示反卷积后的数组,即您应该使用第二个数组来卷积第一个数组获得反卷积后的数组
  • 第二个数组的长度为m ,这个数组表示用第二个数组卷积第一个数组并替换第一个数组后的误差。

Jaime,感谢您的出色回答。我该如何使用从deconvolve()返回的数组来恢复我的信号?根据您的解释,我正在调用deconvolve(c, a),这给我一个带有负数的数组m?我应该提到我的数据是离散的(在上面的问题中进行了更正)。 - user1728853
当你调用deconvolve(c, a),返回是(b, e)。其中b是信号,e是误差,即convolve(a, b) = c - e。如果c是将a与某些东西卷积的结果,则误差将很小,您可以将b作为信号。在您的示例中,sample2不是通过将sample1与任何东西卷积而获得的,因此您会得到大量误差,并且deconvolve的返回基本上没有意义。 - Jaime
如果我有分布N(100,1)和N(200,1),它们的卷积是N(300,2)。难道N(300,2)和N(100,1)的反卷积不是N(200,1)吗?我想,我只是想看到使用2个分布进行反卷积的工作示例。 - user1728853
@user1728853 N(100,1)和N(200,1)的概率密度函数卷积是N(300,2)的概率密度函数。但是,从N(100,1)的随机样本与N(200,1)的随机样本卷积得到的结果不是来自N(300,2)的随机样本。这就是为什么你的例子行不通的原因。 - Jaime
感谢您的耐心。我非常感激您的帮助。当我将离散数据转换为PMFs,然后对PMFs进行反卷积时,仍然得到一个空的m数组和一个带有负数的n数组。这似乎仍然是错误的?我不应该得到一个大约为N(200,1)的m数组吗? - user1728853
不知怎么回事,这一切都有道理,但似乎反卷积仍然没有按预期的那样工作。我确实问了一个稍微不同的问题(https://dev59.com/zlkR5IYBdhLWcg3w7xdc),所以如果有人也对此有答案... - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接