Предположим, что необходимо вычислить свертку общего числа функций плотности дискретной вероятности. Для примера ниже есть четыре распределения, которые принимают значения 0,1,2 с заданными вероятностями:Более быстрая свертка функций плотности вероятности в Python
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? http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolve.html – SmCaterpillar
@SmCaterpillar Я немного поиграл с этим, но мои знания о свертках слишком ограничены, чтобы понять, что там происходит. Версия здесь я понимаю, но я не знаю, как указать весы для версии fft. – Forzaa
Что вы имеете в виду по весу? Я попробовал оба, и обе свертки дают тот же результат для вашего вопроса. Однако, fft один был намного медленнее (из-за накладных расходов, ваша проблема с игрушкой слишком мала, может быть, когда сами pdf-файлы содержат больше значений, вы фактически получаете увеличение скорости). – SmCaterpillar