python中的KDE与不同的mu,sigma /将函数映射到数组

时间:2015-01-26 22:35:49

标签: python arrays kernel-density

我有一个二维数组值我想要执行一个高斯KDE,带有一个catch:假设这些点有不同的差异。为此,我有第二个二维数组(具有相同的形状),这是每个点使用的高斯的方差。在简单的例子中,

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. 一种将每个高斯分布的结果映射到三维数组的方法,每个高斯分布在一系列点上进行评估(例如,沿np.linspace(0,1,101)评估每个中心/σ对)。在这种情况下,我可以例如通过采用outarray [:,:,51]来获得x = 0.5的KDE值。

1 个答案:

答案 0 :(得分:1)

我发现处理此问题的最佳方法是通过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。