gpt4 book ai didi

python - SciPy KDE 梯度

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:42 27 4
gpt4 key购买 nike

我正在使用内核密度估计 (KDE) ( http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html ) 的 SciPy 实现,目前运行良好。但是,我现在想获得 KDE 在特定点的梯度。

我查看了该库的 Python 源代码,但未能弄清楚如何轻松实现此功能。有人知道这样做的方法吗?

最佳答案

如果您查看引用的来源,您会发现密度估计是根据数据集中所有点的贡献构建的假设只有一个点 points[:,i] 你想要暂时评估(第 219-222 行):

diff = self.dataset - points[:, i, newaxis]
tdiff = dot(self.inv_cov, diff)
energy = sum(diff * tdiff, axis=0) / 2.0
result[i] = sum(exp(-energy), axis=0)

在矩阵表示法中(没有可用的 LaTeX?),这将被编写为来自数据集的单个点 D 和点 p 被评估为

d = D - p
t = Cov^-1 d
e = 1/2 d^T t
r = exp(-e)

你要找的梯度是grad(r) = (dr/dx, dr/dy):

dr/dx = d(exp(-e))/dx 
= -de/dx exp(-e)
= -d(1/2 d^T Cov^-1 d)/dx exp(-e)
= -(Cov^-1 d) exp(-e)

同样适用于 dr/dy。因此,您需要做的就是计算 Cov^-1 d 项并将其与您已经获得的结果相乘。

result = zeros((self.d,m), dtype=float)    
[...]
diff = self.dataset - points[:, i, newaxis]
tdiff = dot(self.inv_cov, diff)
energy = sum(diff * tdiff, axis=0) / 2.0
grad = dot(self.inv_cov, diff)
result[:,i] = sum(grad * exp(-energy), axis=1)

出于某种原因,我需要在计算 grad 时删除 -1 以获得与评估 p 处的密度估计一致的结果,并且p+delta 在所有四个方向上,这是我当然可能偏离这里的标志。

关于python - SciPy KDE 梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26336883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com