高斯滤波和高斯核密度估计中sigma和带宽之间的关系

6

使用scipy.ndimage.filters.gaussian_filterscipy.stats.gaussian_kde函数对给定的数据集进行处理,如果分别适当选择这两个函数中的sigmabw_method参数,则可以得到非常相似的结果。

例如,对于随机的二维点分布,通过在gaussian_filter中设置sigma=2.(左图)和在gaussian_kde中设置bw_method=sigma/30.(右图),可以得到以下图形:

enter image description here

显然这些参数之间存在关系,因为一个应用了高斯滤波器,另一个则是基于高斯核密度估计对数据进行处理。

各个参数的定义如下:

sigma : scalar or sequence of scalars Gaussian核的标准差。对于每个轴,高斯滤波器的标准差都以序列或单个数值的形式给出,如果是单个数值,则所有轴的标准差相等。

根据高斯算子的定义,我可以理解这一点:

enter image description here

bw_method : str, scalar or callable, optional 用于计算估计带宽的方法。可选择‘scott’、‘silverman’、标量常数或可调用函数。如果是标量,则直接使用kde.factor。如果是可调用函数,则仅应该将一个gaussian_kde实例作为参数,并返回标量值。如果未指定(默认值),则使用‘scott’。有关更多详细信息,请参阅说明。

在这种情况下,我们假设bw_method的输入是一个标量(浮点数),以便与sigma进行比较。我在这里迷失了,因为我找不到有关此kde.factor参数的任何信息。
我想知道的是,如果可能的话,连接这两个参数(即使用浮点数时的sigmabw_method)的精确数学方程式。
MWE:
import numpy as np
from scipy.stats import gaussian_kde
from scipy.ndimage.filters import gaussian_filter
import matplotlib.pyplot as plt

def rand_data():
    return np.random.uniform(low=1., high=200., size=(1000,))

# Generate 2D data.
x_data, y_data = rand_data(), rand_data()
xmin, xmax = min(x_data), max(x_data)
ymin, ymax = min(y_data), max(y_data)

# Define grid density.
gd = 100
# Define bandwidth
bw = 2.

# Using gaussian_filter
# Obtain 2D histogram.
rang = [[xmin, xmax], [ymin, ymax]]
binsxy = [gd, gd]
hist1, xedges, yedges = np.histogram2d(x_data, y_data, range=rang, bins=binsxy)
# Gaussian filtered histogram.
h_g = gaussian_filter(hist1, bw)

# Using gaussian_kde
values = np.vstack([x_data, y_data])
# Data 2D kernel density estimate.
kernel = gaussian_kde(values, bw_method=bw / 30.)
# Define x,y grid.
gd_c = complex(0, gd)
x, y = np.mgrid[xmin:xmax:gd_c, ymin:ymax:gd_c]
positions = np.vstack([x.ravel(), y.ravel()])
# Evaluate KDE.
z = kernel(positions)
# Re-shape for plotting
z = z.reshape(gd, gd)

# Make plots.
fig, (ax1, ax2) = plt.subplots(1, 2)
# Gaussian filtered 2D histograms.
ax1.imshow(h_g.transpose(), origin='lower')
ax2.imshow(z.transpose(), origin='lower')

plt.show()

scipy.ndimage.filters.gaussian_filter 不接受 bw 作为输入,而是使用 sigma,即高斯核的标准差。 - Hugues Fontenelle
1个回答

3
因为你正在做两件不同的事情,所以它们之间没有关系。
使用scipy.ndimage.filters.gaussian_filter,您正在使用核过滤2D变量(图像),该核恰好是高斯核。它基本上是平滑图像。
使用scipy.stats.gaussian_kde,您尝试估计2D变量的概率密度函数。带宽(或平滑参数)是您的积分步长,并且应尽可能小地与数据相匹配。
这两个图像看起来相同,因为您从中提取样本的均匀分布与正常分布并没有太大差异。显然,使用正常核函数可以获得更好的估计。
您可以阅读有关Kernel density estimation的内容。 编辑: 在核密度估计(KDE)中,核被缩放,以使带宽成为平滑核的标准差。 要使用哪个带宽并不明显,因为它取决于数据。对于单变量数据,存在一种最佳选择,称为Silverman的经验法则。
总之,高斯滤波器的标准差和KDE的带宽之间没有关系,因为我们在谈论不同的东西。然而,仅谈论KDE时,KDE带宽与相同KDE内核的标准差之间存在关系。它们是相等的!但实际上,实现细节有所不同,可能会有依赖于内核大小的缩放。您可以阅读特定软件包gaussian_kde.py的内容。

我不太确定为什么没有关系,如果您能详细解释一下就太好了,但是如果这是我得到的唯一答案,我仍然会授予您50分。谢谢Hughes! - Gabriel
我扩展了我的答案。过滤和估计之间没有关系。但是您可以将标准偏差与估计器的带宽相关联。 - Hugues Fontenelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接