行列連鎖の乗算とべき乗


13

それぞれ1000 × 22 × 1000の次元の2つの行列BがありA B 5000を計算する場合、最初に式をA B A 4999 Bとして書き換えてから、A B1000 × 1000の次元ですが、B A2 × 2の次元であるため、数値的に評価します。AB1000×22×1000(AB)5000A(BA)4999BAB1000×1000BA2×2

この問題の一般化されたバージョンを解決したいと思います。以下を含む式を最適化するための合理的な効率的なアルゴリズム(ブルートフォースではない)はありますか?

  • 既知の次元の自由行列変数
  • 任意の部分式の積
  • 自然な力に引き上げられた任意の部分式

...フリーマトリックス変数を具体的なマトリックス値で置き換えた後、数値的に評価するのに必要な作業が最小になるようにするには?

行列チェーン乗算問題は私の問題の特殊なケースです。


編集:

これは暫定的な答えです。直感的には正しいようですが、それが正しいことを証明するものはありません。それが正しいことが判明した場合でも、証明に興味があります。(もちろん、正しくない場合は修正してください。)

などのべき乗されたすべての積について、因子のすべての巡回置換を検討します。(A1A2Ak)n

  • (A1A2Ak)n
  • A1(A2AkA1)n1A2Ak
  • A1A2(A3AkA1A2)n1A3Ak
  • ...
  • A1A2Ak1(AkA1A2Ak1)n1Ak

...再帰的に。各指数は(明らかに)二乗による指数を使用して計算され、他のすべての積は、マトリックスチェーン乗算アルゴリズムによって返される最適な次数を使用して計算されます。


編集:

私の以前の編集で概説したアイデアは、まだいくらか最適ではありません。二乗アルゴリズムによるべき乗は、実際にはまたはA n Kの形式の式を評価します。ここで、Kは必ずしも単位行列ではありません。しかし、私のアルゴリズムでは、単位行列と等しくないKを使用してアルゴリズムを二乗することにより指数を使用する可能性を考慮していません。KAnAnKKK


@ gnasher729:申し訳ありませんが、もっと明確にしておくべきでした。私はすべての可能性を総当たりしたくないのですが、まったく同じ理由で、総当たりによるマトリックスチェーンの乗算を解決したくありません。私はそれに応じて質問を編集しました。
1

を巧妙に因数分解した後でも、A B A 2 2 1249 + 1 + 1 Bとして因数分解するほうが賢明です。重要なのは、高速累乗を行うには、おそらくマトリックスチェーン乗算と他の標準アルゴリズムを組み合わせる必要があるということです。A(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul 2017年

@Billiska:確かに、それがまさに私がやりたいことです。マトリックスチェーンの乗算とべき乗を2乗して、結合された問題の単一のアルゴリズムに結合します。しかし、いくつかの厄介な問題があります。与えられた場合、アルゴリズムがA B A B n 2 A BA B A B A n 3 B A Bなどをさらに試行しないようにするにはどうすればよいですか?A(BA)n1BAB(AB)n2ABABA(BA)n3BAB
ピョン

行列のべき乗の基底を固有ベクトルに変更し、すべての行列が1の累乗を持っている場合、行列チェーン乗算を使用できます。
Deep Joshi 2017

@DeepJoshi申し訳ありませんが、私はあなたのコメントを簡潔にしています。私が正しくあなたの考えを理解している場合の固有空間の寸法ので、しかし、私は、それが一般的なケースでは動作しません怖い行列の必要性がにならないのn。言い換えれば、すべてのベクトルが固有ベクトルの線形結合として表現できるとは限りません。n×nn
ピョン

回答:


3

免責事項:次の方法は、最適であることが厳密に証明されていません。非公式の証拠が提供されます。

問題は、製品の2乗を考慮すると、最も効率的な順序を見つけることに帰着します。

(ABC)50(ABC)2ABCABCABC

ABCABC

A(B(CA))BCA(B(CA))49BC


(A1A2An)m(A1A2An)2
(A1A2An)2
GA1A2Gm1An


(AB)nABX×YY×XAB

X×Y
Y×X
Y×Y
X×X

X<YYX

X<Y
ABX×XAB(AB)n

YX
BAY×YABA(BA)n1B

ABAB

より多くの行列を使用すると、引数は似ています。おそらく帰納的証明は可能ですか?一般的な考え方は、正方形のMCMを解くと、すべての関連する行列を考慮した操作に最適なサイズが見つかるということです。

ケーススタディ:

julia> a=rand(1000,2);
julia> b=rand(2,1000);
julia> c=rand(1000,100);
julia> d=rand(100,1000);
julia> e=rand(1000,1000);

julia> @time (a*b*c*d*e)^30;
  0.395549 seconds (26 allocations: 77.058 MB, 1.58% gc time)

# Here I use an MCM solver to find out the optimal ordering for the square problem
julia> Using MatrixChainMultiply
julia> matrixchainmultiply("SOLVE_SQUARED", a,b,c,d,e,a,b,c,d,e)
Operation: SOLVE_SQUARED(A...) = begin  # none, line 1:
    A[1] * (((((A[2] * A[3]) * (A[4] * (A[5] * A[6]))) * (A[7] * A[8])) * A[9]) * A[10])
  end
Cost: 6800800

# Use the ordering found, note that exponentiation is applied to the group of 5 elements
julia> @time a*(((((b*c)*(d*(e*a)))^29*(b*c))*d)*e);
  0.009990 seconds (21 allocations: 7.684 MB)

# I also tried using the MCM for solving the problem directly
julia> @time matrixchainmultiply([30 instances of a,b,c,d,e]);
  0.094490 seconds (4.02 k allocations: 9.073 MB)

1
(ABC)2

ABCABC(ABC)n(ABC)nA(BCA)n1BCAB(CAB)n1C

@DavidRicherbyは、使用の追加の非公式な証明ですか?
matteyas

@matteyas:それは多かれ少なかれ、私の質問の最初の編集で言ったことですよね?
pyon

ABCABC

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.