scipy.stats.

boxcox_normmax#

scipy.stats.boxcox_normmax(x, brack=None, method='pearsonr', optimizer=None, *, ymax=BIG_FLOAT)[原始碼]#

計算輸入資料的最佳 Box-Cox 轉換參數。

參數:
xarray_like

輸入陣列。所有條目必須是正數、有限、實數。

brack2-tuple, optional, default (-2.0, 2.0)

用於預設 optimize.brent 求解器的下坡括號搜尋的起始區間。請注意,在大多數情況下,這並不關鍵;最終結果允許在此括號之外。如果傳遞 optimizer,則 brack 必須為 None。

methodstr, optional

用於確定最佳轉換參數的方法 (boxcox lmbda 參數)。選項為

‘pearsonr’ (預設)

最大化 y = boxcox(x)x 呈常態分佈時 y 的期望值之間的皮爾森相關係數。

‘mle’

最大化對數似然函數 boxcox_llf。這是 boxcox 中使用的方法。

‘all’

使用所有可用的最佳化方法,並傳回所有結果。適用於比較不同的方法。

optimizercallable, optional

optimizer 是一個可呼叫物件,它接受一個引數

funcallable

要最小化的目標函數。fun 接受一個引數,即 Box-Cox 轉換參數 lmbda,並傳回在提供的引數處的函數值 (例如,負對數似然函數)。optimizer 的工作是找到最小化 funlmbda 值。

並傳回一個物件,例如 scipy.optimize.OptimizeResult 的實例,它在屬性 x 中保存 lmbda 的最佳值。

請參閱以下範例或 scipy.optimize.minimize_scalar 的文件以取得更多資訊。

ymaxfloat, optional

不受約束的最佳轉換參數可能會導致 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()
../../_images/scipy-stats-boxcox_normmax-1_00_00.png

或者,我們可以定義我們自己的 optimizer 函數。假設我們只對區間 [6, 7] 上的 lmbda 值感興趣,我們想將 scipy.optimize.minimize_scalarmethod='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