scipy.optimize.

isotonic_regression#

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

非参数保序回归。

通过池相邻违规者算法(PAVA)计算出一个(不严格)单调递增的数组 x,其长度与 y 相同,参见 [1]。更多详情请参阅注释部分。

参数:
y(N,) 数组类

响应变量。

权重(N,) 数组类 或 None

案例权重。

增加布尔

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

返回:
res优化结果

优化结果表示为一个 OptimizeResult 对象。重要的属性包括:

  • x: 等张回归解,即一个与 y 长度相同的递增(或递减)数组,其元素范围从 min(y) 到 max(y)。

  • weights : 包含每个块(或池)B的案例权重总和的数组。

  • blocks: 长度为 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{受限于 } x_i \leq x_j \text{ 当 } i \leq j \,.\]

对于每个输入值 \(y_i\),它生成一个值 \(x_i\),使得 \(x\) 是递增的(但不严格),即 \(x_i \leq x_{i+1}\)。这是通过PAVA实现的。解决方案由池或块组成,即 \(x\) 的相邻元素,例如 \(x_i\)\(x_{i+1}\),它们都具有相同的值。

最有趣的是,如果将平方损失替换为广泛类别的Bregman函数,解决方案保持不变,这些Bregman函数是唯一严格一致的均值评分函数类别,参见[Rddcb72c1ad4d-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微秒。