Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加速Poisson-pmf函数?_Python_Scipy_Distribution - Fatal编程技术网

Python 如何加速Poisson-pmf函数?

Python 如何加速Poisson-pmf函数?,python,scipy,distribution,Python,Scipy,Distribution,我的用例是在小于10的所有点上计算泊松pmf,我会多次调用这种函数,并使用差分lambdas。lambda在时间上是未知的,所以我不能矢量化lambda 我从某处听说了一个秘密窍门,那就是使用\u pmf。这样做的缺点是什么?但是,它仍然有点慢,有没有办法在不从头重写C中的pmf的情况下对其进行改进 %timeit scipy.stats.poisson.pmf(np.arange(0,10),3.3) %timeit scipy.stats.poisson._pmf(np.arange(0,1

我的用例是在小于10的所有点上计算泊松pmf,我会多次调用这种函数,并使用差分lambdas。lambda在时间上是未知的,所以我不能矢量化lambda

我从某处听说了一个秘密窍门,那就是使用
\u pmf
。这样做的缺点是什么?但是,它仍然有点慢,有没有办法在不从头重写C中的pmf的情况下对其进行改进

%timeit scipy.stats.poisson.pmf(np.arange(0,10),3.3)
%timeit scipy.stats.poisson._pmf(np.arange(0,10),3.3)
a = np.arange(0,10)
%timeit scipy.stats.poisson._pmf(a,3.3)

10000 loops, best of 3: 94.5 µs per loop
100000 loops, best of 3: 15.2 µs per loop
100000 loops, best of 3: 13.7 µs per loop
更新 好吧,我只是太懒了,没法用cython写东西。我原以为所有离散分布都有一个更快的解决方案,可以对连续的
x
进行顺序(迭代)计算。例如,
P(X=3)=P(X=2)*lambda/3如果X~Pois(lambda)

相关的:

我现在对Scipy和Python不太信任了。库函数没有我预期的那么高级

  • 尝试在cython中实现pmf。如果你的scipy是像Anaconda或Enthough这样的软件包的一部分,你可能已经安装了cython

  • 试着用pypy运行它

  • 租用大型AWS服务器(或类似服务器)的时间


  • 大多数
    scipy.stats
    发行版都支持矢量化评估:

    >>> poisson.pmf(1, [5, 6, 7, 8])
    array([ 0.03368973,  0.01487251,  0.00638317,  0.0026837 ])
    
    这可能不够快,也可能不够快,但您可以尝试将
    pmf
    调用从循环中取出

    关于
    pmf
    \u-pmf
    之间的区别:真正的工作是在带下划线的函数(
    \u-pmf
    \u-cdf
    等)中完成的,而公共函数(
    pmf
    cdf
    )则确保只有有效的参数指向
    \u-pmf
    (如果参数无效,
    \u pmf
    的输出不能保证有意义,因此使用时请自行承担风险)


    进一步的细节:

    我发现与一个简单的python实现相比,
    scipy.stats.poisson
    类的速度非常慢

    没有cython或vectors之类的东西

    导入数学
    def poisson_pmf(x,mu):
    返回mu**x/math.factorial(x)*math.exp(-mu)
    def泊松分布函数(k,μ):
    p_总计=0.0
    对于范围(k+1)内的x:
    p_总+=泊松pmf(x,μ)
    返回p_总计
    
    如果您检查了
    scipy.stats.poisson
    (甚至是带下划线前缀的版本)的属性,那么很清楚为什么

    上面的实现现在只比C语言(用
    gcc-O3
    v9.3编译)慢了10倍。scipy版本至少比C语言慢了10倍

    #包括
    无符号长阶乘(无符号n){
    无符号长事实=1;
    for(无符号k=2;k
    
    >>> poisson.pmf(1, -1)
    nan
    >>> poisson._pmf(1, -1)
    /home/br/virtualenvs/scipy-dev/local/lib/python2.7/site-packages/scipy/stats/_discrete_distns.py:432: RuntimeWarning: invalid value encountered in log
      Pk = k*log(mu)-gamln(k+1) - mu
    nan