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)[源代码][源代码]#
一个用于子类化的通用连续随机变量类。
rv_continuous
是一个基类,用于构造特定分布类和实例,适用于连续随机变量。它不能直接用作分布。- 参数:
- momtypeint, 可选
要使用的通用矩计算类型:0 表示 pdf,1(默认)表示 ppf。
- afloat, 可选
分布支持的下界,默认是负无穷。
- bfloat, 可选
分布支持的上限,默认值为正无穷。
- xtolfloat, 可选
通用 ppf 定点计算的容差。
- badvaluefloat, 可选
结果数组中的值,表示由于某些参数限制被违反而产生的值,默认是 np.nan。
- 名称str, 可选
实例的名称。此字符串用于构造分布的默认示例。
- 长名称str, 可选
当子类没有自己的文档字符串时,此字符串用作文档字符串返回的第一行的一部分。注意:longname 存在是为了向后兼容,不要在新子类中使用。
- 形状str, 可选
分布的形状。例如
"m, n"
表示一个分布,它将其所有方法的两个整数作为两个形状参数。如果未提供,形状参数将从实例的私有方法_pdf
和_cdf
的签名中推断出来。- seed : {None, int,
numpy.random.Generator
,numpy.random.RandomState
}, 可选{None, int,} 如果 seed 是 None(或 np.random),则使用
numpy.random.RandomState
单例。如果 seed 是 int,则使用新的RandomState
实例,并以 seed 为种子。如果 seed 已经是Generator
或RandomState
实例,则使用该实例。
- 属性:
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, *args, **kwds)生存函数(1 - cdf)在给定随机变量 RV 的 x 处的值。
logsf
(x, *args, **kwds)给定随机变量的生存函数的对数。
ppf
(q, *args, **kwds)百分位点函数(cdf 的逆函数)在给定随机变量 RV 的 q 处的值。
isf
(q, *args, **kwds)给定随机变量在 q 处的逆生存函数(sf 的逆)。
moment
(order, *args, **kwds)指定阶数的分布非中心矩。
stats
(*args, **kwds)给定RV的一些统计数据。
entropy
(*args, **kwds)随机变量的微分熵。
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)使用数据的第1和第2矩估计位置和尺度参数。
nnlf
(theta, x)负对数似然函数。
support
(*args, **kwargs)对发行版的支持。
注释
分布类实例的公共方法(例如,
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)
接近于一,这可能会导致精度损失。可以被子类覆盖的方法
_rvs _pdf _cdf _sf _ppf _isf _stats _munp _entropy _argcheck _get_support
还有一些额外的(内部和私有的)通用方法,这些方法对于交叉检查和调试可能很有用,但在直接调用时可能并不总是有效。
关于
shapes
的说明:子类不需要显式指定它们。在这种情况下,shapes 将根据重写方法(pdf, cdf 等)的签名自动推导。如果由于某些原因,您更倾向于避免依赖内省,您可以将shapes
显式指定为实例构造函数的参数。冻结发行版
通常,您必须为分布的每个方法调用提供形状参数(以及可选的位置和尺度参数)。
或者,可以调用对象(作为函数)来固定形状、位置和比例参数,返回一个“冻结”的连续随机变量对象:
- rv = generic(<形状>, 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
。