从用户定义的分发中快速采样

时间:2016-03-01 01:57:30

标签: python numpy scipy probability random-sample

我正在运行的模拟需要我从概率分布中绘制值。我这样做如下:

import numpy as np
import scipy.special as sp
from scipy.stats import rv_continuous


class epsilon_pdf(rv_continuous):

    def _pdf(self, x, omega):

        return np.exp(omega ** -1 * np.cos(x)) / (2 * np.pi *
                                                  sp.iv(0, omega ** -1))


random_epsilon = epsilon_pdf(a=-np.pi, b=np.pi)
n_trials = 1  # 10 ** 6
goal_dict = {'omega': 2 ** -4, 'xi': 2 ** 0}
for trial_num in xrange(n_trials):
    # Choose m.
    m = np.random.poisson(goal_dict['xi'])
    # Draw m values for epsilon.
    epsilon_values = random_epsilon.rvs(omega=goal_dict['omega'], size=m)

(上面写的是最小的玩具示例。)

我遇到的一个主要问题是对random_epsilon.rvs的调用速度非常慢 - 当我将n_trials设置为所需的10 ** 6时,omega的某些值xi非常缓慢1}}和SuggestedSafariViewController会导致脚本花费377个小时才能完成。

有人能想到我的概率分布的Python代码的重新制定以及我的抽样会更快吗? (也许有一种方法可以使用更快的numpy来做到这一点?)

(我不确定我的发行版是否是一个已经命名的标准发行版。)

1 个答案:

答案 0 :(得分:1)

php artisan cache:clear
php artisan clear-compiled

sudo chmod -R 777 storage/ -R
composer dump-autoload