如果分别适当选择每个函数中的sigma
和bw_method
参数,则对给定数据集应用函数scipy.ndimage.filters.gaussian_filter和scipy.stats.gaussian_kde可以得到非常相似的结果。
例如,我可以通过设置sigma=2.
(左图)和gaussian_filter
bw_method=sigma/30.
中的gaussian_kde
来获得以下点的随机2D分布(右图):
(MWE位于问题的底部)
这些参数之间显然存在关系,因为一个应用高斯滤波器而另一个应用高斯核密度估计器。
每个参数的定义是:
sigma:标量或标量序列高斯标准偏差 核心。给出了高斯滤波器的标准偏差 每个轴作为一个序列,或作为一个数字,在这种情况下它是 所有轴都相等。
鉴于高斯算子的定义,我可以理解这一点:
bw_method
:bw_method:str,scalar或callable,optional用于的方法 计算估算器带宽。这可以是'scott','silverman',a 标量常数或可调用。如果是标量,这将直接使用 作为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()
答案 0 :(得分:3)
没有任何关系因为你做了两件不同的事情。
使用scipy.ndimage.filters.gaussian_filter,您正在使用内核过滤2D变量(图像),并且该内核恰好是高斯变量。它基本上使图像平滑。
使用scipy.stats.gaussian_kde,您可以尝试估算2D变量的概率密度函数。带宽(或平滑参数)是您的集成步骤,应该与数据允许的一样小。
这两个图像看起来是一样的,因为您从中抽取样本的均匀分布与正态分布没有什么不同。显然,你可以通过正常的内核函数得到更好的估计。
您可以阅读Kernel density estimation。
修改强>: 在核密度估计(KDE)中,对内核进行缩放,使得带宽是平滑内核的标准偏差。 使用哪个带宽并不明显,因为它取决于数据。对于单变量数据存在最佳选择,称为Silverman的经验法则。
总而言之,高斯滤波器的标准偏差与KDE的带宽之间没有关系,因为我们正在谈论橙子和苹果。 但是,谈到KDE only ,是 KDE带宽与同一KDE内核标准差之间的关系。他们是平等的!实际上,实现细节有所不同,并且可能存在取决于内核大小的扩展。你可以阅读你的特定包gaussian_kde.py