【发布时间】:2015-05-08 04:50:35
【问题描述】:
假设需要计算一般数量的离散概率密度函数的卷积。对于下面的示例,有四种分布采用指定概率的值 0、1、2:
import numpy as np
pdfs = np.array([[0.6,0.3,0.1],[0.5,0.4,0.1],[0.3,0.7,0.0],[1.0,0.0,0.0]])
卷积可以这样找到:
pdf = pdfs[0]
for i in range(1,pdfs.shape[0]):
pdf = np.convolve(pdfs[i], pdf)
看到 0,1,...,8 的概率由下式给出
array([ 0.09 , 0.327, 0.342, 0.182, 0.052, 0.007, 0. , 0. , 0. ])
这部分是我代码中的瓶颈,似乎必须有一些可用的东西来向量化这个操作。有没有人建议让它更快?
或者,您可以使用的解决方案
pdf1 = np.array([[0.6,0.3,0.1],[0.5,0.4,0.1]])
pdf2 = np.array([[0.3,0.7,0.0],[1.0,0.0,0.0]])
convolve(pd1,pd2)
得到成对卷积
array([[ 0.18, 0.51, 0.24, 0.07, 0. ],
[ 0.5, 0.4, 0.1, 0. , 0. ]])
也会有很大帮助。
【问题讨论】:
-
根据 numpy 文档,
np.convolve的参数只能是一维的。所以我想,这里没有太多要矢量化的东西。但也许它值得使用不同的卷积,比如 scipy 的基于 fft 的卷积? docs.scipy.org/doc/scipy/reference/generated/… -
@SmCaterpillar 我玩了一下,但我对卷积的了解太有限,无法理解那里发生了什么。我理解这里的版本,但我不知道如何为 fft 版本指定权重。
-
你说的重量是什么意思?我尝试了两种方法,两种卷积都为您的问题提供了相同的结果。但是,fft 的速度要慢得多(由于开销,您的玩具问题太小了,也许当 pdf 本身包含更多值时,您实际上会提高速度)。
-
@SmCaterpillar 我想您再次将 for 循环用于 scipy 版本并一一进行卷积。我想避免 for 循环并立即将操作应用于所有 pdf 行。
-
我正在查看这个版本的 convolve 记录docs.scipy.org/doc/scipy/reference/generated/…
标签: python numpy vectorization convolution probability-density