gaussian_kde#
- class scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)[源代码]#
使用高斯核(Gaussian kernels)进行核密度估计的表示。
核密度估计(KDE)是一种以非参数方式估计随机变量概率密度函数(PDF)的方法。
gaussian_kde适用于单变量和多变量数据。它包含自动带宽确定功能。该估计对单峰分布效果最佳;双峰或多峰分布往往会被过度平滑。- 参数:
- datasetarray_like
用于估计的数据点。如果是单变量数据,这是一个一维数组,否则是形状为(维度数, 数据量)的二维数组。
- bw_methodstr, 标量或可调用对象, 可选
用于计算带宽因子的方法。可以是 ‘scott’、‘silverman’、一个标量常数或一个可调用对象。如果是标量,将直接用作 factor。如果是可调用对象,它应仅接受一个
gaussian_kde实例作为参数并返回一个标量。如果为 None(默认值),则使用 ‘scott’。详情请参阅“注意”部分。- weightsarray_like, optional
数据点的权重。必须与 dataset 形状相同。如果为 None(默认值),则假定样本权重相等。
- 属性:
- datasetndarray
初始化
gaussian_kde时使用的数据集。- dint
维度数量。
- nint
数据点数量。
- neffint
有效数据点数量。
在 1.2.0 版本中添加。
- factorfloat
从
covariance_factor获得的带宽因子。- covariancendarray
核协方差矩阵;这是数据协方差矩阵乘以带宽因子的平方,例如
np.cov(dataset) * factor**2。- inv_covndarray
covariance 的逆矩阵。
方法
evaluate(points)在给定的一组点上评估估计的 pdf。
__call__(points)在给定的一组点上评估估计的 pdf。
integrate_gaussian(mean, cov)将估计密度与多元高斯分布相乘,并在整个空间上积分。
integrate_box_1d(low, high)计算一维 pdf 在两个边界之间的积分。
integrate_box(low_bounds, high_bounds[, ...])计算 pdf 在矩形区间内的积分。
integrate_kde(other)计算此核密度估计与另一个核密度估计乘积的积分。
pdf(x)在提供的一组点上评估估计的 pdf。
logpdf(x)在提供的一组点上评估估计 pdf 的对数。
resample([size, seed])从估计的 pdf 中随机采样一个数据集。
set_bandwidth([bw_method])使用给定方法计算带宽因子。
计算带宽因子 factor。
marginal(dimensions)返回边缘 KDE 分布
附注
带宽选择极大地影响从 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)).
请注意,这与“Silverman 经验法则” [6] 不同,后者在单变量情况下可能更稳健;有关实现自定义带宽规则的信息,请参阅
set_bandwidth方法的文档。有关核密度估计的良好一般描述可在 [1] 和 [2] 中找到,此多维实现的数学原理可在 [1] 中找到。
对于一组带权重的样本,有效数据点数量
neff定义为:neff = sum(weights)^2 / sum(weights^2)
详情见 [5]。
gaussian_kde目前不支持位于其所表达空间的低维子空间中的数据。对于此类数据,请考虑执行主成分分析 / 降维,并对转换后的数据使用gaussian_kde。参考文献
[3]B.A. Turlach, “核密度估计中的带宽选择:综述”, CORE 及其统计研究所, 第 19 卷, 第 1-33 页, 1993.
[4]D.M. Bashtannyk 和 R.J. Hyndman, “核条件密度估计的带宽选择”, 计算统计与数据分析, 第 36 卷, 第 279-298 页, 2001.
[5]Gray P. G., 1969, 皇家统计学会杂志. A 系列 (一般), 132, 272
[6]核密度估计. 维基百科. https://en.wikipedia.org/wiki/Kernel_density_estimation
示例
生成一些随机二维数据
>>> 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()
与在某点处的手动 KDE 进行比较
>>> point = [1, 2] >>> mean = values.T >>> cov = kernel.factor**2 * np.cov(values) >>> X = stats.multivariate_normal(cov=cov) >>> res = kernel.pdf(point) >>> ref = X.pdf(point - mean).sum() / len(mean) >>> np.allclose(res, ref) True