我有一个二维值数组,我想对其执行高斯 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
我正在寻找两件事之一:
- 高斯 KDE 求解器允许每个点的带宽发生变化
or
- 一种将每个高斯结果映射到 3 维数组的方法,每个高斯在一系列点上进行评估(例如,沿着 np.linspace(0,1,101) 评估每个中心/σ 对)。在这种情况下,我可以例如通过取出 array[:,:,51] 得到 x=0.5 处的 KDE 值。
我发现处理此问题的最佳方法是通过 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)