scipy.optimize.

isotonic_regression#

scipy.optimize.isotonic_regression(y, *, weights=None, increasing=True)[源代码]#

非参数单调回归。

一个(严格来说)与 y 长度相同的单调递增数组 x 由池邻近违例算法 (PAVA) 计算得到,请参见 [1]。更多详细内容,请参阅备注部分。

参数:
y(N,) 类数组

响应变量。

weights(N,) 类数组或 None

情况权重。

increasingbool

如果为 True,则拟合单调递增的回归,即单调回归。如果为 False,则拟合单调递减的回归,即反单调回归。默认值为 True。

返回:
resOptimizationResult

OptimizeResult 对象表示的优化结果。重要的属性是

  • x:单调回归解,即一个与 y 长度相同、元素范围介于 min(y) 和 max(y) 之间的递增(或递减)数组。

  • 权重:对于每个块(或池)B,用案例权重之和组成的数组。

  • : 长度为 B+1 的数组,其中包含每个块(或池)B 的起始位置索引。第 j 块由 x[blocks[j]:blocks[j+1]] 给出,其中所有值相同。

备注

给定数据 \(y\) 和案例权重 \(w\),等值回归求解以下优化问题:

\[\operatorname{argmin}_{x_i} \sum_i w_i (y_i - x_i)^2 \quad \text{subject to } x_i \leq x_j \text{ whenever } i \leq j \,.\]

对于每个输入值 \(y_i\),它都会生成一个值 \(x_i\),使得 \(x\) 增加(但不是严格增加),即 \(x_i \leq x_{i+1}\)。PAVA 可实现这种情况。解决方案包含池或块,即 \(x\) 的相邻元素,例如 \(x_i\)\(x_{i+1}\),所有元素的值均相同。

最有趣的是,如果将平方损失替换为 Bregeman 函数的广泛类别,解决方案将保持不变,该函数类别是均值的唯一严格一致评分函数类别,请参阅 [2] 及其引文内容。

根据 [1],已实现 PAVA 的版本具有 O(N) 的计算复杂度,输入大小为 N。

参考内容

[1] (1,2)

Busing, 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. 描述针对可识别泛函的等值回归问题的最优解。Ann Inst Stat Math 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 微秒。