解决超定约束系统

时间:2011-08-19 07:26:53

标签: matlab algebra numerical-methods least-squares

我有n个实数变量(不知道,不关心),让我们称之为X[n]。 我之间也有m >> n个关系让我们称之为R[m],格式为:

X[i] = alpha*X[j]alpha是一个非零正实数,ij是不同的,但(i, j)对不一定是唯一的(即可以是具有不同α因子的相同变量之间的两个关系)

我要做的是找到一组alpha个参数,以最小二乘方的方式解决超定系统。理想的解决方案是最小化每个方程参数与其选择值之间的差的平方和,但我对以下近似值感到满意:

如果我将m个方程转换为n个未知数的超定系统,任何基于伪逆的数值解算器都会给我一个明显的解(全零)。所以我目前所做的是在混合中添加另一个方程,x[0] = 1(实际上任何常数都会这样做)并使用Moore-Penrose伪逆在最小二乘意义上求解生成的系统。虽然这会尝试最小化(x[0] - 1)^2x[i] - alpha*x[j]的平方和的总和,但我发现它对我的问题是一个良好的,数值稳定的近似值。这是一个例子:

a = 1
a = 2*b
b = 3*c
a = 5*c

在Octave:

A = [
  1  0  0;
  1 -2  0;
  0  1 -3;
  1  0 -5;
]

B = [1; 0; 0; 0]

C = pinv(A) * B or better yet:
C = pinv(A)(:,1)

这会产生abc的值:[0.99383; 0.51235; 0.19136] 这给了我以下(合理的)关系:

a = 1.9398*b
b = 2.6774*c
a = 5.1935*c

所以现在我需要在C / C ++ / Java中实现它,我有以下问题:

有没有更快的方法来解决我的问题,还是我在正确的轨道上生成超定系统并计算伪逆?

我目前的解决方案需要一个奇异值分解和三个矩阵乘法,这有点多考虑m可以是5000甚至10000.是否有更快的方法来计算伪逆(实际上,我只需要鉴于矩阵的稀疏性(每行包含两个非零值,其中一个总是一个而另一个总是负的),它的第一列,而不是整个矩阵,假设B为零,除了第一行) )

您建议使用哪些数学库? LAPACK好吗?

我也对任何其他建议持开放态度,只要它们在数值上稳定且渐近快速(假设k*n^2,其中k可能很大)。

2 个答案:

答案 0 :(得分:4)

你的问题不合适。如果将问题视为n个变量的函数(差值的最小二乘),则该函数只有一个全局最小超平面。

除非您将其中一个变量修改为非零,否则全局最小值将始终为零,或者以其他方式减少函数域。

如果你想要的是解超平面的参数化,你可以从Moore-Penrose Pseudo-Inverse得到它 http://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse并查看有关获取所有解决方案的部分。

(请注意我在技术上不正确的方式使用了“hyperplane”这个词。我的意思是你的参数空间的“扁平”无界子集......一条线,一个平面,一个可以由一个或多个参数化的东西更多的向量。由于某种原因,我找不到这些对象的通用名词)

答案 1 :(得分:3)

SVD方法在数值上非常稳定但不是很快。如果您使用SVD,那么LAPACK是一个很好的库。如果它只是一次性计算,那么它可能足够快。

如果你需要一个快得多的算法,你可能不得不牺牲稳定性。一种可能性是使用QR分解。您必须阅读此内容以查看详细信息,但部分原因如下。如果AP = QR(其中P是置换矩阵,Q是正交矩阵,R是三角矩阵)是A的经济QR分解,则等式AX = B变为QRP ^ { - 1} X = B解决方案是X = PR ^ { - 1} Q ^ T B.以下Octave代码使用与代码中相同的A和B来说明这一点。

[Q,R,P] = qr(A,0)
C(P) = R \ (Q' * B)

关于这一点的好处是你可以通过稀疏的QR分解来利用A的稀疏性。有关qr函数的Octave帮助有一些解释,但它不会立即对我有用。

更快(但也更不稳定)是使用正规方程:如果AX = B则A ^ TAX = A ^ T B.矩阵A ^ TA是(希望)满秩的方阵,所以您可以将任何求解器用于线性方程。八度代码:

C = (A' * A) \ (A' * B)

同样,在这种方法中可以利用稀疏性。有许多方法和库可用于解决稀疏线性系统;一个受欢迎的似乎是UMFPACK

稍后添加:我对此字段的了解不够了解。整本书都写在这上面。也许QR的速度快3或5倍,SVD和正常方程再快两倍。对数值稳定性的影响取决于你的矩阵A.稀疏算法可以更快(比如m因子),但它们的计算成本和数值稳定性在很大程度上取决于问题,有时候还不太清楚。< / p>

在您的使用案例中,我的建议是尝试使用SVD计算解决方案,看看它需要多长时间,如果这是可以接受的,那么只需使用它(我想这对于n = 1000来说大约需要一分钟) M = 10000)。如果你想进一步研究它,也可以尝试QR和正规方程,看看它们的速度和准确度是多少;如果他们提供与SVD大致相同的解决方案,那么您可以非常自信他们的准确性足以达到您的目的。只有当这些都太慢并且您愿意花一些时间进入它时,请查看稀疏算法。