加速Python 3中给定两个值的概率密度赋值



对于我的一些研究,我需要在给定值、平均值和标准差的情况下分配概率密度,但我需要这样做大约4000万次,因此加速此代码对于以高效的方式工作变得至关重要。

我只有10个值要测试(值=10x1矩阵(,但我想为每个值分配一个概率,给定每个值总共有400万个截断正态分布,每个值都有不同的均值(all_means=400万x 10矩阵(和相同的标准差(误差=1值(。到目前为止,我一直在使用的代码如下:

import scipy.stats as ss
all_probabilities =[]
for row in all_means:
temp_row = []
for i in range(len(row)):
# Isolate key values
mean = row[i]
error = 0.05
value = values[i]
# Create truncated normal distribution and calculate PMF
a, b = 0, np.inf
mu, sigma = float(mean), float(error)
alpha, beta = ((a-mu)/sigma), ((b-mu)/sigma)
prob = ss.truncnorm.pdf(float(value), alpha, beta, loc=mu, scale=sigma)
temp_row.extend([prob])
all_probabilities.extend([temp_row])

一个循环平均需要5毫秒,但要完成400万次,意味着这段代码大约需要5个小时才能完成。我认为限制因素是调用ss.truncnorm.pdf和使用extend。后者我可以通过预先分配概率矩阵来解决,但前者我看不到解决办法。

对于更多的上下文,这段代码是算法的一部分,该算法平均使用这段代码5次(尽管要测试的分布数量迅速减少(,因此任何加快这段代码的提示都将是一个巨大的帮助。

很抱歉,如果这是微不足道的,我对优化代码还比较陌生,找不到任何关于这类问题的具体信息。

您可以避免内部循环,因为scipy.stats.truncnorm可以定义为随机变量的向量,即

import numpy as np
from scipy.stats import truncnorm
all_probabilities = []
a, b = 0, np.inf
error = 0.05
for row in all_means:
alpha, beta = ((a-row )/error), ((b-row )/error)
# vectorized truncnorm
rv_tn = truncnorm(alpha, beta, loc=row, scale=error)
# predict vector
prob = rv_tn.pdf(values)
all_probabilities.extend(prob)

最新更新