使用 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 数组一起工作,并且包含很好的模糊管道元素。
我正在尝试计算一个相当大的二维数据集的核密度估计 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 数组一起工作,并且包含很好的模糊管道元素。