【问题标题】:KDE in python with different mu, sigma / mapping a function to an arraypython中的KDE具有不同的mu,sigma /将函数映射到数组
【发布时间】:2015-03-25 10:47:49
【问题描述】:

我有一个二维值数组,我想在其上执行高斯 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) 评估每个中心/σ 对)。在这种情况下,我可以例如通过 outarray[:,:,51] 获得 x=0.5 处的 KDE 值。

【问题讨论】:

  • 你不能逐行分割数组吗?例如。执行一维 KDE,例如data[i,:]' in a for` 在i in range(data.shape) 上循环?另外,你看过这个吗? docs.scipy.org/doc/scipy-0.14.0/reference/generated/…
  • 逐行行不通,因为每个单元格都有自己的差异。逐个单元格可以工作,我只是不知道实现它的好方法——我当前的实现时间太长了一个数量级。至于 scipy 包,我目前正在尝试重写它以满足我的需要。如果没有更好的答案出现,我可能最终会这样做。

标签: python arrays kernel-density


【解决方案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。

【讨论】:

  • 不应该将solve_gaussian() 中的sigma_array 通过 指数而不是 吗?即:return (1./sigma_array) * np.exp(- (val - data_array) *...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 2016-12-13
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多