Matris zinciri çarpımı ve üs alma


13

ve boyutlarında iki A ve ve hesaplamak istiyorsanız , ilk önce ifadeyi olarak yeniden yazmak daha etkilidir. çünkü ancak o zaman ve sayısal olarak değerlendirmek boyut taşımaktadır ama boyut taşımaktadır .B2 × 1000 ( A B ) 5000 A ( B A ) 4999 B A B 1000 × 1000 B A 2 × 21000×22×1000(AB)5000A(BA)4999BAB1000x1000Bbir2x2

Bu sorunun genelleştirilmiş bir sürümünü çözmek istiyorum. Aşağıdakileri içeren bir ifadeyi optimize etmek için makul derecede verimli bir algoritma (kaba kuvvet değil) var mı:

  • Bilinen boyutlarda serbest matris değişkenleri
  • Keyfi alt ifadelerin ürünleri
  • Doğal güce yükseltilen keyfi alt ifadeler

... serbest matris değişkenlerini somut matris değerleriyle değiştirdikten sonra nümerik olarak değerlendirmek için en az iş gerektiriyor?

Matris çarpımı sorun benim sorunun özel bir durumudur.


Düzenle:

Bu geçici bir cevap. Benim için sezgisel olarak doğru görünüyor, ancak doğru olduğuna dair hiçbir kanıtım yok. Doğru olduğu ortaya çıkarsa, hala kanıtla ilgileniyorum. (Doğru değilse, elbette, lütfen beni düzeltin.)

Bir güce yükseltilen her ürün için, örneğin, , faktörlerin her döngüsel permütasyonunu göz önünde bulundurun:(bir1bir2...birk)n

  • (bir1bir2...birk)n
  • bir1(bir2...birkbir1)n-1bir2...birk
  • bir1bir2(bir3...birkbir1bir2)n-1bir3...birk
  • ...
  • A1A2Ak1(AkA1A2Ak1)n1Ak

... tekrarlı. Her bir güç, kare (açıkça) kullanılarak üs alma kullanılarak hesaplanacaktır ve diğer tüm ürünler, matris zinciri çarpma algoritması tarafından döndürülen optimum sıra kullanılarak hesaplanacaktır.


Düzenle:

Önceki düzenlememde ana hatlarıyla verilen fikir hala bir miktar uygunsuz. Kareleme algoritması ile üs alma aslında veya biçimindeki ifadeleri değerlendirir , burada zorunlu olarak kimlik matrisi değildir. Ancak algoritmam, ile algoritmayı kimlik matrisine eşit olmayan üs alma ile üs alma olasılığını düşünmüyor.A n K K KKAnAnKKK


@ gnasher729: Üzgünüm, daha açık olmalıydım. Tüm olasılıkları kaba kuvvetle istemiyorum, tam olarak aynı nedenden dolayı matris zinciri çarpımını kaba kuvvetle çözmek istemezsiniz. Soruyu yeni düzenledim.
pyon

Daha zekice faktörü ifadesi sonra Not hala faktörü daha zekice o kadar bir ( B A ) 2 * ( 2 * 1249 + 1 ) + 1 B . Önemli olan nokta, hızlı bir üs alma için matris zinciri çarpımı ve diğer standart algoritma arasında bir karışım yapmanız gerektiğidir. A(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul

@Billiska: Doğrusu, tam olarak yapmak istediğim şey: birleştirilmiş problem için tek bir algoritmaya karelemek suretiyle matris zinciri çarpımını ve üslenmesini birleştirmek. Ancak bazı sinir bozucu sorunlar var. Verilen , ben daha denemekten algoritma önlemek nasıl bir B ( A B ) n - 2 A B , A B A ( B A ) n - 3 B A B vb? A(BA)n1BAB(AB)n2ABABA(BA)n3BAB
pyon

Matris üssü için temeli Eigen vektörüne değiştiririz ve tüm matrisin gücü 1 olduğunda, matris zinciri çarpımını kullanabiliriz.
Derin Joshi

@DeepJoshi Üzgünüm, yorumunuzu oldukça kısa buluyorum. Ben doğru fikir anlarsanız bir ait Aygen boyutları nedeniyle Ama, Bence bu genel durumda iş olmaz korkuyorum matris ihtiyaca yapmayabilir n . Başka bir deyişle, her vektörün özvektörlerin doğrusal bir kombinasyonu olarak ifade edilebileceği her zaman böyle değildir. n×nn
pyon

Yanıtlar:


3

Feragatname: Aşağıdaki yöntemin optimal olduğu kesin olarak kanıtlanmamıştır. Gayri resmi bir kanıt sağlanmıştır.

Ürünün karesi göz önüne alındığında, sorun en verimli siparişi bulmada azalır.

Örneğin, örneğin bakarken, sadece ( A B C ) 2'yi en iyi şekilde çözmemiz gerekir, çünkü bu A B C A B C'ye genişler . A B C'yi tekrar birleştirerek yararlı bir sipariş bilgisi eklenmez . Buradaki sezgi, optimal sıralama sorunu aşağıdan yukarıya çözülebildiğinden, aynı matrisleri kullanan daha fazla elemandan oluşan daha yüksek sıralamalar önemsizdir.(ABC)50(ABC)2ABCABCABC

en iyi sırasını bulmak A B C , Matris Zinciri Çarpma problemini azaltır. Optimal bir sipariş bulduktan sonra, siparişte üçlüye (genellikle n-demet) üs alma uygulayın.ABCABC

Kare için en uygun sipariş ise bir örneğin de, , başlangıç sorununa çözüm bir ( B ( Cı- A ) ) 49 B C .A(B(CA))BCA(B(CA))49BC

Özetle:
1) çözümünde ilk adım çözmektir ( A 1 bir 2bir n ) 2 . 2) Çözme ( A 1 A 2A n ) 2 en iyi Matris Zinciri Çarpma probleminin bir örneği olarak ele alınır. 3) (2) 'deki çözeltiden n-demet sırasını G kullanarak bize (1)' in A 1A'nın bir çeşidi olarak çözümü verecektir.(A1A2An)m(A1A2An)2
(A1A2An)2
G (çözmeden (2) diğer grupların da uygulanması gerektiğini unutmayın).A1A2Gm1An

Resmi olmayan kanıt
İki matris kullanılarak yapılan en basit durum dikkate alındığında, A ve B'nin sırasıyla X × Y ve Y × X boyutlarına sahip olduğuna dikkat çekiyoruz. A ve B kullanan herhangi bir ürün aşağıdaki boyutlardan birine sahiptir:(AB)nABX×YY×XAB

Y × X Y × Y X × XX×Y
Y×X
Y×Y
X×X

Ya sahip veya Y X .X<YYX

Varsayım 1a): A B , X × X boyutuna sahiptir ve bu siparişin aşağıdan yukarıya bir yaklaşımdan optimal olması garanti edilir. A ve B'nin diğer herhangi bir konfigürasyonu eşit derecede iyi veya daha kötüdür. Böylece, sorun optimal olarak çözülmektedir ( A B ) n .X<Y
ABX×XAB(AB)n

Varsayım 1b): B A , Y × Y boyutuna sahiptir . Bu, A ve B içeren tüm ürünler için en uygun sipariştir . Bu nedenle, çözelti en uygun olarak bulunan bir ( B A ) n - 1 B .YX
BAY×YABA(BA)n1B

Bu, kanıtı sonuçlandırıyor ve sadece kare problemi olan bulunan iki sıralamaya baktık .ABAB

Daha fazla matris kullanan argüman benzerdir. Belki endüktif bir kanıt mümkün mü? Genel fikir, kare için MCM'yi çözmenin, dikkate alınan tüm ilgili matrislerle işlemler için en uygun boyutu bulacağıdır.

Vaka Analizi:

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 herhangi bir kullanımın resmi olmayan kanıtı mı?
matteyas

@matteyas: Sorumun ilk düzenlemesinde söylediklerim az çok değil mi?
pyon

birBCbirBC

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.