2016-12-23 2 views
0

Я пытаюсь использовать numpy и scipy для оценки плотности ядра 2D-модели гауссовой смеси и оценки градиентов KDE по отношению к координатам. Мой вопрос заключается в том, как оценить градиенты log KDE? Кажется, что возврат st.gaussian_kde() не может использоваться для вычисления градиента? Любая помощь будет оценена по достоинству. Blew см. Код.Как оценить оценку плотности ядра 2D GMM и его градиентов?

import numpy as np 
import matplotlib.pyplot as pl 
import scipy.stats as st 

data = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) 
x = data[:, 0] 
y = data[:, 1] 
xmin, xmax = -3, 3 
ymin, ymax = -3, 3 
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] 
positions = np.vstack([xx.ravel(), yy.ravel()]) 
values = np.vstack([x, y]) 
kernel = st.gaussian_kde(values) 
f = np.reshape(kernel(positions).T, xx.shape) 

ответ

0

gaussian_kde.logpdf оценивает logpdf на условии набора данных, в вашем случае я думаю, что это positions. Градиент может быть получен с помощью numpy.gradient:

logpdf = np.reshape(kernel.logpdf(positions),xx.shape) 
gradient = np.gradient(logpdf) 

Обратите внимание, что gradient не будет многомерный массив, но список из двух массивов.

+0

Если я правильно понимаю [нумерованную документацию для градиента] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html), она принимает соседние значения в numpy массив и вычисляет градиент оттуда. Если OP нуждается в аналитическом градиенте, оцененном в произвольной точке, см. Мой ответ. – Raketenolli

0

scipy.stats.gaussian_kde, кажется, не обеспечивает эту функциональность изначально. В my answer - SciPy KDE gradient Описываю, как вы можете добавить свой собственный метод gradient на основе обычной функции evaluate. Подход к logpdf - gradient должен быть аналогичным.

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