【问题标题】:how to estimate kernel density estimation of a 2D GMM and its gradients?如何估计 2D GMM 及其梯度的核密度估计?
【发布时间】:2017-05-09 02:52:25
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: python numpy scipy kernel


    【解决方案1】:

    gaussian_kde.logpdf 估计提供的一组数据的 logpdf,在你的情况下,我认为它是 positions。然后可以使用numpy.gradient获得梯度:

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

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

    【讨论】:

    • 如果我正确理解了 [numpy 文档gradient] (docs.scipy.org/doc/numpy/reference/generated/…),它将获取 numpy 数组中的相邻值并从那里计算梯度。如果 OP 需要在任意点评估“分析”梯度,请参阅我的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-06
      • 2020-04-23
      • 2021-11-13
      • 1970-01-01
      • 2020-04-18
      • 2013-04-21
      • 2012-01-06
      • 2011-08-07
      相关资源
      最近更新 更多