使用 dask.bag.from_sequence 计算内核密度估计

Using dask.bag.from_sequence to calculate kernel-density estimate

我正在尝试计算一个相当大的二维数据集的核密度估计 colour the points in a scatter plot。函数 scipy.stats.gaussian_kde 需要很长时间,所以我想我可以使用 dask (v0.15.2) 来更快地获得结果。但是,我不确定我的方法是否真的得到了任何加速。这是一个例子:

import numpy as np
from scipy.stats import gaussian_kde
import dask.bag as db

xy = np.random.rand(2, 1000000)
kde = gaussian_kde(xy)

chunker = (xy[:, i:i+10000] for i in range(100))

compute_job = db.from_sequence(chunker).map(kde)

results = compute_job.compute()
z = np.hstack(results)

这需要 60 多个小时才能在四核 Xeon E5-2609 @ 2.4Hz 上完成,数据集包含 2,677,920 个坐标对。我是否正确使用了 dask?

遗憾的是,Dask 并非在所有情况下都提供加速。事实上,如果您只使用一个输入块来执行 KDE,您会发现它已经在使用多个内核 - 因此 Dask 没有多余的容量可供选择。

使用大小为 2x1000000 的内核执行 KDE(如卷积)似乎是不明智的,花费很长时间我并不感到惊讶。您确定这是您要执行的操作吗?

此外,我可以借此机会让你考虑使用 datashader,它与 Dask 数组一起工作,并且包含很好的模糊管道元素。