scipy.stats.boxcox_normmax

scipy.stats.boxcox_normmax(x, brack=None, method='pearsonr', optimizer=None)[源代码]

计算输入数据的最佳Box-Cox变换参数。

参数
xarray_like

输入数组。

brack2元组,可选,默认(-2.0,2.0)

下坡括号搜索默认值的起始间隔 optimize.brent 求解器。请注意,这在大多数情况下并不重要;最终结果允许在此括号之外。如果 optimizer 通过了, brack 必须为None。

method字符串,可选

确定最优变换参数的方法 (boxcox lmbda 参数)。选项包括:

‘珍珠逊’(默认)

之间的皮尔逊相关系数最大化 y = boxcox(x) 和的期望值 y 如果 x 会是正态分布的。

“mle”

最小化对数似然率 boxcox_llf 。这是中使用的方法 boxcox

“全部”

使用所有可用的优化方法,并返回所有结果。对比较不同的方法很有用。

优化器 ,可选可调用,可选

optimizer 是接受一个参数的可调用对象:

有趣的可调用

待优化的目标函数。 fun 接受一个参数,即Box-Cox转换参数 lmbda ,并以所提供的值返回负对数似然函数。这份工作就是 optimizer 就是找出 lmbda 这会最小化 fun

并返回一个对象,如 scipy.optimize.OptimizeResult ,它保存的最佳值是 lmbda 在属性中 x

请参阅以下示例或的文档 scipy.optimize.minimize_scalar 了解更多信息。

退货
maxlog浮动或ndarray

找到的最佳变换参数。的数组而不是标量 method='all'

示例

>>> 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
1.4613865614008015
>>> lmax_pearsonr
1.6685004886804342
>>> stats.boxcox_normmax(x, method='all')
array([1.66850049, 1.46138656])
>>> 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()
../../_images/scipy-stats-boxcox_normmax-1_00_00.png

或者,我们可以定义我们自己的 optimizer 功能。假设我们只对 lmbda 在区间上 [6, 7] ,我们想要使用 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.000...