Çok geniş anlamda, özdeğer veya tekil değer ayrışımlarını hesaplamak için iki yaklaşım vardır. Bir yaklaşım matrisin köşegenleştirilmesidir ve bu esas olarak tüm özdeğer / tekil değer ayrışmasını (bütün özdeğer spektrumu) aynı anda verir, burada bazı genel bakışa bakın: Tekil değer ayrışmasını (SVD) hesaplamak için etkili algoritmalar nelerdir? Alternatif, bir kerede bir (veya birkaç) özvektör veren bir yinelemeli algoritma kullanmaktır. İstenen sayıda özvektör hesaplandıktan sonra tekrarlamalar durdurulabilir.
Özellikle SVD için yinelemeli algoritmalar olduğunu düşünmüyorum. Bunun nedeni, bir matrisi SVD'sini kare simetrik matrisinin öz bileşimi yaparak hesaplayabilmesidirBu nedenle, hangi algoritmaların kesilmiş SVD'yi hesapladığını sormak yerine, hangi yinelemeli algoritmaların özdeğiştirmeyi hesapladığını sormalısınız:B ( n + m ) × ( n + m ) A = ( 0 B B ⊤ 0 ) . budanmış SVD için algoritma ≈ eigendecomposition için yinelemeli bir algoritma .n×mB(n+m)×(n+m)
A=(0B⊤B0).
algorithm for truncated SVD≈iterative algorithm for eigendecomposition.
En basit yinelemeli algoritmaya güç yinelemesi denir ve gerçekten çok basittir:
- Random başlatın .x
- Güncelleme .x←Ax
- Normale.x←x/∥x∥
- Yakınsama olmadığı sürece 2. adıma geçin.
Tüm daha karmaşık algoritmalar sonuçta güç yineleme fikrine dayanır, ancak oldukça karmaşıklaşır. Gerekli matematik Krylov alt uzayları tarafından verilir . Algoritmalar Arnoldi yinelemesi ( kare simetrik olmayan matrisler için), Lanczos yinelemesi (kare simetrik matrisler için) ve bunların varyasyonları, örneğin "örtük olarak yeniden başlatılan Lanczos yöntemi" ve bunun değil.
Bunu, örneğin aşağıdaki ders kitaplarında açıklanmıştır:
- Golub & Van Kredisi, Matris Hesaplamaları
- Trefethen & Bau, Sayısal Lineer Cebir
- Demmel, Uygulamalı Sayısal Lineer Cebir
- Saad, Büyük Özdeğer Problemleri İçin Sayısal Yöntemler
Tüm makul programlama dilleri ve istatistik paketleri (Matlab, R, Python numpy, adını siz koyun) öz / tekil değer ayrışmaları gerçekleştirmek için aynı Fortran kitaplıklarını kullanır. Bunlar LAPACK ve ARPACK . ARPACK, ARnoldi PACKage'in kısaltmasıdır ve hepsi Arnoldi / Lanczos iterasyonlarıyla ilgilidir. Matlab'da SVD için iki işlev vardır: svd
LAPACK aracılığıyla tam ayrıştırma gerçekleştirir ve svds
belirli sayıda tekil vektörü ARPACK üzerinden hesaplar ve aslında eigs
"kare şeklinde" matristeki bir çağrı için bir sargıdır .
Güncelleme
Açıkça bir kare matris ilkini oluşturmadan dikdörtgen bir matris gerçekleştirmek için özel olarak uyarlanmış Lanczos algoritmasının varyantları olduğu ortaya çıkıyor . Buradaki ana terim Lanczos bidiagonalization ; anladığım kadarıyla, Lanczos iterasyonlarının tüm adımlarını üzerinde doğrudan üzerinde hiç inşa etmeden gerçekleştirmek ve böylece yerden ve zamandan tasarruf etmek bir hile .BAABA
Bu yöntemler için de bir Fortran kütüphanesi var, buna PROPACK deniyor :
PROPACK yazılım paketi, büyük ve seyrek veya yapılandırılmış matrislerin tekil değer ayrışmasını hesaplamak için bir dizi fonksiyon içerir. SVD rutinleri, kısmi yeniden dikeyleştirme (BPRO) ile Lanczos bidiagonalization algoritmasına dayanmaktadır.
Ancak PROPACK, ARPACK'den çok daha az standart gibi görünüyor ve standart programlama dillerinde yerel olarak desteklenmiyor. 90 sayfalık 1998 tarihli büyük bir kağıt Lanczos bidiagonalizasyona sahip Rasmus Larsen tarafından yazılmıştır . @MichaelGrant bu Hesaplamalı Bilim SE iş parçacığı sayesinde .
Daha yeni yazılar arasında en popüler olan Bağlama ve Reichel, 2005, Augmented , muhtemelen en son teknolojiye sahip olan Lanczos bidiagonalizasyon yöntemlerini dolaylı olarak yeniden başlattı . @Dougal'a yorumlarda bu bağlantıyı verdiği için teşekkürler.
Güncelleme 2
Gerçekten alıntıladığınız genel bakış belgesinde ayrıntılı olarak açıklanan tamamen farklı bir yaklaşım vardır: Halko ve ark. 2009, Rasgeleli yapı bulma: Yaklaşık matris ayrışımlarının oluşturulması için olasılıksal algoritmalar . Yorum yapmak için yeterince bilgim yok.