【问题标题】:Constraint of Ordinary Least Squares using Scipy / Numpy使用 Scipy / Numpy 约束普通最小二乘
【发布时间】:2019-07-19 21:30:13
【问题描述】:

我正在尝试求解线性方程组:

min || Ax - B ||^2
    for t in [0,1]

such that the coefficients x in this equation satisfy the linear equation:

C x = D

该系统尝试拟合一组多项式以在 t 的范围内逼近函数 F(t)。

  • A 是一个矩阵,表示多项式集合在 t 值范围内的映射
  • x 是一个系数向量(我想要的),对应于应用于 A 中的每个多项式的权重
  • B 是表示 F(t) 值的向量,
  • C 是矩阵,D 是向量,它们共同表示该系统的系数的边界条件

这是一个使用constraint of ordinary least squares 求解线性方程的案例。

虽然有已知的封闭形式解决方案,例如Karush-Kuhn-Tucker 我正在scipy / numpy 中寻找可用于解决此问题的路由。

研究显示scipy.optimize模块,其中包括如下功能:

scipy.optimize.least_squares.

scipy.optimize.nnls.

scipy.optimize.lsq_linear.

以上建议来自this questionthis question

但是这些没有适用于其他一些线性方程的约束的条件。我可以在 scipynumpy 中使用什么来做到这一点?

【问题讨论】:

  • 什么是变量t
  • @jf328 已编辑 q
  • 分析解决方案应该是第一个去的。如果您绝对想使用 scipy 例程,可能会将约束作为目标中的惩罚。 A2 = [A;m*C], B2 = [B;m*D] 并用大 m 解决 OLS ||A2.x-B2||^2
  • 只需使用 scipy.optimize.minimize (并提供您自己的梯度以确保稳定性)。如果 [0,1] 中的 t 是变量绑定,我看不到这里多次提到的封闭式解决方案。

标签: python numpy scipy linear-algebra mathematical-optimization


【解决方案1】:

为此,您可以使用scipy.minimize(method='SLSQP')。文档是here

您可以将等式约束定义为带有签名的可调用函数:

def cons1(x):
    return sum(D - C*x)

SLSQP essential 使用约束然后驱动您的优化问题。请注意,这是基于梯度的体面,因此您很可能会找到高维问题的局部最小值。

另一个选项是scipy.minimize(method=’trust-constr’),文档是here。这些方法是在 python 中原生实现的,因此可以通过它访问源代码和修改。

如果你有一个平滑的单调或上下文函数,根据我的经验SLSQP 应该足够了。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2018-05-16
    • 2013-08-06
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2015-08-01
    • 2021-08-14
    • 2013-12-03
    相关资源
    最近更新 更多