本文簡要介紹 python 語言中 scipy.optimize.isotonic_regression
的用法。
用法:
scipy.optimize.isotonic_regression(y, *, weights=None, increasing=True)#
非參數等滲回歸。
一個(非嚴格)單調遞增數組x與相同的長度y由池相鄰違規者算法(PAVA)計算,參見[1]。有關更多詳細信息,請參閱注釋部分。
- y: (N,) 數組
響應變量。
- weights: (N,) 數組 或 None
箱重。
- increasing: bool
如果為 True,則擬合單調遞增,即等滲回歸。如果為 False,則擬合單調遞減(即反調回歸)。默認為 True。
- res: OptimizeResult
優化結果表示為
OptimizeResult
對象。重要的屬性是:x
:等滲回歸解,即長度與 y 相同的遞增(或遞減)數組,元素範圍從 min(y) 到 max(y)。weights
:包含每個塊(或池)B 的案例權重總和的數組。blocks
:長度為 B+1 的數組,其中包含每個塊(或池)B 的起始位置的索引。j-th 塊由x[blocks[j]:blocks[j+1]]
給出,其所有值都相同。
參數 ::
返回 ::
注意:
給定數據 和案例權重 ,等滲回歸解決以下優化問題:
對於每個輸入值 ,它會生成一個值 ,使得 增加(但不嚴格),即 。這是由 PAVA 完成的。該解決方案由池或塊組成,即 的相鄰元素,例如 和 都具有相同的值。
最有趣的是,如果平方損失被廣泛的 Bregman 函數替換,那麽解決方案保持不變,Bregman 函數是嚴格一致的均值評分函數的獨特類別,請參閱 [2] 和其中的參考文獻。
根據[1],PAVA 的實現版本的計算複雜度為 O(N),輸入大小為 N。
參考:
[1] (1,2)布辛,F. M. T. A. (2022)。單調回歸:簡單快速的 O(n) PAVA 實現。統計軟件雜誌,代碼片段,102(1), 1-25。 DOI:10.18637/jss.v102.c01
[2]Jordan, A.I.、Mühlemann, A. 和 Ziegel, J.F. 說明可識別泛函的等滲回歸問題的最優解。安研究所統計數學 74, 489-514 (2022)。 DOI:10.1007/s10463-021-00808-0
例子:
此示例表明
isotonic_regression
確實解決了約束優化問題。>>> import numpy as np >>> from scipy.optimize import isotonic_regression, minimize >>> y = [1.5, 1.0, 4.0, 6.0, 5.7, 5.0, 7.8, 9.0, 7.5, 9.5, 9.0] >>> def objective(yhat, y): ... return np.sum((yhat - y)**2) >>> def constraint(yhat, y): ... # This is for a monotonically increasing regression. ... return np.diff(yhat) >>> result = minimize(objective, x0=y, args=(y,), ... constraints=[{'type': 'ineq', ... 'fun': lambda x: constraint(x, y)}]) >>> result.x array([1.25 , 1.25 , 4. , 5.56666667, 5.56666667, 5.56666667, 7.8 , 8.25 , 8.25 , 9.25 , 9.25 ]) >>> result = isotonic_regression(y) >>> result.x array([1.25 , 1.25 , 4. , 5.56666667, 5.56666667, 5.56666667, 7.8 , 8.25 , 8.25 , 9.25 , 9.25 ])
與調用
minimize
相比,isotonic_regression
的一大優點是它更加用戶友好,即不需要定義目標函數和約束函數,並且速度快了幾個數量級。在商用硬件上(2023 年),對於長度為 1000 的正態分布輸入 y,最小化器大約需要 4 秒,而isotonic_regression
大約需要 200 微秒。
相關用法
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.milp用法及代碼示例
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.newton用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
- Python SciPy optimize.fixed_point用法及代碼示例
- Python SciPy optimize.rosen_hess用法及代碼示例
- Python SciPy optimize.nnls用法及代碼示例
- Python SciPy optimize.broyden1用法及代碼示例
- Python SciPy optimize.broyden2用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.isotonic_regression。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。