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 微秒。