【发布时间】:2016-04-29 02:30:56
【问题描述】:
是否可以使用 Fisher 精确检验的矢量化优化此计算,如果可以,如何优化?当num_cases > ~1000000 时,运行时间很麻烦。
import numpy as np
from scipy.stats import fisher_exact
num_cases = 100
randCounts = np.random.random_integers(100,size=(num_cases,4))
def testFisher(randCounts):
return [fisher_exact([[r[0],r[1]],[r[2], r[3]]])[0] for r in randCounts]
In [6]: %timeit testFisher(randCounts)
1 loops, best of 3: 524 ms per loop
【问题讨论】:
-
谢谢,这正是我想问的。是否有必要对
fisher_exact进行矢量化?我也想将这个概念应用到其他统计方法中。 -
是的,有必要对fisher_exact进行矢量化(这意味着首先对阶乘进行矢量化)。目前,您的计算时间在 num_cases 中只是线性的。矢量化是一种改进的方法。可能 cython 或 numba 会有所帮助,但前提是 Fisher_exact 的 scipy 版本尚未被 cythonized(我认为是,但不知道事实)。
-
所以我推测了一下,但确切的费舍尔取决于阶乘,看起来问题可能是大阶乘可能超过 numpy 整数的范围,这使得它很难拥有一个快速的实现(所以这就是它在纯 python 中的原因?)——因为大整数将成为对象。我怀疑对于速度很重要的情况,人们将使用一些近似的测试(并且基于浮点数而不是整数)而不是精确的。不过不知道,这超出了我的知识范围,并且也开始成为统计问题,而不是编程问题。
-
我希望这不会变成统计问题。只是在寻找加快速度的想法/资源。
标签: python numpy scipy vectorization