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()
或者,我们可以定义我们自己的 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...