【问题标题】:multiprocessing spatial Kernel Dencity Estimate in pythonpython中的多处理空间内核密度估计
【发布时间】:2016-06-05 17:35:42
【问题描述】:

我正在使用 scipy.stats.kde.gaussian kde 计算空间 KDE。然而,它的评估需要相当多的时间——我脚本时间的 70%,即 10000 行需要 26 秒。我想让它更快。这是我的原始代码:

from scipy.stats import kde
kernel = kd.gausian_kde(values, bw_method=.05)
result = kernel(positions)

基于Speed up sampling of kernel estimate,我实现了多处理:

SKERNEL = None

# sets global kernel function 
# - multiprocessing requires my function to be top-level module function
setKernel()

def calc_kernel(sample):
    return SKERNEL(sample)

def genKernel(elements):

    cores = mp.cp_count()
    torun = np.array_split(elements, cores, axis=1)

    pool = mp.Pool(processes = cores)
    r = pool.map(calc_kernel, torun)
    return np.concatenate(r)

但是,在同一数据集上,此实现需要 36 秒才能运行。 使用 cProfiler,我可以看到大部分时间都需要“等待”过程。我做错了什么以及如何修改它以更快地工作?

【问题讨论】:

    标签: python scipy python-multiprocessing


    【解决方案1】:

    在每个位置评估内核的成本取决于该位置附近的值数组的密度。也就是说,将要划分的点拆分为大小相等的数组不会导致这些子问题的评估时间相等;对于我曾经处理过的每一个 KDE 类型的问题,这都是非常正确的。

    【讨论】:

    • 谢谢。我也是这么想的:那么,我想,我需要生产更多和块,这样工作的分配会更加平衡
    • 这可能会有所帮助,但如果您的分发模式是一个相当小的集群,您可能仍然不走运;计算要求在点密度上呈二次方。或许随机化你的分割也会有所帮助,这样模式就不会通过构造而成为一个单独的块
    • 不幸的是,它仍然让一切变得更慢,而不是更快 - 不知道为什么会这样
    • 我猜我的糟糕结果是由于函数的开销相对较大:在大数据上,代码现在的运行速度提高了约 10 倍
    猜你喜欢
    • 2012-11-23
    • 2014-03-22
    • 2017-09-05
    • 2014-03-15
    • 2017-02-06
    • 2019-02-14
    • 1970-01-01
    • 2017-12-07
    • 2015-01-06
    相关资源
    最近更新 更多