gaussian_kde#
- class scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)[source]#
使用高斯核进行核密度估计的表示。
核密度估计是用来以非参数的方式估计随机变量的概率密度函数 (PDF)。
gaussian_kde
适用于单变量数据和多变量数据。它包括自动带宽确定功能。该估计最适用于单峰分布;双峰或多峰分布会趋于过度平滑。- 参数:
- dataset类似数组
要从中估计的数据点。如果是单变量数据,这是一个一维数组;否则是一个二维数组,形状为(维度数,数据数)。
- bw_methodstr、标量或可调用对象(可选)
用于计算估计器带宽的方法。可以是“scott”、“silverman”,一个标量常数或一个可调用对象。如果是标量,将直接用作kde.factor。如果是可调用对象,则它应只接受一个
gaussian_kde
实例作为参数,并返回一个标量值。如果没有值(默认值),则使用“scott”。有关更多详细信息,请参阅注释。- weights类似数组。(可选)
数据点的加权。这必须与数据集的形状相同。如果为 None(默认),则样本被认为是均等的。
备注
带宽选择对 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
。参考文献
[1] (1,2,3)D.W. Scott,"Multivariate Density Estimation: Theory, Practice, and Visualization",John Wiley & Sons,纽约、奇切斯特,1992 年。
[3]B.A. Turlach,“在核密度估计中,选择带宽:评论”,核心和统计学院,第 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()
- 属性:
- 数据集ndarray
使用其初始化的
gaussian_kde
的数据集。- dint
维度数目。
- nint
数据点数目。
- neffint
有效的数据点数。
在版本 1.2.0 中添加。
- 因子float
从 kde.covariance_factor 获得的带宽因子。 的平方 kde.factor 乘以 kde 估计中数据的协方差矩阵。
- 协方差ndarray
由计算的带宽缩放后的 dataset 的协方差矩阵 (kde.factor)。
- inv_covndarray
covariance 的逆。
方法
evaluate
(要点)根据一组点,评估估计的 pdf。
__call__
(要点)根据一组点,评估估计的 pdf。
integrate_gaussian
(均值,协方差)将估计的密度乘以多元高斯函数,并在整个空间中进行积分。
integrate_box_1d
(低,高)计算两个边界之间的 1D pdf 的积分。
integrate_box
(低边界,高边界[,maxpts])计算某个矩形区间 PDF 的积分。
integrate_kde
(other)计算这个核密度估计与另一个估计之间的乘积的积分。
pdf
(x)在提供的一组点上评估估计的 PDF。
logpdf
(x)在提供的一组点上评估估计 PDF 的对数。
resample
([size, seed])从估计的 PDF 中随机采样一个数据集。
set_bandwidth
([bw_method])用给定的方法计算估计器的带宽。
计算系数 (kde.factor),该系数乘以数据协方差矩阵以获得核协方差矩阵。