rv_continuous#
- 类 scipy.stats.rv_continuous(momtype=1, a=无, b=无, xtol=1e-14, badvalue=无, name=无, longname=无, shapes=无, seed=无)[源代码]#
一个通用的连续随机变量类,用于子类化。
rv_continuous
是一个基类,用于构建连续随机变量的特定分布类和实例。不能直接用作分布。- 参数:
- momtypeint,可选
使用的一般化矩计算类型:对于 pdf 为 0,对于 ppf 为 1(默认值)。
- afloat,可选
分布支持的下限,默认值为负无穷大。
- bfloat,可选
分布支持的上限,默认值为正无穷大。
- xtolfloat,可选
一般化 ppf 的固定点计算容差。
- badvaluefloat,可选
结果数组中指示违反某个参数限制的值,默认值为 np.nan。
- namestr,可选
实例名称。此字符串用于构建分布的默认实例。
- longnamestr,可选
此字符串用作子类没有自己的文档字符串时返回的文档字符串第一行的某一部分。注意:longname 存在是为了向后兼容,不要用于新子类。
- shapesstr,可选
分布的形状。例如,
"m, n"
对于将两个整数作为其所有方法的两个形状参数的分布。如果没有提供,形状参数将从私有方法的签名推断,实例的代码 class="docutils literal notranslate">_pdf 和_cdf
。- seed{None、int、
numpy.random.Generator
、numpy.random.RandomState
,可选} 如果 seed 为 None(或 np.random),则使用一个
numpy.random.RandomState
单例。如果 seed 为整数,则使用新的RandomState
实例,并使用 seed 放置随机数生成器种子。如果 seed 已经是Generator
或RandomState
实例,则使用该实例。
说明
分布类实例的公用方法(例如,
pdf
、cdf
)检查其自变量并将有效自变量传递给私有计算方法 (_pdf
、_cdf
)。对于pdf(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 将从覆盖方法(pdf
、cdf
等)的签名中自动推导。如果您出于某种原因希望避免依赖于自省,您可以将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
并创建一个实例。通过此方法,我们现在拥有了一个功能齐全的分布,其中所有相关方法均由框架自动生成。请注意,我们在上面定义了一个标准正态分布,均值为零,方差为单位。可以使用
loc
和scale
参数来平移和缩放分布:gaussian.pdf(x, loc, scale)
实质上计算y = (x - loc) / scale
和gaussian._pdf(y) / scale
。- 属性:
random_state
获取或设置用于生成随机变量的生成器对象。
方法
rvs
(*args, **kwds)给定类型的随机变量。
pdf
(x, *args, **kwds)给定随机变量在 x 处的概率密度函数。
logpdf
(x, *args, **kwds)给定随机变量在 x 处概率密度函数的对数。
cdf
(x, *args, **kwds)给定随机变量的累积分布函数。
logcdf
(x, *args, **kwds)给定随机变量在 x 处的累积分布函数的对数。
sf
(x, *参数, **关键字参数)给定随机变量在 x 处的生存函数 (1 -
cdf
)。logsf
(x, *参数, **关键字参数)给定随机变量的生存函数的对数。
ppf
(q, *参数, **关键字参数)(
cdf
的逆) 在 q 处的百分位数函数。isf
(q, *参数, **关键字参数)(
sf
的逆) 给定随机变量在 q 处的逆生存函数。moment
(order, *参数, **关键字参数)指定阶数的分布的非中心矩。
stats
(*参数, **关键字参数)给定随机变量的一些统计信息。
entropy
(*参数, **关键字参数)随机变量的微分熵。
expect
([func, args, loc, scale, lb, ub, ...])通过数值积分计算相对于分布的函数的期望值。
median
(*参数, **关键字参数)分布的中值。
mean
(*参数, **关键字参数)分布的均值。
std
(*args, **kwds)分布的标准差。
var
(*args, **kwds)分布的方差。
interval
(confidence, *args, **kwds)具有围绕中位数相等面积的置信区间。
__call__
(*args, **kwds)冻结给定参数的分布。
fit
(data, *args, **kwds)从数据中返回形状(如果适用)、位置和尺度参数的估计值。
fit_loc_scale
(data, *args)利用一阶矩和二阶矩从数据中估计位置和尺度参数。
nnlf
(theta, x)负对数似然函数。
support
(*args, **kwargs)分布的支持。