boxcox_normmax#
- scipy.stats.boxcox_normmax(x, brack=None, method='pearsonr', optimizer=None, *, ymax=BIG_FLOAT)[源代码]#
计算输入数据的最优 Box-Cox 变换参数。
- 参数:
- xarray_like
输入数组。所有条目必须是正的、有限的实数。
- brack2-元组,可选,默认 (-2.0, 2.0)
用于默认 optimize.brent 求解器的下坡括号搜索的起始区间。请注意,在大多数情况下,这不是关键的;最终结果可以超出此括号。如果传递了 optimizer,则 brack 必须为 None。
- methodstr,可选
确定最优变换参数的方法(
boxcox
lmbda
参数)。选项包括- ‘pearsonr’ (默认)
最大化
y = boxcox(x)
与 x 如果呈正态分布时y
的预期值之间的 Pearson 相关系数。- ‘mle’
最大化对数似然
boxcox_llf
。这是在boxcox
中使用的方法。- ‘all’
使用所有可用的优化方法,并返回所有结果。可用于比较不同的方法。
- optimizercallable,可选
optimizer 是一个可调用对象,它接受一个参数
- funcallable
要最小化的目标函数。fun 接受一个参数,即 Box-Cox 变换参数 lmbda,并返回所提供参数处的函数值(例如,负对数似然)。optimizer 的工作是找到使 fun 最小化的 lmbda 值。
并返回一个对象,例如
scipy.optimize.OptimizeResult
的实例,该对象在属性 x 中保存 lmbda 的最优值。有关更多信息,请参见下面的示例或
scipy.optimize.minimize_scalar
的文档。- ymaxfloat,可选
无约束的最优变换参数可能会导致 Box-Cox 变换后的数据具有极大的幅度甚至溢出。此参数约束 MLE 优化,使得变换后的 x 的幅度不超过 ymax。默认值是输入 dtype 的最大值。如果设置为无穷大,则
boxcox_normmax
返回无约束的最优 lambda。当method='pearsonr'
时忽略。
- 返回:
- maxlogfloat 或 ndarray
找到的最优变换参数。对于
method='all'
,是一个数组而不是标量。
示例
>>> import numpy as np >>> from scipy import stats >>> import matplotlib.pyplot as plt
我们可以生成一些数据,并以各种方式确定最优的
lmbda
>>> rng = np.random.default_rng() >>> x = stats.loggamma.rvs(5, size=30, random_state=rng) + 5 >>> y, lmax_mle = stats.boxcox(x) >>> lmax_pearsonr = stats.boxcox_normmax(x)
>>> lmax_mle 2.217563431465757 >>> lmax_pearsonr 2.238318660200961 >>> stats.boxcox_normmax(x, method='all') array([2.23831866, 2.21756343])
>>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> prob = stats.boxcox_normplot(x, -10, 10, plot=ax) >>> ax.axvline(lmax_mle, color='r') >>> ax.axvline(lmax_pearsonr, color='g', ls='--')
>>> plt.show()
或者,我们可以定义我们自己的 optimizer 函数。假设我们只对区间 [6, 7] 上的 lmbda 值感兴趣,我们想使用
scipy.optimize.minimize_scalar
和method='bounded'
,并且我们希望在优化对数似然函数时使用更严格的容差。为此,我们定义一个函数,该函数接受位置参数 fun,并使用scipy.optimize.minimize_scalar
来最小化 fun,并受到提供的边界和容差的约束。>>> from scipy import optimize >>> options = {'xatol': 1e-12} # absolute tolerance on `x` >>> def optimizer(fun): ... return optimize.minimize_scalar(fun, bounds=(6, 7), ... method="bounded", options=options) >>> stats.boxcox_normmax(x, optimizer=optimizer) 6.000000000