20220809 -
在使用KDE的过程中,涉及到一些参数选择,或者运行速度的问题。
目前经过调试之后,对各个部分的内容都进行了涉及,这里记录一下。
首先,KDE(kernel density estimate),是一种无参数的概率密度估计方法?(这里没说错吧,感觉好久没看,都忘了)
那么对于这个方法来说,比较重要的参数就是bandwidth,选择这个参数,有很多方法,如果从机器学习的角度来说,那么直接使用交叉验证的方法即可,他验证的方式是比较最大似然估计的数值,具体代码如下。
params = {'bandwidth':
np.logspace(0.5, 5, num=10, base=2)}
hyper_kde = GridSearchCV(
KernelDensity(kernel=self.kernel),
params, n_jobs=-1, cv=5, verbose=0)
hyper_kde.fit(X_train)
从代码中可以看到,直接使用网格搜索的话,整体逻辑还是比较简单的。不过这里,不论是论文里,还是一些博客里,都说是最大似然估计的方式来进行,不过跟平时的时候,使用的那种利用(X,y)进行交叉验证的话,采用准确率等指标来进行评估不太一样,所以这里并不是非常理解。
然后对于运行速度来说,KDE的话,在训练的过程中,他并不存在n_jobs这种参数,经过查看官方文档内容后发现,可以通过leaf_size这个参数指定底层的bd树这种数据结构的内容来提升查询速度?!这里我不是非常确定。不过,将这个数据调大之后,的确速度有所提升,不管是训练还是测试。
但对于对于测试阶段来说,这里主要使用的函数是score_samples,这个函数就可以利用多CPU并行计算的优势来进行了。问答[1]提供了代码如下,
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)