scipy.stats.

rv_continuous#

class scipy.stats.rv_continuous(momtype=1, a=None, b=None, xtol=1e-14, badvalue=None, name=None, longname=None, shapes=None, seed=None)[source]#

一个用于子类化的通用连续随机变量类。

rv_continuous是一个用于构建特定分布类和连续随机变量实例的基类。 它不能直接用作分布。

参数:
momtypeint,可选

要使用的通用矩计算的类型:0 表示 pdf,1(默认)表示 ppf。

afloat,可选

分布支持的下限,默认为负无穷大。

bfloat,可选

分布支持的上限,默认为正无穷大。

xtolfloat,可选

用于通用 ppf 的定点计算的容差。

badvaluefloat,可选

结果数组中指示违反某些参数限制的值,默认为 np.nan。

namestr,可选

实例的名称。 此字符串用于构造分布的默认示例。

longnamestr,可选

当子类没有自己的文档字符串时,此字符串用作返回的文档字符串的第一行的一部分。 注意:longname 的存在是为了向后兼容,请勿用于新的子类。

shapesstr,可选

分布的形状。 例如 "m, n" 用于将两个整数作为其所有方法的两个形状参数的分布。 如果未提供,形状参数将从实例的私有方法 _pdf_cdf 的签名推断。

seed{None, int, numpy.random.Generator, numpy.random.RandomState}, optional

如果 seed 为 None(或 np.random),则使用 numpy.random.RandomState 单例。 如果 seed 是一个 int,则使用一个新的 RandomState 实例,并使用 seed 进行播种。 如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。

属性:
a, bfloat,可选

未移位/未缩放分布的支持的下/上限。 此值不受 locscale 参数的影响。 要计算移位/缩放分布的支持,请使用 support 方法。

方法

rvs(*args, **kwds)

给定类型的随机变量。

pdf(x, *args, **kwds)

给定 RV 的概率密度函数在 x 处的值。

logpdf(x, *args, **kwds)

给定 RV 的概率密度函数在 x 处的对数值。

cdf(x, *args, **kwds)

给定 RV 的累积分布函数。

logcdf(x, *args, **kwds)

给定 RV 的累积分布函数在 x 处的对数值。

sf(x, *args, **kwds)

给定 RV 的生存函数(1 - cdf)在 x 处的值。

logsf(x, *args, **kwds)

给定 RV 的生存函数的对数值。

ppf(q, *args, **kwds)

给定 RV 的百分点函数(cdf 的逆函数)在 q 处的值。

isf(q, *args, **kwds)

给定 RV 的逆生存函数(sf 的逆函数)在 q 处的值。

moment(order, *args, **kwds)

指定阶数的分布的非中心矩。

stats(*args, **kwds)

给定 RV 的一些统计量。

entropy(*args, **kwds)

RV 的微分熵。

expect([func, args, loc, scale, lb, ub, ...])

通过数值积分计算函数相对于分布的期望值。

median(*args, **kwds)

分布的中位数。

mean(*args, **kwds)

分布的均值。

std(*args, **kwds)

分布的标准差。

var(*args, **kwds)

分布的方差。

interval(confidence, *args, **kwds)

围绕中位数的具有相等面积的置信区间。

__call__(*args, **kwds)

冻结给定参数的分布。

fit(data, *args, **kwds)

从数据返回形状(如果适用)、位置和比例参数的估计值。

fit_loc_scale(data, *args)

使用一阶矩和二阶矩从数据估计 loc 和 scale 参数。

nnlf(theta, x)

负对数似然函数。

support(*args, **kwargs)

分布的支持。

备注

分布类实例的公共方法(例如,pdfcdf)检查其参数并将有效参数传递给私有计算方法(_pdf_cdf)。 对于 pdf(x),如果 x 在分布的支持范围内,则 x 有效。 形状参数是否有效由 _argcheck 方法决定(默认为检查其参数是否严格为正。)

子类化

可以通过子类化 rv_continuous 类并重新定义至少 _pdf_cdf 方法(标准化为位置 0 和比例 1)来定义新的随机变量。

如果正参数检查对于您的 RV 不正确,那么您还需要重新定义 _argcheck 方法。

对于大多数 scipy.stats 分布,支持区间不依赖于形状参数。 x 位于支持区间中等效于 self.a <= x <= self.b。 如果支持的任何一个端点确实依赖于形状参数,则 i) 分布必须实现 _get_support 方法;并且 ii) 这些依赖端点必须从分布对 rv_continuous 初始化程序的调用中省略。

对于其余的方法,存在正确但可能较慢的默认值,但为了速度和/或准确性,您可以覆盖

_logpdf, _cdf, _logcdf, _ppf, _rvs, _isf, _sf, _logsf

默认方法 _rvs 依赖于 cdf 的逆函数 _ppf,应用于均匀随机变量。 为了有效地生成随机变量,要么需要覆盖默认的 _ppf(例如,如果逆 cdf 可以用显式形式表示),要么需要在自定义 _rvs 方法中实现抽样方法。

如果可能,您应该覆盖 _isf_sf_logsf。 主要原因是为了提高数值精度:例如,生存函数 _sf 计算为 1 - _cdf,如果 _cdf(x) 接近 1,则可能导致精度损失。

可以被子类覆盖的方法

_rvs
_pdf
_cdf
_sf
_ppf
_isf
_stats
_munp
_entropy
_argcheck
_get_support

还有一些额外的(内部和私有的)通用方法对于交叉检查和调试很有用,但在直接调用时可能在所有情况下都有效。

关于 shapes 的说明:子类不需要显式指定它们。 在这种情况下,shapes 将自动从覆盖的方法(pdfcdf 等)的签名推断。 如果由于某种原因,您更喜欢避免依赖内省,您可以将 shapes 显式指定为实例构造函数的参数。

冻结分布

通常,您必须为分布的每个方法的调用提供形状参数(以及可选的位置和比例参数)。

或者,可以调用该对象(作为函数)来固定形状、位置和比例参数,从而返回“冻结”的连续 RV 对象

rv = generic(<shape(s)>, loc=0, scale=1)

rv_frozen 对象具有相同的方法,但保持给定的形状、位置和比例固定

统计

默认情况下,统计量使用数值积分计算。 为了提高速度,您可以使用 _stats 重新定义它

  • 获取形状参数并返回 mu、mu2、g1、g2

  • 如果您无法计算其中一个,请将其作为 None 返回

  • 也可以使用关键字参数 moments 定义,该参数是一个由 “m”、“v”、“s” 和/或 “k” 组成的字符串。 只应计算出现在字符串中的组件,并按 “m”、“v”、“s” 或 “k” 的顺序返回,缺少的值作为 None 返回。

或者,您可以覆盖 _munp,它接受 n 和形状参数,并返回分布的第 n 个非中心矩。

深度复制/腌制

如果深度复制(腌制/解腌等)分布或冻结分布,则任何底层随机数生成器都会与它一起深度复制。 一个含义是,如果分布在复制之前依赖于单例 RandomState,它将在复制后依赖于该随机状态的副本,并且 np.random.seed 将不再控制状态。

示例

要创建一个新的高斯分布,我们将执行以下操作

>>> from scipy.stats import rv_continuous
>>> class gaussian_gen(rv_continuous):
...     "Gaussian distribution"
...     def _pdf(self, x):
...         return np.exp(-x**2 / 2.) / np.sqrt(2.0 * np.pi)
>>> gaussian = gaussian_gen(name='gaussian')

scipy.stats 分布是实例,因此我们在这里子类化 rv_continuous 并创建一个实例。 这样,我们现在就拥有了一个功能齐全的分布,所有相关方法都由框架自动生成。

请注意,上面我们定义了一个标准正态分布,均值为零,方差为单位。 分布的移位和缩放可以通过使用 locscale 参数来完成:gaussian.pdf(x, loc, scale) 本质上计算 y = (x - loc) / scalegaussian._pdf(y) / scale