scipy.stats.

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 年。

[2] (1,2)

B.W. Silverman,“统计和数据分析的密度估计”,第 26 卷,统计和应用概率专著,Chapman and Hall,伦敦,1986 年。

[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()
../../_images/scipy-stats-gaussian_kde-1.png
属性:
数据集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])

用给定的方法计算估计器的带宽。

covariance_factor()

计算系数 (kde.factor),该系数乘以数据协方差矩阵以获得核协方差矩阵。