我如何一次计算所有numpy值的概率?

2024-10-01 19:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个计算概率的函数,如下所示:

def multinormpdf(x, mu, var): # calculate probability of multi Gaussian distribution
    k = len(x)
    det = np.linalg.det(var)
    inv = np.linalg.inv(var)
    denominator = math.sqrt(((2*math.pi)**k)*det)
    numerator = np.dot((x - mean).transpose(), inv)
    numerator = np.dot(numerator, (x - mean))
    numerator = math.exp(-0.5 * numerator)
    return numerator/denominator

我有均值向量,协方差矩阵和2D numpy数组来测试

^{pr2}$

我要计算每个值的概率,所以我使用了这个代码

for i in arr:
    print(multinormpdf(i, mu, var)) # I already know mean_vector and variance_matrix

但是太慢了。。。在

有没有更快的方法来计算概率? 或者,有没有什么方法可以像“批处理”一样,一次计算测试arr的概率?在


Tags: 方法varnpmathmean概率dotdet
2条回答

您可以轻松地将函数矢量化:

import numpy as np

def fast_multinormpdf(x, mu, var):
    mu = np.asarray(mu)
    var = np.asarray(var)
    k = x.shape[-1]
    det = np.linalg.det(var)
    inv = np.linalg.inv(var)
    denominator = np.sqrt(((2*np.pi)**k)*det)
    numerator = np.dot((x - mu), inv)
    numerator = np.sum((x - mu) * numerator, axis=-1)
    numerator = np.exp(-0.5 * numerator)
    return numerator/denominator


arr = np.array([[42, 234, 124],
                [123, 222, 112],
                [42, 213, 11],
                [42, 213, 11]])

mu = [0, 0, 1]
var = [[1, 100, 100],
       [100, 1, 100],
       [100, 100, 1]]

slow_out = np.array([multinormpdf(i, mu, var) for i in arr])
fast_out = fast_multinormpdf(arr, mu, var)

np.allclose(slow_out, fast_out) # True

由于fast_multinormpdf比未定位的函数快1000倍:

^{pr2}$

你可以试试麻木。只需用@numba.vectorize装饰函数。在

@numba.vectorize
def multinormpdf(x, mu, var):
    # ...
    return caculated_probability

new_arr = multinormpdf(arr)

如果您的multinormpdf不包含任何不受支持的函数,则可以加速它。请看这里:https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html

此外,您可以像这样使用实验特性target='parallel'。在

^{pr2}$

相关问题 更多 >

    热门问题