Gab*_*iel 6 python filtering gaussian scipy kernel-density
如果分别适当地选择每个函数中的和参数,则对给定数据集应用函数scipy.ndimage.filters.gaussian_filter和scipy.stats.gaussian_kde可以给出非常相似的结果.sigmabw_method
例如,我可以获取由以下曲线设定点的随机分布2D sigma=2.中gaussian_filter(左侧曲线)和bw_method=sigma/30.在gaussian_kde(右曲线):

(MWE位于问题的最底部)
这些参数之间显然存在关系,因为一个应用高斯滤波器而另一个应用高斯核密度估计器.
每个参数的定义是:
sigma:标量或标量序列高斯核的标准偏差.高斯滤波器的标准偏差是作为序列给出的每个轴,或者是单个数字,在这种情况下,它对所有轴都是相等的.
鉴于高斯算子的定义,我可以理解这个:

bw_method:bw_method:str,scalar或callable,optional用于计算估计器带宽的方法.这可以是'scott','silverman',标量常量或可调用.如果是标量,则将直接用作kde.factor.如果是可调用的,则应该将gaussian_kde实例作为唯一参数并返回标量.如果为None(默认值),则使用"scott".有关详细信息,请参阅注释
在这种情况下,让我们假设输入bw_method是一个标量(浮点数),以便与之相比较sigma.这是我迷路的地方,因为我无法在任何kde.factor地方找到有关此参数的信息.
我想知道的是连接这些参数的精确数学方程式(即:sigma和bw_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()
Run Code Online (Sandbox Code Playgroud)
没有关系,因为你们在做两件不同的事情。
使用 scipy.ndimage.filters.gaussian_filter,您可以使用内核过滤 2D 变量(图像),并且该内核恰好是高斯的。它本质上是平滑图像。
使用 scipy.stats.gaussian_kde 您尝试估计 2D 变量的概率密度函数。带宽(或平滑参数)是您的积分步骤,并且应该在数据允许的范围内尽可能小。
这两个图像看起来相同,因为从中抽取样本的均匀分布与正态分布没有太大不同。显然,使用正常的核函数可以得到更好的估计。
您可以阅读有关核密度估计的内容。
编辑:在核密度估计(KDE)中,对核进行缩放,使得带宽是平滑核的标准差。使用哪个带宽并不明显,因为它取决于数据。单变量数据存在一个最佳选择,称为 Silverman 经验法则。
总而言之,高斯滤波器的标准差和 KDE 的带宽之间没有关系,因为我们讨论的是橙子和苹果。然而,仅就KDE 而言,KDE 带宽与同一 KDE 内核的标准差之间存在关系。他们是平等的!事实上,实现细节有所不同,并且可能存在取决于内核大小的缩放。您可以阅读您的特定包 gaussian_kde.py
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |