从零开始实现核密度估计(kernel density estimation,KDE)-python实现

问题背景

核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,由Rosenblatt (1955)和Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。
具体原理推导可参考这篇博客
此篇博客侧重于根据理论公式,给出python实现。

python工具包推荐

seaborn,pandas,scikit-learn中均提供了kde计算及绘图函数,可直接查阅/调用。

理论基础

核密度估计的核心公式如下:
在这里插入图片描述
其中,h为带宽(band_width),K(.)为核函数,本文选取高斯核。
在这里插入图片描述
带宽h是一个超参数,h越小,邻域中参与拟合的点越少。h有多种选取方式,
本文参考网上资料采用如下公式:
在这里插入图片描述
其中c=1.05*数据序列标准差

python实现

根据以上背景,给出kde 计算函数如下:

def get_kde(x,data_array,bandwidth=0.1):
    def gauss(x):
        import math
        return (1/math.sqrt(2*math.pi))*math.exp(-0.5*(x**2))
    N=len(data_array)
    res=0
    if len(data_array)==0:
        return 0
    for i in range(len(data_array)):
        res += gauss((x-data_array[i])/bandwidth)
    res /= (N*bandwidth)
    return res

   
   

    其中x为待进行估计的数据点,data_array为给定的数据序列(list)。

    KDE计算及绘制demo

    测试环境

    python 3.7
    matplotlib 3.0.3
    numpy 1.16.2

    demo

    def get_kde(x,data_array,bandwidth=0.1):
        def gauss(x):
            import math
            return (1/math.sqrt(2*math.pi))*math.exp(-0.5*(x**2))
        N=len(data_array)
        res=0
        if len(data_array)==0:
            return 0
        for i in range(len(data_array)):
            res += gauss((x-data_array[i])/bandwidth)
        res /= (N*bandwidth)
        return res
    import numpy as np
    input_array=np.random.randn(20000).tolist()
    bandwidth=1.05*np.std(input_array)*(len(input_array)**(-1/5))
    x_array=np.linspace(min(input_array),max(input_array),50)
    y_array=[get_kde(x_array[i],input_array,bandwidth) for i in range(x_array.shape[0])]
    

    import matplotlib.pyplot as plt
    plt.figure(1)
    plt.hist(input_array,bins=40,density=True)
    plt.plot(x_array.tolist(),y_array,color=‘red’,linestyle=’-’)
    plt.show()

      运行结果

      在这里插入图片描述
      结果说明:
      图中横轴为数据分布取值,纵轴为概率密度,其中直方图的高度 h = 频数/(总数*每个bin的宽度) ,直方图总面积是1,KDE曲线下总面积也是1。

      参考资料

      1. 维基百科-Kernel density estimation
      2. 知乎相关回答
      3. 核密度估计-CSDN博客
      • 3
        点赞
      • 23
        收藏
        觉得还不错? 一键收藏
      • 0
        评论
      ### 回答1: KDEKernel Density Estimation)是一种非参数的概率密度估计方法,用于估计一个随机变量的概率分布函数。在Java中,可以使用各种库和算法来实现KDE。 首先,需要导入Java中用于科学计算和统计的库,例如Apache Commons Math或Weka。这些库提供了各种统计函数和数据结构,能够方便地进行核密度估计实现。 接下来,需要准备数据,这些数据是我们想要估计概率密度的样本数据。可以将这些数据存储在Java中的数组或其他适合的数据结构中。 然后,通过选择合适的核函数和带宽参数,进行核密度估计的计算。常用的核函数有高斯核函数和矩形核函数。高斯核函数的计算公式为: K(u) = (1 / sqrt(2 * pi)) * exp((-1 * u^2) / 2) 其中u是一个样本和待估计点之间的欧氏距离,exp表示自然指数函数。带宽参数的选择对估计结果很重要,通常可以尝试不同的带宽参数值,选择最佳的结果。 最后,将计算得到的核密度估计结果可视化出来,可以使用Java图形库,如JFreeChart,将估计结果绘制成直方图或曲线图。 总结起来,要实现KDE的Java实现,需要导入合适的库,准备数据,选择核函数和带宽参数,计算核密度估计结果,最后将结果可视化展示出来。这样就可以对一个随机变量的概率分布函数进行估计和分析。 ### 回答2: KDE核密度估计是一种非参数性质的概率密度函数估计方法,它可以通过将多个核函数在各个数据点附近进行加权求和来估计数据的概率密度函数。该方法在统计学和数据分析中广泛应用。 KDE核密度估计的Java实现可以通过以下步骤实现: 1. 导入所需的Java库和类。根据需要,可以使用数值计算库如Apache Commons Math库等。 2. 准备数据集。将待估计的数据存储在一个数组或集合中。 3. 根据数据集的特性选择合适的核函数。常用的核函数包括高斯核函数、矩形核函数和三角核函数等。对于Java实现,可以自定义核函数的计算方法或使用现有的库函数。 4. 选择合适的带宽参数。带宽参数决定了核函数的宽度,进而影响估计的平滑程度。通常可以使用Silverman's Rule of Thumb等方法来选择带宽参数。 5. 对于每个数据点,计算核函数在该点附近的值。根据选择的核函数和带宽参数,计算距离该点一定范围内的所有数据点与该点的核函数值。 6. 对所有的数据点的核函数值进行加权求和。权重可以是均匀的,也可以使用距离或其他相关度量来计算。 7. 对加权求和结果进行归一化处理,得到密度估计函数。 8. 可选地,绘制密度估计函数的图表或输出相关统计指标。 通过以上步骤,我们可以实现KDE核密度估计的Java程序。这个程序将会估计给定数据集的概率密度函数,帮助我们在数据分析和统计模型中更好地理解数据的分布特征和概率分布情况。 ### 回答3: KDEKernel Density Estimation)是一种用于估计概率密度函数的非参数方法,它可以通过一系列核函数在样本点周围产生一些连续的函数来估计未知分布的概率密度函数。而基于Java语言的KDE核密度估计实现可以通过以下步骤来完成: 1. 首先需要收集用于训练的数据集。这个数据集包含了从未知分布中抽取的样本点。 2. 将数据集存储在Java程序中。可以将数据集存储为一个数组或者使用Java集合类来存储。 3. 选择一个适当的核函数作为估计的基础。通常使用的核函数有高斯核函数和Epanechnikov核函数等。 4. 定义带宽参数。带宽参数决定了核函数的宽度,它直接影响了估计的精度。带宽可以通过交叉验证等方法来选择。 5. 实现核密度估计算法。可以使用循环遍历所有数据点,并针对每个数据点计算它周围的核函数值。然后将这些核函数值相加得到估计的概率密度函数。 6. 将估计的概率密度函数可视化。可以使用Java的图形库,如JavaFX或Swing来绘制估计的概率密度函数曲线。 7. 验证估计结果。可以通过与真实密度函数进行比较或者使用交叉验证等方法来验证估计结果的准确性和稳定性。 通过以上步骤,就可以使用Java实现KDE核密度估计。这个实现可以应用于各种领域,如金融、医学、社会科学等,用于对未知分布的概率密度函数进行估计,并进行相关的数据分析和预测。

      “相关推荐”对你有帮助么?

      • 非常没帮助
      • 没帮助
      • 一般
      • 有帮助
      • 非常有帮助
      提交
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值