2015-01-26 3 views
2

У меня есть 2-мерный массив значений, который я хотел бы выполнить с помощью Gaussian KDE, с уловкой: предполагается, что точки имеют разные отклонения , Для этого у меня есть второй двумерный массив (с той же формой), который является дисперсией гауссова, который будет использоваться для каждой точки. В простом примере,KDE в python с разными mu, sigma/отображение функции в массив

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

было бы четыре гауссианы, первый из которых центрирована в точке х = 0,4 с σ = 0,05. Примечание: Фактические данных намного больше, чем 2х2

Ищу одну из двух вещей:

  1. Гауссов KDE решатель, который позволит пропускной способности изменять для каждой точки

или

  1. Способ отображения результатов каждого гауссова в трехмерный массив, каждый из которых оценивается по гауссовым точкам (например, e оценивать каждый центр/σ пара вдоль np.linspace (0,1,101)). В этом случае я мог бы, например, имеют значение KDE при x = 0,5, беря outarray [:,:, 51].
+0

Разве вы не можете нарезать массив рядом? Например. выполняют 1-мерный KDE, например. 'data [i ,:] 'в цикле' for' на 'i в диапазоне (data.shape)'? Кроме того, вы посмотрели на это? http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.gaussian_kde.html –

+0

Строка-строка не будет работать, поскольку каждая ячейка имеет свою собственную дисперсию. Cell-by-cell может работать, я просто не знаю, как это реализовать - моя текущая реализация берет порядок слишком долго. Что касается scipy пакета, я в настоящее время пытаюсь переписать его в соответствии с моими потребностями. Если не появятся лучшие ответы, я, вероятно, в конечном итоге это сделаю. – Tom

ответ

1

Лучший способ, с которым я столкнулся, это умножение массива на сигма-массив и массив данных. Затем я складываю массивы для каждого значения, которое я хочу решить для 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)] 

Caveat, для тех, кто пытается использовать этот код: значение гауссовой вдоль оси 0, а не ось 2, как указано в первоначальном вопросе.

+1

Не следует ли 'sigma_array' в' solve_gaussian() 'путем * деления * экспоненциального, а не * умножающего * его? I.e .: 'return (1./sigma_array) * np.exp (- (val - data_array) * ...' – Gabriel

+0

Да, это должно быть. – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^