【问题标题】:Gaussian kernel density estimation with fixed covariance (with python)具有固定协方差的高斯核密度估计(使用python)
【发布时间】:2013-09-14 16:56:14
【问题描述】:

我可以使用scipy 库执行高斯核密度估计,只需运行

from scipy import stats
kernel = stats.gaussian_kde(data)

但我想将协方差固定为某个预定义的值并使用它执行 KDE。有没有一种简单的方法可以在 python 的帮助下实现这一点,而无需明确编写优化过程(如果没有提供此类功能的现有库,我会这样做,但我希望避免它)。

【问题讨论】:

  • 您能否详细说明在这种情况下您所说的“协方差”是什么意思?通常,对于密度估计,所涉及的高斯函数用作“窗口”函数,并且该窗口的“协方差”(实际上是一维情况下的带宽参数)只是为了控制窗口的响应如何下降为被测点的距离函数。我不熟悉任何试图使用特定的多元协方差结构来实现窗口衰减效果的 KDE 程序。
  • 我还猜想,在实践中最复杂的这种“协方差”将是一个对角矩阵,您只需为数据的每个维度使用不同的带宽参数。 也许(这可能非常脆弱)您可以对数据的主要方向进行某种 PCA 分解并将不同的带宽放在那里,但我认为除非数据方向有很大不同的尺度,在这种情况下,你最好先对输入进行评分,然后再进行 KDE,并使用一个带宽。
  • @EMS,如果您要拟合多元高斯,则可以有协方差。我怀疑这就是 OP 所要求的。
  • 我不认为问题是关于拟合高斯,但我可能错了。

标签: machine-learning python kernel


【解决方案1】:

来自我的 cmets:

通常,对于密度估计,所涉及的高斯函数用作“窗口”函数,并且该窗口的“协方差”(实际上是一维情况下的带宽参数)仅用于控制窗口的响应如何下降off 作为被测点距离的函数。我不熟悉任何试图使用特定的多元协方差结构来实现这种窗口衰减效果的 KDE 程序。

我还猜测,在实践中最复杂的这种“协方差”是对角矩阵,您只需为数据的每个维度使用不同的带宽参数。也许(而且可能非常脆弱)您可以对数据的主要方向进行某种 PCA 分解并将不同的带宽放在那里,但我认为除非数据方向具有截然不同的规模,否则这不太可能得到回报,在在这种情况下,您最好先对输入进行评分,然后再进行 KDE,并使用一个带宽。

如果您阅读 scikits.learn 中的 KDE examples 以及他们的 KernelDensity class 的文档,似乎(如 SciPy)它们只是为您提供了带宽功能(单个浮点数)来总结方式内核的响应应该会下降。

对我来说,这表明对多变量带宽设置进行大量控制并没有太大的实际意义。最好的办法是执行一些评分或标准化以使输入变量具有相同的比例(因此在每个方向上以相同比例进行平滑是合适的),然后使用 KDE 预测或分类值转换后的空间,如果您想返回到原始缩放空间,则对每个坐标应用逆变换。

【讨论】:

  • 这个答案很好地说明了对对角方差的数据进行归一化,以及 KDE 中协变量没有使用的争议。对数据而不是内核函数进行操作的建议是正确的。我也在寻找一种提供自定义协方差的方法,虽然没有“接受”,但这个答案让我相信重整化更干净。我假设(可能 Q/A 也是如此?)我们正在谈论的是高斯核,或者其他可以通过均值和协方差矩阵来表征的核
猜你喜欢
  • 2015-02-21
  • 2018-07-08
  • 2021-01-21
  • 2021-11-13
  • 2012-04-06
  • 1970-01-01
  • 2015-10-01
  • 2015-08-29
相关资源
最近更新 更多