私はn
実数変数を持っています(わからない、本当に気にしないでください)、それらを呼びましょうX[n]
。私はm >> n
それらの間に関係もあります。それらR[m]
を次の形式で呼びましょう。
X[i] = alpha*X[j]
は、alpha
ゼロ以外の正の実数でi
ありj
、別個のものですが、(i, j)
ペアは必ずしも一意ではありません(つまり、異なるアルファ係数を持つ同じ変数間に2つの関係が存在する可能性があります)
私がやろうとしているのは、alpha
最小二乗の意味で過剰決定系を解決する一連のパラメーターを見つけることです。理想的な解決策は、各方程式パラメーターとその選択された値の間の差の2乗和を最小化することですが、次の近似に満足しています。
m個の方程式をn個の未知数の過剰決定系に変換すると、疑似逆行列ベースの数値ソルバーは明白な解(すべてゼロ)を与えます。したがって、現在私が行っているのは、別の方程式をミックスに追加しx[0] = 1
(実際には任意の定数で可能です)、ムーア・ペンローズ疑似逆行列を使用して、生成されたシステムを最小二乗の意味で解きます。(x[0] - 1)^2
これはの合計との二乗和を最小化しようとしx[i] - alpha*x[j]
ますが、これは私の問題に対する適切で数値的に安定した近似であることがわかります。次に例を示します。
a = 1
a = 2*b
b = 3*c
a = 5*c
オクターブ:
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)
これにより、、、の値が得られます。これによりa
、
次の(合理的な)関係が得られます。b
c
[0.99383; 0.51235; 0.19136]
a = 1.9398*b
b = 2.6774*c
a = 5.1935*c
したがって、今はこれをC / C ++ / Javaで実装する必要があり、次の質問があります。
問題を解決するためのより高速な方法はありますか、それとも過剰決定系を生成して疑似逆行列を計算することで正しい方向に進んでいますか?
私の現在のソリューションでは、特異値分解と3つの行列乗算が必要です。これは、5000または10000になる可能性があることを少し考慮していm
ます。疑似逆行列を計算するより高速な方法はありますか(実際には、最初の列のみが必要であり、行列のスパース性を考慮して、Bがゼロである場合の行列全体(最初の行を除く)(各行にはゼロ以外の値が2つ含まれ、一方は常に1で、もう一方は常に負です)
このためにどの数学ライブラリを使用することをお勧めしますか?LAPACKは大丈夫ですか?
数値的に安定していて漸近的に高速であるという条件で、他の提案も受け入れます(たとえばk*n^2
、k
大きくなる可能性があります)。