• KDE相关记录


    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    从代码中可以看到,直接使用网格搜索的话,整体逻辑还是比较简单的。不过这里,不论是论文里,还是一些博客里,都说是最大似然估计的方式来进行,不过跟平时的时候,使用的那种利用(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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    参考

    [1]Scipy: parallel computing in ipython notebook?

  • 相关阅读:
    adb删除offline离线设备
    WMS手动配货和自动配货的区别
    《优雅升级HBase》中不太“优雅”的情况
    【python版CV】图像轮廓&模板匹配
    Linux tc 使用
    手把手教你在Ubuntu22.04 上安装 Vivado、HLS、Vitis 2022.2版本
    【单片机毕业设计】【mcuclub-jj-050】基于单片机的门禁的设计
    Tomcat以及UDP
    【JVM笔记】热点代码及探测方式
    SystemVerilog——面向对象编程
  • 原文地址:https://blog.csdn.net/u011698800/article/details/126292223