• 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?

  • 相关阅读:
    发布使用npm包过程
    python cookbook 第八章笔记
    2022-09-11 周工作记录
    《SpringBoot篇》16.SpringBoot整合Elasticsearch超详细教程
    统计学入门:时间序列分析基础知识详解
    fplan-布局
    Grafana 基于telegraf,influx监控vCenter
    Pritunl搭建OpenVPN服务器详细流程,快速实现公网远程连接!
    ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程
    贪吃蛇,摆烂
  • 原文地址:https://blog.csdn.net/u011698800/article/details/126292223