python - 具有不同 mu、sigma/将函数映射到数组的 python 中的 KDE

标签 python arrays kernel-density

我有一个二维值数组,我想对其执行高斯 KDE,但有一个问题:假定这些点具有不同的方差。为此,我有第二个二维数组(具有相同的形状),它是用于每个点的高斯方差。在这个简单的例子中,

import numpy as np
data = np.array([[0.4,0.2],[0.1,0.5]])
sigma = np.array([[0.05,0.1],[0.02,0.3]])

将有四个高斯分布,第一个以 x=0.4 为中心,σ=0.05。 注意:实际数据远大于2x2

我正在寻找以下两件事之一:

  1. 一个高斯 KDE 求解器,允许每个点的带宽发生变化

  1. 一种将每个高斯分布的结果映射到 3 维数组的方法,每个高斯分布在一系列点上进行评估(例如,沿 np.linspace(0,1,101) 评估每个中心/σ 对)。在这种情况下,我可以例如通过取出数组 [:,:,51],使 KDE 值在 x=0.5。

最佳答案

我发现处理此问题的最佳方法是对 sigma 数组和数据数组进行数组乘法。然后,我为要解决 KDE 问题的每个值堆叠数组。

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)]

请注意,对于任何试图使用此代码的人:高斯值沿轴 0,而不是原始问题中指定的轴 2。

关于python - 具有不同 mu、sigma/将函数映射到数组的 python 中的 KDE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28160012/

相关文章:

c++ - C++ 中的二维数组

python-3.x - 如何不在 seaborn 的联合图上显示 PIL 逊系数?

python - Git word-diff 到 html

python - 在 Django 中创建自定义用户模型时,从 models.Model 和 AuthUser 继承有什么区别?

python - 如何获取2个连续记录之间的 "time difference"?

python - n 维数据的估计经验分布的累积概率

c++ - 如何从核密度估计中获取函数?

python - 如何将 matplotlib 3d 图更改为侧 View ?

javascript - 在 es6 中使用 map 映射嵌套数组

arrays - 根据日期条件切片数组