Genel bir matrisin en büyük özdeğerini hesaplamanın en hızlı yolu nedir?


27

EDIT: Herhangi bir özdeğerin büyüklüğü bir veya daha fazla olup olmadığını test ediyorum.

Büyük, seyrek, simetrik olmayan bir matrisin en büyük mutlak özdeğerini bulmam gerekiyor.

eigen()Tüm özdeğerleri bulmak için EISPACK veya LAPACK'den QR algo kullanan R işlevini kullanıyorum ve sonra abs()mutlak değerleri elde etmek için kullanıyorum . Ancak, daha hızlı yapmam gerekiyor.

Ayrıca ARPACK arayüzünü igraphR paketinde kullanmayı da denedim . Ancak, benim matrislerimden biri için bir hata verdi.

Son uygulamaya R'den erişilebilmelidir.

Muhtemelen aynı büyüklükte birden fazla özdeğer olacaktır.

Önerin var mı?

EDIT: Doğruluk sadece olması gereken 1e-11. "Tipik" bir matris şu ana kadar . Bunun üzerine bir QR faktoringi yapabildim. Ancak, daha büyük olanlara da sahip olmak mümkündür. Şu anda Arnoldi algoritması hakkında okumaya başladım. Lanczsos ile ilgili olduğunu biliyorum.386×386

EDIT2: Eğer "test ettiğim" çoklu matrislerim varsa ve değişmeyen büyük bir alt matris olduğunu biliyorum. Yoksaymak / silmek mümkün mü?


Cevabımı burada görün: scicomp.stackexchange.com/a/1679/979 . Bu güncel bir araştırma konusudur ve mevcut yöntemler Lanczos'tan daha iyisini yapabilir. Tekil değerlerin hesaplanması sorunu, özdeğerlerin hesaplanması sorununa eşittir.
dranxo

2
400x400'lük matris! = Büyük. Ayrıca, "muhtemelen aynı büyüklükte birden fazla özdeğer olacak" ise ne anlama geliyor? Numpy diyarında: linalg.eig (random.normal (size = (400.400))) yaklaşık yarım saniye sürer. Bu çok mu yavaş?
meawoppl

@meawoppl evet yarım saniye çok yavaş. Bunun nedeni, bu hesaplamayı birçok kez yapan başka bir algonun parçası olmasıdır.
güç

1
@power gotcah. Özvektör için bir yaklaşımınız var mı? yani, son çözüme benzer bir olasılık var mı, yoksa yapısı hakkında eğitimli bir tahmin yapabilir misiniz?
meawoppl

Yanıtlar:


14

Matrisinizin boyutuna, büyük vakalarda da seyrek olup olmadığına ve elde etmek istediğiniz hassasiyete bağlıdır.

Matrisiniz tek bir faktörleşmeye izin veremeyecek kadar büyükse ve yüksek hassasiyete ihtiyacınız varsa, Lanczsos algoritması muhtemelen en hızlı yoldur. Simetrik olmayan durumda, sayısal olarak dengesiz olan Arnoldi algoritmasına ihtiyaç vardır, bu nedenle bir uygulamanın bunu ele alması gerekir (tedavisi biraz gariptir).

Sorununuzda durum böyle değilse, sorunuzla ilgili daha ayrıntılı bilgi verin. Sonra bu cevaba bir yorum ekleyin, ben de güncelleyeceğim.

Düzenleme: [Bu en eski özdeğer için asling, sorunun eski sürümü içindi.] Matrisiniz küçük ve görünüşte yoğun olduğu için, bir başlangıç ​​kullanarak Arnoldi yinelemesini B = (IA) ^ {- 1} 'de yapardım. IA'nın üçgensel çarpanlara ayrılmasının B ile ucuz çarpımına sahip olmasına izin verdim (Veya açık bir ters hesaplayın, ancak bu faktoringin 3 katıdır.) B'nin negatif bir özdeğerine sahip olup olmadığını test etmek istersiniz. A yerine B ile çalışmak, negatif özdeğerlerin birbirinden çok daha iyi ayrıldığından, eğer varsa, hızlı bir şekilde birleşmelisiniz.

Ama probleminin nereden geldiğini merak ediyorum. Simetrik olmayan matrisler genellikle karmaşık özdeğerlere sahiptir, bu nedenle '' en büyük '' bile iyi tanımlanmamıştır. Bu nedenle, sorununuz hakkında daha fazla bilgi sahibi olmalısınız, bu daha hızlı ve / veya daha güvenilir bir şekilde nasıl çözüleceğini önermede yardımcı olabilir.

Düzen2: Arnoldi ile belirli bir ilgi alt kümesini elde etmek zor . Kesinlikle en büyük özdeğerleri güvenilir bir şekilde elde etmek için, orijinal matrisi kullanarak alt alan boyutu eşleştiren veya büyüklüğü 1 veya daha büyük olması beklenen özdeğer sayısını aşan alt alan yinelemesini yaparsınız. Küçük matrislerde, bu QR algoritmasından daha yavaş olacaktır, ancak büyük matrislerde çok daha hızlı olacaktır.


En büyük özdeğerin 1'den büyük olup olmadığını test etmem gerekiyor. Doğruluk sadece 1e-11 olması gerekiyor. "Tipik" bir matris şu ana kadar 386 x 386 oldu. Üzerinde bir QR faktoringi yapabildim. Ancak, daha büyük olanlara da sahip olmak mümkündür. Şu anda Arnoldi algoritması hakkında okumaya başladım. Lanczsos ile ilgili olduğunu biliyorum.
güç

Bu bilgi sizin sorunuza aittir - lütfen lütfen onu düzenleyin ve daha fazla bilgi ekleyin (özdeğerler neden gerçek? Veya en büyükleri ne anlama geliyor?) - cevabımın düzenlemesini görün.
Arnold Neumaier,

kendimi açıkça açıklamadığım için özür dilerim. Ayrıca, özdeğerlerin karmaşık olduğunu açıkça söylemedim. Herhangi bir özdeğerin büyüklüğünün bir veya daha büyük olup olmadığını test ediyorum.
güç

1
Bu daha mantıklı geliyor, ama şimdi ile olan tarifim yalnızca, özdeğer gerçekten gerçekte> 1 ise işe yarar. Öte yandan, yeni bilgi muhtemelen çok az seçeneğiniz olduğunu ancak tüm özdeğerleri hesapladığınızı gösterir. - Ekstra bilgileri iletmek için lütfen sorunuzu güncelleyin! (IA)1
Arnold Neumaier


7

Güç Yineleme mesela (veya Güç Yöntemi) Dan tarif ettiğidir, her zaman, yakınsama gerektiğini de olsa oranda.|λn1/λn|

Eğer yakın olmaktır , yavaş olacak, ama kullanabileceğiniz ekstrapolasyon o çevrede alır. Bu karmaşık görünebilir, ancak sözde kodda bir uygulama kağıtta verilmiştir. λ nλn1λn


1
ya eğer | λ (n − 1) | = | λ (n) | ?
güç

Güç, ardından normal Güç İterasyonu birleşmez. Ekstrapolasyon yöntemlerinin farklı özdeğerler arasındaki farkı ne kadar iyi ayırt edeceğini bilmiyorum, bunun için kağıdı okumak zorunda kalacaksınız.
Pedro

2
@power:, sonra güç yinelemesi hala doğru özdeğere yakınlaşacaktır. Yine de ilgilenmediğiniz ortaya çıkan özvektör, ve karşılık gelen özvektörlerin doğrusal bir birleşimi olacaktır . λ n λ n - 1|λn1|=|λn|λnλn1
Pedro

Bunu destekleyen bir akademik makaleye veya kitaba referansınız var mı? Ayrıca, \ lambda_ {n} karmaşıksa ne olur?
güç

5
Maksimum modülün birkaç farklı özdeğerleri varsa, güç yinelemesi yalnızca istisnai koşullar altında birleşir. Genellikle biraz öngörülemeyen bir şekilde salınır.
Arnold Neumaier

5

Son zamanlarda bu konuda bazı iyi araştırmalar olmuştur. Yeni yaklaşımlar, en büyük özdeğerlerde iyi bir doğruluk elde etmek için sadece birkaç matrisinizi gerektiren "randomize algoritmalar" kullanır. Bu, yüksek doğruluğa ulaşmak için birkaç matris-vektör çarpımı gerektiren güç yinelemelerinin aksinedir.

Yeni araştırma hakkında daha fazla bilgiyi burada bulabilirsiniz:

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

Bu kod sizin için yapacak:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

Seçtiğiniz dil orada değilse, kendi randomize SVD'nizi kolayca kolayca kullanabilirsiniz; bu yalnızca bir hazır SVD'ye yapılan çağrıdan sonra bir matris vektör çarpımını gerektirir.


4

Burada maksimum özdeğerleri hesaplayan Jacobi-Davidson algoritmasına algoritmik bir giriş bulacaksınız.

Bu yazıda matematiksel yönler araştırılmıştır. JD, genel (gerçek veya karmaşık) matrislere izin verir ve özdeğer aralıklarını hesaplamak için kullanılabilir.

Burada JDQR ve JDQZ gibi çeşitli kütüphane uygulamalarını bulabilirsiniz (R'den bağlantı vermeniz gereken bir C arayüzü dahil).


Jacobi-Davidson yönteminin gerçek, genel bir matris için çalıştığını açıkça belirten bir literatür bulamadım.
güç

Her makale açıkça bir kısıtlama belirtmediği sürece ve yakınsama argümanı önemli olmayan kısıtlamaya dayanır.
Deathbreath

İşte JD'nin başka bir açıklaması. Ele alınan matrisler tamamen geneldir. Özel bir yapı kullanılmaz ve Hermitian matrislerine özgü sonuçlar karşılaştırılmaz ve karşılaştırılmaz, örneğin genel matrisler için yakınsama karesel, ancak Hermitian matrisler için kübiktir.
Deathbreath

Bunun için teşekkürler. Genel bir matris için herhangi bir C kodu bulamıyorum, bu yüzden kendime yazmak zorunda kalacağım. Algoritmalara olan bağlantılar sadece Hermetian matrisleri içindir.
güç,

1
Ayrıca, literatürde standart QR uygulamalarının gerçek, genel bir matris için birleştiğini belirten bir sonuç bulamayacağınızı - bunun açık bir problem olduğunu ve aslında çok uzun zaman önce LAPACK'ta QR kodu için bir karşı örnek bulunmadığını belirten bir sonuç bulamayacaksınız.
Federico Poloni

2

Orijinal yazınızda şöyle diyorsunuz:

“ARPACK arayüzünü igraph R paketinde de kullanmaya çalıştım. Ancak matrislerimden biri için bir hata verdi.”

Hata hakkında daha fazla bilgi edinmek isterdim. Bu matrisi bir yerde halka açık hale getirebilirseniz, ARPACK'i denemek isterim.

Yukarıda okuduklarımdan yola çıkarak, ARPACK'in seyrek bir matrisin en büyük (veya en büyük birkaçının) özdeğerlerini çıkarmak için çok iyi bir iş çıkarmasını beklerdim. Daha açık olmak gerekirse, Arnoldi yöntemlerinin bu durum için iyi çalışmasını beklerdim ve elbette ARPACK'in dayandığı şeydi.

İlgilenilen bölgede yakın aralıklı özdeğerler olduğunda güç yönteminin yavaş yakınsaması yukarıda belirtilmiştir. Arnoldi bunu, güç yönteminde olanın yerine birkaç vektörle yineleyerek geliştirir.


İşimi arkadan bulabiliyor muyum o zaman. Bunun üzerinde bir yıl önce çalıştım.
güç

0

Bu en hızlı yol değil , fakat makul hızlı bir yol, matrisle (başlangıçta rastgele) bir vektöre tekrar tekrar basmak ve ardından her birkaç adımda bir normalleştirmek. Sonunda en büyük özvektöre yakınlaşacak ve tek bir adım için normdaki kazanç, ilişkili özdeğerdir.

Bu, en büyük özdeğer, diğer özdeğerlerden büyük ölçüde büyük olduğunda en iyi şekilde çalışır. Başka bir özdeğer yakın büyük büyüklük bakımından ise, bu birleşmede bir süre alacaktır ve bunun olmadığını belirlemek zor olabilir etmiştir birleşti.


1
Ancak teşekkürler Dan,: Matrislerimde, diğer özdeğerlerin bazıları en büyüğü ile aynı (aynı değilse) büyüklükte olacaktır. Yönteminiz Power Iteration ve Rayleigh Quotient Iteration ile aynı mı? Batterson ve Smillie (1990) bazı simetrik olmayan matrisler için Rayleigh Quotient Iteration'ın birleşmeyeceğini yazmaktadır. Batterson, S. Smillie, J (1990) "simetrik olmayan Matrisler Rayleigh Bölüm Yineleme", Hesaplama, cilt 55, num 191, P 169 Matematik - 178
güç

Diğer özdeğerler en büyüğü ile aynı büyüklükte ise ... o zaman bu değerler de "en büyüğü" değil mi?
ely

@EMS: Onlar hala "en büyük özdeğerler" olacaktı, ama birden fazla kişinin varlığı hala yakınsamayı öldürecekti.
Dan

Sadece hangi özdeğerle birleşmek istediğinizi merak ediyorum. Rayleigh katsayısı / Güç yöntemi gibi şeyler, belirgin bir en büyük öz değer olduğunda kastedilmektedir. Sorunuz en büyük özdeğerini bulmak istiyor, ancak daha sonra probleminiz için iyi tanımlanmamış gibi görünüyor. Ben sadece yazı başlığı tarafından yanıldım.
ely

-1

R paketi RARPACK benim için çalışıyor. Ve seyrek doğrusal cebir için standart bir paket olan ARPACK için bir arayüz olduğu için çok hızlı görünüyor (birkaç özdeğer ve özvektör hesaplamak anlamına geliyor).


SciComp'a Hoşgeldiniz! Sorunun belirttiği gibi, ARPACK OP için çalışmıyor, bu yüzden bu cevap gerçekten yardımcı değil.
Christian Clason

@HoangDT Bu soru bir yarışmacı rPARPACK
güç
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.