Załóżmy, że splot ogólnej liczby dyskretnych funkcji gęstości prawdopodobieństwa musi zostać obliczony. Dla przykładu poniżej istnieją cztery dystrybucje, które odbywają się na wartościach 0,1,2 z określonymi prawdopodobieństwami:Szybsze przekształcanie funkcji gęstości prawdopodobieństwa w Pythonie
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]])
splotu można znaleźć tak:
pdf = pdfs[0]
for i in range(1,pdfs.shape[0]):
pdf = np.convolve(pdfs[i], pdf)
Prawdopodobieństwa widząc 0, 1, ..., 8 są następnie przez
array([ 0.09 , 0.327, 0.342, 0.182, 0.052, 0.007, 0. , 0. , 0. ])
Ta część jest wąskim gardłem w moim kodu i wydaje się, że coś musi być dostępny do wektoryzacji tę operację. Czy ktoś ma sugestię, aby przyspieszyć działanie?
Alternatywnie, roztwór, gdzie można użyć
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)
i uzyskać parami zwoje
array([[ 0.18, 0.51, 0.24, 0.07, 0. ],
[ 0.5, 0.4, 0.1, 0. , 0. ]])
pomogłoby także ogromnie.
Według numpy docs, argumenty do 'np.convolve' mogą być tylko jednowymiarowe. Sądzę więc, że nie ma tu zbyt wiele do wektoryzacji. Ale może warto użyć innej splotu, na przykład opartej na scipy? http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolve.html – SmCaterpillar
@SmCaterpillar Grałem z tym trochę, ale moja wiedza na temat nawinięć jest zbyt ograniczona, aby zrozumieć, co się tam dzieje. Wersja tutaj rozumiem, ale nie mam pojęcia, jak określić wagi dla wersji fft. – Forzaa
Co masz na myśli pod pojęciem masy? Próbowałem obu, a oba zwoje dają taki sam wynik dla twojego pytania. Jednak fft był znacznie wolniejszy (z powodu napowietrznych problemów z zabawkami jest zbyt mały, może gdy same pliki PDF zawierają więcej wartości, faktycznie zwiększa się prędkość). – SmCaterpillar