Kesilmiş SVD'yi hesaplamak için hangi hızlı algoritmalar var?


15

Burada muhtemelen konu dışı, ancak zaten birkaç ( bir , iki ) ilgili soru var.

Literatürde (veya Kesik SVD Algoritmaları için bir google araması) dolaşmak, kesilmiş SVD'leri çeşitli şekillerde kullanan birçok kağıt ortaya çıkarır ve bunu hesaplamak için hızlı algoritmalar olduğunu iddia eder (sinir bozucu, genellikle alıntı yapmadan), ancak hiç kimse Bu algoritmaların ne olduğuna işaret ediyor gibi görünüyor.

Bulabildiğim tek şey redSVD kütüphanesinde kullanılan tek bir rastgele algoritma .

Görmek istediğim, sistemlerin nasıl çalıştığını anlamak için uygun bir dizi kesin ve kesin olmayan algoritmadır (ancak elbette bunları uygulamak için zorunlu değildir!).

Herkes böyle bir şey için iyi bir referans var mı?


Verileri iyi saklamak istiyorsam, karma içinde bir b-ağacı (veya rb-ağacı) kullanıyorum (koç düşünün). Veriler için bir b-ağacım olsaydı, O (log (n)) zaman numune miktarlarında ve benzerlerinde yapabilirdim. Bahse girerim, büyük verilerle, bu örnekleme kısa sürede svd matrislerine iyi bir seyrek yaklaşım hesaplamak için kullanılabilir. Ayrıca, aşırı veri sıkıştırmaya çok istatistiksel bir yaklaşım olan "sıkıştırılmış algılama" konusuna da bakabilirsiniz.
EngrStudent - Monica'yı

Kesilmiş SVD ile, hepsinin aksine, sadece birkaç önde gelen tekil vektör / değer bulmak istediğinizi mi söylüyorsunuz?
amip diyor Reinstate Monica

@ amoeba Evet, fikir bu.
John Doucette

Yanıtlar:


18

Ç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=(0BB0).
algorithm for truncated SVDiterative algorithm for eigendecomposition.

En basit yinelemeli algoritmaya güç yinelemesi denir ve gerçekten çok basittir:

  1. Random başlatın .x
  2. Güncelleme .xAx
  3. Normale.xx/x
  4. 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:

  1. Golub & Van Kredisi, Matris Hesaplamaları
  2. Trefethen & Bau, Sayısal Lineer Cebir
  3. Demmel, Uygulamalı Sayısal Lineer Cebir
  4. 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: svdLAPACK aracılığıyla tam ayrıştırma gerçekleştirir ve svdsbelirli 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.


SVD'ye özgü yineleme yöntemleri olduğunu unutmayın; örneğin Artırılmış Kapalı Olarak Yeniden Başlatılan Lanczos Bidiagonalizasyon Yöntemleri , J. Baglama ve L. Reichel, SIAM J. Sci. Comput. 2005. (Verdiğiniz özdeğer yaklaşımından temelde farklı olup olmadığını bilmek için makaleyi okumadım, sadece insanların bu yöntemi sevdiğini bilin.)
Dougal

1
Bağlantı için teşekkürler, @Dougal. Bu yöntemlerden hiçbirini gerçekten bilmediğimi söylemeliyim, bu yüzden gerçekten yorum yapamam. Daha bilgili bir kişinin çeşitli yinelemeli yöntemler arasındaki ilişkiyi açıklaması harika olurdu. Anladığım kadarıyla, vanilya Lanczos yöntemi SVD için değil, bir kare matrisin özdeğerlerini hesaplamak içindir; "dolaylı olarak yeniden başlatılan Lanczos artırıldı" onunla yakından ilgili olmalı, ama haklısın - doğrudan SVD ile ilgili gibi görünüyor. Her şeyin birbirine nasıl uyduğundan emin değilim. Daha yakından bakarsam cevabımı güncelleyeceğim.
amip: Reinstate Monica

1
@Dougal, bazı üstünkörü okumalar yaptım ve bir güncelleme yaptım.
amip: Reinstate Monica

@ amibaeba en küçük kareler bağlamında "kesilmiş SVD" esasen "temel bileşenler gerilemesi" ile aynı olur mu?
GeoMatt22

1
@amoeba Facebook'un rastgele SVD uygulaması hakkında yorum yapabilir misiniz , bazı insanlar bunun şu anda mümkün olan en hızlı çözümler arasında olduğunu söylüyor . Bu konuda yorum yapmak için düzenleme yapabilseydiniz harika olurdu.
Tim

4

Ben sadece hızlı SVD'ler üzerinden googling iplik üzerinde tökezledi, bu yüzden kendim bir şeyler anlamaya çalışıyorum, ama belki de uyarlanabilir çapraz yaklaşım (ACA) bakmak gerekir .

Sorunun nasıl olduğunu veya neye ihtiyacınız olduğunu gerçekten bilmiyorum, ancak matrisiniz pürüzsüz işlevlerden hesaplanıyorsa ve yaklaşık olarak ayrılmış bir gösterime ihtiyacınız varsa ve gerçekten "uygun" bir SVD değil, ACA algoritması (neredeyse) doğrusal hesaplama karmaşıklığına sahiptir ( matrisi o zaman neredeyse ). Yani gerçekten hızlı; ne yazık ki birçok kişi "hızlı" kelimesini hafifçe kullanıyor.MM=i=0kUiViTN×NO(N)

Yine, bu işe yarayıp yaramadığına bağlıdır. Şahsen karşılaştığım birçok durumda, ACA çok kullanışlı bir sayısal araçtır.

Not: Bunu bir yorum olarak yazmak istedim, ancak bu hesabı yeni oluşturduğum için yorumlar için yeterli itibarım yok ... Ama yayın işe yarıyor.


2

İşte geçmişte, kesilmiş bir SVD'yi (Netflix veri kümesinde) hesaplamak için başarıyla kullandığım bir teknik. Bu makaleden alınmıştır . İşbirliğine dayalı bir filtreleme ayarında, değerlerin çoğunun eksik olduğunu ve noktanın bunları tahmin etmek olduğunu belirtmeliyim , bu yüzden böyle bir sorunu çözmek için kesilmiş SVD'yi kullanmak için bu koşulda çalışan bir teknik kullanmanız gerekir. Kısa bir açıklama:

  1. Herhangi bir şey yapmadan önce, basit bir model (örn., Global ortalama + sütun ve satır sabit değerleri) takın ve yalnızca bunu yaptıktan sonra, artıklara uyacak şekilde kesilmiş SVD kullanmaya devam etmelisiniz.
  2. Her satıra ve sütuna (Netflix örneğindeki her bir film ve kullanıcı için) k uzunluğunda rastgele bir vektör (kısalttığınız sıralama budur) başlatın.
  3. Satır vektörlerini sabit tutun ve matristeki bilinen girdilerdeki hatayı en aza indirmek için sütun vektörlerini güncelleyin . Prosedür makalede matlab kodunda verilmiştir.
  4. Sütun vektörlerini sabit tutun ve satır vektörlerini benzer bir şekilde güncelleyin.
  5. Yakınsama veya yeterince iyi sonuçlar elde edene kadar 3 ve 4'ü tekrarlayın.
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.