【发布时间】:2014-11-03 05:42:35
【问题描述】:
如果每个函数中的sigma 和bw_method 参数选择得当,则对给定的数据集应用函数scipy.ndimage.filters.gaussian_filter 和scipy.stats.gaussian_kde 可以得到非常相似的结果。
例如,我可以通过在gaussian_filter(左图)中设置sigma=2. 和在gaussian_kde(右图)中设置bw_method=sigma/30. 来获得点的随机二维分布:
(MWE 在问题的底部)
这些参数之间显然存在关系,因为一个对数据应用高斯滤波器,另一个对数据应用高斯核密度估计器。
每个参数的定义是:
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 参数的信息。
如果可能的话,我想知道连接这两个参数(即: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()
【问题讨论】:
-
scipy.ndimage.filters.gaussian_filter不采用bw作为输入,而是采用sigma,即高斯核的标准差。
标签: python scipy filtering gaussian kernel-density