gaussian_kde#
- class scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)[源代码][源代码]#
使用高斯核表示核密度估计。
核密度估计是一种以非参数方式估计随机变量的概率密度函数(PDF)的方法。
gaussian_kde
适用于单变量和多变量数据。它包括自动带宽确定。该估计方法最适合单峰分布;双峰或多峰分布往往会过度平滑。- 参数:
- 数据集array_like
用于估计的数据点。如果是单变量数据,这是一个一维数组,否则是一个形状为(# 维度数,# 数据数)的二维数组。
- bw_methodstr, 标量或可调用对象,可选
用于计算估计器带宽的方法。这可以是 ‘scott’、’silverman’、一个标量常数或一个可调用对象。如果是标量,这将直接用作 kde.factor。如果是可调用对象,它应该只接受一个
gaussian_kde
实例作为参数并返回一个标量。如果为 None(默认),则使用 ‘scott’。详见注释。- 权重类似数组, 可选
数据点的权重。这必须与数据集的形状相同。如果为 None(默认),则假设样本的权重相等。
- 属性:
- 数据集ndarray
gaussian_kde
初始化时所使用的数据集。- d整数
维度数量。
- n整数
数据点的数量。
- neff整数
有效数据点的数量。
Added in version 1.2.0.
- 因素浮动
带宽因子,从 kde.covariance_factor 获得。kde.factor 的平方乘以 kde 估计中数据的协方差矩阵。
- 协方差ndarray
dataset 的协方差矩阵,按计算的带宽 (kde.factor) 进行缩放。
- inv_covndarray
协方差 的逆。
方法
evaluate
(points)在一批点上评估估计的pdf。
__call__
(points)在一批点上评估估计的pdf。
integrate_gaussian
(mean, cov)将估计的密度乘以多元高斯分布,并在整个空间上进行积分。
integrate_box_1d
(low, high)计算一维概率密度函数在两个边界之间的积分。
integrate_box
(low_bounds, high_bounds[, maxpts])计算PDF在矩形区间上的积分。
integrate_kde
(other)计算此核密度估计与另一个的乘积的积分。
pdf
(x)在提供的一组点上评估估计的pdf。
logpdf
(x)在提供的一组点上评估估计的概率密度函数的对数。
resample
([size, seed])从估计的概率密度函数中随机抽样数据集。
set_bandwidth
([bw_method])使用给定方法计算估计器的带宽。
计算系数(kde.factor),该系数乘以数据协方差矩阵以获得核协方差矩阵。
注释
带宽选择对从 KDE 获得的估计值有强烈影响(比核函数的实际形状影响更大)。带宽选择可以通过“经验法则”、交叉验证、“插件方法”或其他方式进行;参见 [3]、[4] 的综述。
gaussian_kde
使用的是经验法则,默认是 Scott 法则。Scott 规则 [1],实现为 scotts_factor,是:
n**(-1./(d+4)),
其中
n
是数据点的数量,d
是维度的数量。在数据点权重不均等的情况下,scotts_factor 变为:neff**(-1./(d+4)),
使用
neff
作为数据点的有效数量。Silverman 规则 [2],实现为 silverman_factor,如下:(n * (d + 2) / 4.)**(-1. / (d + 4)).
或者在点权重不均等的情况下:
(neff * (d + 2) / 4.)**(-1. / (d + 4)).
关于核密度估计的总体描述可以在 [1] 和 [2] 中找到,这个多维实现的数学原理可以在 [1] 中找到。
通过一组加权样本,数据点的有效数量
neff
定义为:neff = sum(weights)^2 / sum(weights^2)
如 [5] 中所详述。
gaussian_kde
目前不支持位于其表达空间中较低维度子空间的数据。对于此类数据,请考虑执行主成分分析/降维,并使用gaussian_kde
处理转换后的数据。参考文献
[3]B.A. Turlach, “核密度估计中的带宽选择:综述”, CORE 和 Institut de Statistique, 第19卷, 第1-33页, 1993年。
[4]D.M. Bashtannyk 和 R.J. Hyndman,“核条件密度估计的带宽选择”,《计算统计与数据分析》,第36卷,第279-298页,2001年。
[5]Gray P. G., 1969, 《皇家统计学会杂志》A辑(总论), 132, 272
示例
生成一些随机的二维数据:
>>> import numpy as np >>> from scipy import stats >>> def measure(n): ... "Measurement model, return two coupled measurements." ... m1 = np.random.normal(size=n) ... m2 = np.random.normal(scale=0.5, size=n) ... return m1+m2, m1-m2
>>> m1, m2 = measure(2000) >>> xmin = m1.min() >>> xmax = m1.max() >>> ymin = m2.min() >>> ymax = m2.max()
对数据进行核密度估计:
>>> X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] >>> positions = np.vstack([X.ravel(), Y.ravel()]) >>> values = np.vstack([m1, m2]) >>> kernel = stats.gaussian_kde(values) >>> Z = np.reshape(kernel(positions).T, X.shape)
绘制结果:
>>> import matplotlib.pyplot as plt >>> fig, ax = plt.subplots() >>> ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r, ... extent=[xmin, xmax, ymin, ymax]) >>> ax.plot(m1, m2, 'k.', markersize=2) >>> ax.set_xlim([xmin, xmax]) >>> ax.set_ylim([ymin, ymax]) >>> plt.show()