内核估计每点使用一个带宽值

我熟悉通常的内核密度估计(KDE),其中单个带宽值用于为每个采样点生成多元(通常是高斯)函数.然后,通过对所有采样点的高斯函数求和来获得最终的KDE.

假设我有N个样本点(假设为1维),每个样本点都有一个误差估计,例如:

sample_points = [0.5, 0.7, 0.3, 1.2, 0.01, 3.6, 0.4]
errors = [0.02, 0.03, 0.05, 0.01, 0.03, 0.01, 0.07]

我要做的是一种使用与每个点相关的误差作为其功能的带宽来获取此样本的KDE的方法.

最终,我可以通过分别为每个点手动获取高斯内核,然后组合所有功能来完成此任务(绝非易事).

是否已经执行了此功能?我环顾四周,但发现的内核密度估计器函数(scipy.stats.gaussian_kde,sklearn.neighbors.KernelDensity)对所有点都使用固定的带宽值.

解决方法:

我最近问了一个similar question.(到目前为止,我还没有发现)没有任何实现.这是我使用的(可满足我的需求):

import numpy as np

def solve_gaussian(val,data_array,sigma_array):
    return (1. / sigma_array) * np.exp(- (val - data_array) * (val - data_array) / (2 * sigma_array * sigma_array))

def solve_kde(xlist,data_array,sigma_array):
    kde_array = np.array([])
    for xx in xlist:
        single_kde = solve_gaussian(xx,data_array,sigma_array)
        if np.ndim(kde_array) == 3:
            kde_array = np.concatenate((kde_array,single_kde[np.newaxis,:,:]),axis=0)
        else:
            kde_array = np.dstack(single_kde)
    return kde_array

xlist = np.linspace(0,1,101) #Adjust as needed
kde_array = solve_kde(xlist,data_array,sigma_array)
kde_vector = np.sum(np.sum(kde_array,axis=2),axis=1)
mode_guess = xlist[np.argmax(kde_vector)]

这是scipy高斯kde的重新实现.

上一篇:深度库的安装


下一篇:如何重新采样/下采样不规则的时间戳列表?