Scipy:如何加速核密度估计的score_sample方法?

6

我正在尝试使用核密度估计方法获取观察到的概率密度。这是我使用kde的方式:

from sklearn.neighbors import KernelDensity
kde = KernelDensity().fit(sample)

问题在于,当我尝试获取每个点的概率密度时。
kde_result = kde.score_samples(sample)

速度非常慢,如何提高速度?

样本由300,000(x,y)个点组成。


你为什么想要在每个点获取密度? - cel
2
您可以尝试使用非默认值的atol和/或rtol来初始化KernelDensity() - Chris
@cel,我正在使用一种方法创建一个“预测模型”,它需要计算“概率密度函数”的“均方误差”。因此,我使用“kde”来估计“观察到的pdf”,然后执行“(predict - observed)**2”。 - ZK Zhao
1
@Chris,init(创建kde)的速度还可以。令人困扰的是在查询大型数据集时的score_sample方法。 - ZK Zhao
那么你的预测模型也输出PDF文件吗?我不太理解“计算概率密度函数的均方误差”这个数学上听起来有些奇怪的问题。 - cel
@cel,是的,预测模型也会输出PDF文件。我认为这也是错误的,但我需要先尝试一下。其本质是你需要创建一个预测PDF,怎么做呢?通过最小化预测和观察到的PDF之间的均方误差来实现,即(预测-观察)**2。这就是为什么我需要观察到的PDF,即kde - ZK Zhao
1个回答

3

如果有人在寻找这个问题的答案,可以在这里找到解决方案。在那里,他们介绍了您可以使用multiprocessing轻松并行计算来加速执行。

这段代码可以完成任务(也来自相同的答案):

import numpy as np
import multiprocessing
from sklearn.neighbors import KernelDensity

def parrallel_score_samples(kde, samples, thread_count=int(0.875 * multiprocessing.cpu_count())):
    with multiprocessing.Pool(thread_count) as p:
        return np.concatenate(p.map(kde.score_samples, np.array_split(samples, thread_count)))

kde = KernelDensity(bandwidth=2.0,atol=0.0005,rtol=0.01).fit(sample) 
kde_result = parrallel_score_samples(kde, sample)

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Flair
我刚刚编辑了答案。 - Raphael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接