Python 高斯滤波器和高斯kde中sigma与带宽的关系

Python 高斯滤波器和高斯kde中sigma与带宽的关系,python,scipy,filtering,gaussian,kernel-density,Python,Scipy,Filtering,Gaussian,Kernel Density,如果在每个函数中分别适当地选择sigma和bw_方法参数,则在给定的数据集上应用函数和可以得到非常相似的结果 例如,我可以通过在gaussian_filter(左图)中设置sigma=2.和bw_method=sigma/30.在gaussian_kde(右图)中设置 (MWE位于问题的底部) 显然,这些参数之间存在着某种关系,因为一个对数据应用了高斯滤波器,另一个对数据应用了高斯核密度估计 每个参数的定义如下: ,sigma: 西格玛:高斯分布的标量或标量序列标准偏差 内核给出了高斯滤波

如果在每个函数中分别适当地选择
sigma
bw_方法
参数,则在给定的数据集上应用函数和可以得到非常相似的结果

例如,我可以通过在
gaussian_filter
(左图)中设置
sigma=2.
bw_method=sigma/30.
gaussian_kde
(右图)中设置

(MWE位于问题的底部)

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

每个参数的定义如下:

  • sigma
西格玛:高斯分布的标量或标量序列标准偏差 内核给出了高斯滤波器的标准差 每个轴都作为一个序列或单个数字,在这种情况下 所有轴都相等

考虑到高斯算子的定义,我可以理解这一点:

  • bw_方法
bw_方法:str,标量或可调用,可选用于 计算估计器带宽。这可能是“斯科特”,“西尔弗曼”,一个 标量常量或可调用的。如果是标量,则将直接使用它 作为kde.factor。如果是可调用的,则应使用gaussian_kde实例 作为唯一参数,并返回标量。如果没有(默认),“scott”为 用过。有关更多详细信息,请参见注释

在这种情况下,让我们假设
bw\u方法
的输入是一个标量(浮点),以便与
sigma
相比较。这里是我迷路的地方,因为我在任何地方都找不到关于这个
kde.factor
参数的信息

我想知道的是,如果可能的话,连接这两个参数的精确数学方程(即:
sigma
bw\u方法(当使用浮点时))


MWE:


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

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

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

这两幅图像看起来是一样的,因为从中提取样本的均匀分布与正态分布没有太大区别。显然,使用普通核函数可以得到更好的估计

你可以读到

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

总而言之,高斯滤波器的标准偏差与KDE的带宽之间没有关系,因为我们谈论的是橘子和苹果。
然而,仅就KDE而言,KDE带宽与同一KDE内核的标准偏差之间存在关系。他们是平等的!事实上,实现细节有所不同,并且可能存在一种扩展,这取决于内核的大小。您可以阅读您的特定软件包gaussian_kde.py

我不太清楚为什么没有关系,如果您能在这方面做一些扩展就太好了,但如果这是我得到的唯一答案,我还是会给您50分。谢谢休斯!我扩大了我的答案。过滤和估计之间没有关系。但是,您可以将标准偏差与估计器的频带宽度相关联。
scipy.ndimage.filters。gaussian_filter
不将
bw
作为输入,而是将
sigma
作为高斯核的标准偏差。
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()