3

谁能帮我写一个python脚本?问题如下所述。

我需要对一些线性方程进行等式约束线性最小二乘拟合。对于特定的线性方程,矩阵方程类似于 [Y] {nX1}=[X] {nXm}[P]_{mX1},其中 Y 和 P 是向量,X 是矩阵,n, m 是矩阵。此外,对 P 有一个等式约束,即 Sum(P(i))=0.0。有谁知道我该如何着手解决这个问题?python的哪个函数适合这个?我很少看到关于 scipy.optimize.fmin_slsqp() 函数的讨论,但是这个函数的使用不是很简单。

但是,我可以通过使用 numpy. 这是小脚本。

import numpy as np
from numpy import matrix
from numpy import arange,array,ones,linalg
x = np.random.randn(500,3)
A=matrix([[3.0, 4.0, -7.0],[4.0, -5.0, 1.0],[3.0, 2.0, -5.0]])
y=A*x.T
w=linalg.lstsq(x,y.T)[0]
print w.T

在这里,我生成了一个随机向量 x,然后通过 A 和 xT 的矩阵乘法生成向量 y 然后我使用 x 和 y 向量并评估矩阵 A 的元素。上面的脚本完美地再现了矩阵 A。这给了我信心lsf 有效。但是,它只是最小二乘拟合。没有限制。

另一件事,是否可以将受约束的 lsf 问题转换为不受约束的 lsf 问题。如果是这样,那么我可以使用上面的脚本。拉格朗日乘子法是一种可能的选择。但是,我很难评估我的问题的乘数。这是因为,方程包含大量变量。如果有

顺便说一下,MATLAB 中约束 lsf 的类似函数是 lsqlin。

上周我正在为此苦苦挣扎。请在这方面帮助我。如果您有任何其他建议,那也很棒。

最好的祝愿

4

3 回答 3

3

如果你的问题不是太大,你可以通过求解一个等效的线性系统来解决它。假设您以以下形式编写约束最小二乘问题

min 1/2 |Ax - b|^2
subject to  Bx = c,

在欧几里得范数中(StackOverflow 不支持 MathJax 真的很糟糕!) 1/2 是为了方便起见。上述问题的解 x(假设有一个)等价于求解线性系统

[ I   A  0   ] [ r ]   [ b ]
[ A.T 0  B.T ] [ x ] = [ 0 ]
[ 0   B  0   ] [ y ]   [ c ]

其中零块具有适当的大小,.T表示转置并且I是适当大小的单位矩阵。您正在寻找解决方案向量的中间部分。请注意,上面的矩阵是对称的,但它是不确定的,所以如果你没有任何专门的东西,你将不得不使用 LU 分解来求解系统(没关系,但你可以节省大约一半的工作。)你可以' t 使用 Cholesky。

如果您的问题很大,您也可以使用MINRES解决上述系统,而无需实际组装或分解它。您只需要提供一个LinearOperator使用此矩阵计算产品的 a。

我还发现:https ://gist.github.com/fabianp/915461 (但尚未测试)。

于 2013-12-27T00:42:50.810 回答
3

用于密集矩阵的等式约束线性最小二乘拟合目前在 Python 中可用(Scipy 1.5),可直接调用相关的 LAPACK 例程scipy.linalg.lapack.dgglse。DGGLSE 的 LAPACK 文档在这里

例如,问题的解决方案

min ||A @ x - b||
subject to  C @ x = d

可以使用Python代码获得

from scipy.linalg import lapack

# Define the matrices as usual, then
x = lapack.dgglse(A, C, b, d)[3]
于 2020-07-01T22:56:39.923 回答
0

你可以试试 Golub 和 van Loan 的“矩阵计算”中提到的“权重法”,它是一种只需要设计矩阵的近似方法。

于 2013-08-12T16:50:42.220 回答