gaussian_filter 和 gaussian_kde 中 sigma 和带宽的关系

Posted

技术标签:

【中文标题】gaussian_filter 和 gaussian_kde 中 sigma 和带宽的关系【英文标题】:Relation between sigma and bandwidth in gaussian_filter and gaussian_kde 【发布时间】:2014-11-03 05:42:35 【问题描述】:

如果每个函数中的sigmabw_method 参数选择得当,则对给定的数据集应用函数scipy.ndimage.filters.gaussian_filter 和scipy.stats.gaussian_kde 可以得到非常相似的结果。

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

(MWE 在问题的底部)

这些参数之间显然存在关系,因为一个对数据应用高斯滤波器,另一个对数据应用高斯核密度估计器。

每个参数的定义是:

scipy.ndimage.filters.gaussian_filter,sigma

sigma : 标量或标量序列 高斯的标准差 核心。给出了高斯滤波器的标准偏差 每个轴作为一个序列或单个数字,在这种情况下它是 所有轴都相等。

这个给定高斯算子的定义我可以理解:

scipy.stats.gaussian_kde,bw_method

bw_method : str, scalar or callable, optional 用于的方法 计算估计器带宽。这可以是“scott”、“silverman”、 标量常量或可调用对象。如果是标量,这将直接使用 作为kde.factor。如果是可调用的,它应该采用 gaussian_kde 实例 作为唯一参数并返回一个标量。如果没有(默认),“斯科特”是 用过的。有关详细信息,请参阅注释。

在这种情况下,我们假设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,即高斯核的标准差。 【参考方案1】:

没有关系,因为你在做两件不同的事情。

使用 scipy.ndimage.filters.gaussian_filter,您正在使用内核过滤 2D 变量(图像),而该内核恰好是高斯。它本质上是对图像进行平滑处理。

使用 scipy.stats.gaussian_kde,您可以尝试估计二维变量的概率密度函数。带宽(或平滑参数)是您的积分步骤,应尽可能小,只要数据允许。

这两个图像看起来相同,因为您从中抽取样本的均匀分布与正态分布没有太大区别。显然,使用正常的核函数会得到更好的估计。

您可以阅读有关Kernel density estimation 的信息。

编辑: 在核密度估计 (KDE) 中,核被缩放,使得带宽是平滑核的标准偏差。 使用哪个带宽并不明显,因为它取决于数据。存在单变量数据的最佳选择,称为 Silverman 经验法则。

总而言之,高斯滤波器的标准偏差和 KDE 的带宽之间没有关系,因为我们说的是橙子和苹果。 然而,只谈KDE,KDE 带宽与同一个KDE 内核的标准差之间存在关系。他们是平等的!事实上,实现细节不同,并且可能存在取决于内核大小的缩放。你可以阅读你的特定包 gaussian_kde.py

【讨论】:

我不太确定我是否理解 为什么 没有关系,如果您可以对此进行扩展,那就太好了,但如果这是唯一的答案我明白了,我还是会奖励你 50 分。谢谢休斯! 我扩展了我的答案。过滤和估计之间没有关系。但是,您可以关联标准。开发。到估计器的带宽。

以上是关于gaussian_filter 和 gaussian_kde 中 sigma 和带宽的关系的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习之路(27)轮廓查找与绘制——外接圆

PYMC3 季节性变量

如何使用 Pytesseract 文本识别改进 OCR?

为啥cv2和skimage之间的高斯滤波器不同?

如何在 scipy.optimize 函数上强制执行更大的步骤?

scipy中的高斯滤波器