我熟悉通常的核密度估计(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)对所有点使用固定带宽值。
答案 0 :(得分:3)
我最近问过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 gaussian kde的重新实现。