如何估算2D GMM的核密度估计及其梯度?

时间:2016-12-23 11:37:44

标签: python numpy scipy kernel

我正在尝试使用numpy和scipy来估计2D高斯混合模型的核密度估计,并估计相对于坐标的log KDE的梯度。 我的问题是如何估计log KDE的梯度?似乎st.gaussian_kde()的返回不能用于计算梯度?任何帮助,将不胜感激。请看看代码。

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)

2 个答案:

答案 0 :(得分:0)

gaussian_kde.logpdf估算一组提供的数据的logpdf,在您看来我认为是positions。然后可以使用numpy.gradient

获得渐变
logpdf = np.reshape(kernel.logpdf(positions),xx.shape)
gradient = np.gradient(logpdf)

请注意,gradient不是多维数组,而是两个数组的列表。

答案 1 :(得分:0)

scipy.stats.gaussian_kde似乎本身不提供此功能。在my answerSciPy KDE gradient中,我介绍了如何根据常规gradient函数添加自己的evaluate方法。 logpdf - gradient的方法应该类似。