Numpy'nin SVD'yi nasıl yaptığını anlama


13

Hem bir matrisin sırasını hem de bir matris denklem sisteminin çözümünü hesaplamak için farklı yöntemler kullanıyorum. Linalg.svd işleviyle karşılaştım. Bunu, Gauss Eliminasyonu ile sistemi çözme çabamla karşılaştırdığımda, hem daha hızlı hem de daha kesin görünüyor. Bunun nasıl mümkün olduğunu anlamaya çalışıyorum.

Bildiğim kadarıyla, linalg.svd işlevi, matrisimin özdeğerlerini hesaplamak için bir QR algoritması kullanır. Bunun matematiksel olarak nasıl çalıştığını biliyorum, ancak Numpy'nin bu kadar hızlı ve çok fazla hassasiyet kaybetmeden bunu nasıl başardığını bilmiyorum.

Öyleyse sorum: numpy.svd işlevi nasıl çalışıyor ve daha spesifik olarak, bunu hızlı ve doğru bir şekilde nasıl yapmayı başarıyor (gauss elemesine kıyasla)?


2
numpy, dgesddgerçek değerli SVD'ler için Lapack rutinini kullanır . Yani asıl sorunuz muhtemelen "Lapack dgesdd nasıl çalışır?" Ve bu yığın akışı için konu dışı.
talonmies

Gerçekten merak ediyorsanız, LAPACK kaynağını incelemenizi öneririm.

Yorumlarınız için teşekkür ederim, özür dilerim.
RobVerheyen

Bu gönderi Yığın Taşması'ndan bir gönderi . Çapraz gönderme genellikle Stack Exchange sitelerinde önerilmez. Bir soruyu farklı bir sitede yeniden yayınlamak için kullanılan standart protokol, farklı bir sitede yeniden yayınlamaya çalışmadan önce orijinal yayını kapatmak, silmek veya taşımaktır. (Soruyu
taşırsanız

Üzgünüm, protokolün farkında değildim. Umarım hala bir cevap alabilirim.
RobVerheyen

Yanıtlar:


15

Sorunuzda bir takım sorunlar var.

Bir matrisin sayısal sırasını hesaplamak için Gauss Eliminasyonu (LU çarpanlarına ayırma) kullanmayın. Kayan nokta aritmetiğinde LU çarpanlara ayırma bu amaç için güvenilir değildir. Bunun yerine, (örneğin bir sıradan açığa QR ayrışmayı kullanmak xGEQPXveya xGEPQY; bkz olanlar rutinleri zor olsa izini x C, D, S, ya da Z LAPACK, içinde ilgili soru üzerine JedBrown yanıtını veya bir SVD kullanın) (mesela tekil değer ayrışımı, örneğin, xGESDDveya xGESVDx burada tekrar C, D, S veya Z'dir). SVD, sayısal sıralamanın belirlenmesi için daha doğru ve güvenilir bir algoritmadır, ancak daha fazla kayan nokta işlemi gerektirir.

Bununla birlikte, doğrusal bir sistemi çözmek için, LU çarpanlara ayırma (LAPACK'teki standart uygulama olan kısmi pivotlama ile) pratikte son derece güvenilirdir. Kısmi pivotlama ile LU çarpanlaştırmasının dengesiz olduğu bazı patolojik durumlar vardır ( Sayısal Doğrusal Cebirdeki Ders 22'ye bakınız.Trefethen ve Bau tarafından ayrıntılar için). QR çarpanlara ayırma, doğrusal sistemlerin çözümü için daha kararlı bir sayısal algoritmadır, bu yüzden muhtemelen size bu kadar kesin sonuçlar verir. Bununla birlikte, kare matrisler için 2 faktörü ile LU çarpanlarına ayırma işleminden daha fazla kayan nokta işlemi gerektirir (inanıyorum; JackPoulson beni bu konuda düzeltebilir). Dikdörtgen sistemler için, QR çarpanlarına ayırma daha iyi bir seçimdir, çünkü aşırı belirlenmiş doğrusal sistemlere en küçük kareler çözümleri verecektir. SVD ayrıca doğrusal sistemleri çözmek için de kullanılabilir, ancak QR çarpanlarına ayırma işleminden daha pahalı olacaktır.

janneb, numpy.linalg.svd dosyasının xGESDDLAPACK içinde bir paketleyici olduğu doğrudur . Tekil değer ayrışmaları iki aşamada ilerler. İlk olarak, ayrıştırılacak matris bidiagonal forma indirgenir. LAPACK'de bidiagonal forma azaltmak için kullanılan algoritma muhtemelen Lawson-Hanson-Chan algoritmasıdır ve bir noktada QR çarpanlarına ayırma yöntemini kullanır. Trefethen ve Bau'nun Sayısal Lineer Cebirinde anlatım 31 , bu sürece genel bir bakış sunmaktadır. Ardından, xGESDDtekil değerleri ve tek yönlü matrisin sol ve sağ tekil vektörlerini hesaplamak için bir böl ve fethet algoritması kullanır. Bu adımla ilgili bilgi edinmek için Golub ve Van Kredisi ile Matris Hesaplamaları'na veya Jim Demmel'in Uygulamalı Sayısal Doğrusal Cebiri'ne başvurmanız gerekir .

Son olarak, tekil değerleri özdeğerlerle karıştırmamalısınız . Bu iki miktar kümesi aynı değildir. SVD, bir matrisin tekil değerlerini hesaplar. Cleve Moler en MATLAB ile Sayısal Hesaplama bir verir tekil değerler ve özdeğerler arasındaki farkların güzel bakış . Genel olarak, tekil değerlerin özdeğerlerin mutlak değeri olduğu normal matrisler haricinde, belirli bir matrisin tekil değerleri ile özdeğerleri arasında belirgin bir ilişki yoktur .


Bence "ilgili değil" özdeğerler ve tekil değerler arasındaki ilişki için oldukça güçlü. İlişki, matrisinizin tam Ürdün ayrışmasını bilmediğiniz sürece oldukça belirsizdir, ancak söz konusu Ürdün ayrışması hakkında bilginiz varsa (veya varsayımlar yapmaya hazırsanız) birini tahmin etmek için kullanabilirsiniz.
Dan

Bunun yerine ne önerirsiniz?
Geoff Oxberry

Her şeyden önce, ayrıntılı cevap için teşekkür ederim. Matris sırasını zor yoldan belirlemek için LU ayrışmasını kullanamayacağımı öğrendim. Cevabınız, QR faktörünün aslında sorunumu çözmenin daha hızlı bir yöntemi olacağını ima ediyor gibi görünüyor, değil mi? SVD kullanımında belirgin bir avantaj var mı? Tekil değerlerin özdeğer olmadığının farkındaydım. Tekil değerlerin, matrisin özdeğerlerinin soldan devrik ile çarpımı olarak hesaplanabileceğinden bahsediyordum. Anlaşılmadığı için üzgünüm.
RobVerheyen

Çözdüğüm matrisin aslında tekil olduğunu da ekleyebilirim. Aslında, matris sırası, matris boyutunun sadece yarısı kadardır. Belki de bu bazı yöntemleri daha çok tercih edilir kılar?
RobVerheyen

1
@RobVerheyen: QR, LU'dan daha yavaş olacak, ancak çok daha doğru olacak. SVD, QR'den bile daha yavaş olacaktır, ancak SVD, sayısal sıralamayı belirlemek için en güvenilir yöntem olarak kabul edilir (örneğin, MATLAB, SVD'yi rankişlevinde kullanır ). Her iki yaklaşımı da kullanırken küçük bir takdir yetkisi vardır; SVD yaklaşımında, sayısal sıra, belirtilen (genellikle çok küçük) bir kesmenin üzerindeki tekil değerlerin sayısıdır. (QR yaklaşımı benzerdir, ancak tekil değerleri R matrisinin köşegen girişleriyle değiştirir.)
Geoff Oxberry

8

Sorunuzun ifadesi nedeniyle, matrisinizin kare olduğunu varsayıyorum. LAPACK'in zgesvd gibi SVD rutinleri, esas olarak kare matrisler için üç aşamada ilerler:

  1. Hanehalkı dönüşümlerinin ürünleri olarak ve üniter matrislerini hesaplamak , böylece genel matris gerçek, üst bir bidiagonal matris indirgenir . Bu alt , ve için Hanehalkı vektörleri (ilk girişleri dolaylı olarak bir şekilde edilir) sırasıyla aşağıdaki bölümlerinde ve ana ve süper diyagonalin sağında saklanır . Bu adım çalışması gerektirir.UAVAAB:=UAHAVAUAVABO(n3)
  2. Bir gerçek simetrik tridiagonal matrisin özdeğer ayrışmasının hesaplanması için bir algoritma üzerindeki bir varyasyon, bir bidiagonal SVD'yi hesaplamak için kullanılır. Gerçek simetrik tridiagonal EVP'ler (MRRR) için en iyi bilinen algoritma henüz, bence, bidiagonal SVD için kararlı olsa da, burada ilginç bir tartışma var . LAPACK şu anda bidiagonal SVD için bir böl ve fethet yaklaşımı kullanıyor . İki yönlü SVD , . Bu adım, MRRR SVD için kararlı hale getirildiğinde çalışması gerektirir, ancak şu anda çalışması kadar gerektirir .{UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. Bu adım önemsiz. Yana , , SVD açıkça dolaylı tanımlamak Householder dönüşümler uygulandıktan sonra meydana getirilebilir, böylece ve için ve sırasıyla. Bu adımda çalışması gereklidir .A = ( U A U B ) Σ ( V A V B ) H U A V A U B V B O ( n 3 )UABVAH=AA=(UAUB)Σ(VAVB)HUAVAUBVBO(n3)

7

numpy.linalg.svd, LAPACK'ten {Z, D} GESDD civarında bir pakettir. LAPACK ise, dünyanın en önde gelen sayısal lineer cebir uzmanları tarafından özenle yazılmıştır. Gerçekten de, alana yakından aşina olmayan birinin LAPACK'i yenmeyi başarabilmesi çok şaşırtıcı olurdu (hızda veya doğrulukta).

QR'nin Gauss eliminasyonundan neden daha iyi olduğuna gelince, muhtemelen /scicomp// için daha uygundur.


Cevabınız ve referansınız için teşekkür ederiz. Orada deneyeceğim.
RobVerheyen
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.