her seferinde bir tekil değer / vektör olan kesilmiş SVD'yi hesaplama


11

Tekil değerleri birer birer hesaplayan kesilmiş bir SVD algoritması var mı?

Benim sorun: Ben ilk hesaplamak istiyorum k büyük yoğun matris tekil değerler (ve tekil vektörleri) M , ama uygun bir değer bilmiyorum k olurdu. M büyüktür, bu nedenle verimlilik nedenleriyle, tam SVD'yi yalnızca daha sonra en küçük SV'leri kesmek için değerlendirmemeyi tercih ederim.

İdeal olarak, tekil değerler hesaplamak için bir yol var olacağını σ1,σ2, seri, büyük dan ( σ1 küçük (kadar) σn ). Bu şekilde, eğer σ k / σ 1 bir eşiğin altına düşerse , k Tekil değerini hesapladıktan sonra hesaplamayı durdurabilirim .σk/σ1

Böyle bir algoritma var mı (tercihen bir Python uygulamasıyla)? Etrafımda dolaşırken, sadece k'yi parametre olarak alan kesilmiş SVD işlevlerini buldum, böylece onu bir önsel tahmin etmeye zorladım.


M kare veya dikdörtgen mi? Dikdörtgen ise, uzun veya kısa tekil vektörleri ister misiniz? Yani, M m> n ile (mxn) ise (mxk) veya (kxn) ister misiniz?
Max Hutchinson

M dikdörtgen şeklindedir ve sütunlardan çok daha fazla satıra sahiptir. Kısa tekil vektörleri istiyorum (yani V, M = U S V ^ T cinsinden).
SuperElectric

Yanıtlar:


6

Yaklaşık bir rank-k çarpanlara ayırma işlemi istiyorsanız birkaç seçenek vardır.

  1. Güçlü rütbe gösteren QR çarpanlarına ayırma
  2. İnterpolatif ayrışma (ID) ve diğer randomize teknikler.

AMNTfactor×σk+1(A):=ϵ

Yukarıdaki formun yaklaşık çarpanlarına ayrılması, standart teknikler kullanılarak QR veya SVD gibi standart bir ayrışmaya dönüştürülebilir. Halko, Martinsson ve Tropp tarafından hazırlanan makalede iyi bir derleme bulunmaktadır.

Yazılım açısından, scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html içinde, kullanıcının belirtmenize olanak tanıyan bir kimlik algoritmaları arabirimi bulunmaktadır .ϵ


2

(Düzenlendi, çünkü ilk başta soruyu yanlış okudum; ilk tekil değerlerini hesaplamak için mevcut rutinlerin olduğunu zaten biliyorsunuz .)k

SVD'nin tamamını hesaplama yaklaşımını hariç tutarsanız, kısmi SVD algoritmaları ilgili Hermitian özdeğer problemini çözmek için yinelemeli yöntemler kullanmaya düşer. Bu nedenle, uygulayabileceğiniz bir strateji, bu tür şeyleri kendiniz kodlamak ve bir vardiya ve tersine çevirme stratejisi gibi bir şey kullanarak durdurmak istediğinize kadar kalan en büyük çözülmemiş tekil değeri çözmeye devam etmek olacaktır. SLEPc gibi sofistike ambalajlarda bu tür şeyleri yapmanın zarif yolları olabilir .

Başka bir strateji şöyle olacaktır:

  • En büyük tekil değeri hesaplayın .s1
  • Seyrek SVD rutininin mutlak toleransını ; burada eşik ve , istediğiniz olası yabancı tekil değerin belirlenmesi için bir güvenlik faktörüdür hesaplamak.τs1fτ0<f1
  • Seyrek SVD rutini çağırın.

Seyrek SVD rutini ince bir SVD hesaplarsa (ve neden olmasın) göremiyorum, o zaman bu strateji size istediğiniz tekil değerleri (artı muhtemelen bazı ekstra değerleri) verir, çünkü mutlak toleransın altındaki değerler sıfır gibi muamele görmek. Bu durumda, isteğe bağlı bir parametre olduğunu ve bunu bir priori belirtmeniz gerekmediğini belirterek scipy.sparse.linalg.svds dosyasını kullanabilirsiniz .k


Scipy.sparse.linalg.svds dosyasında 'k' belirtmezseniz, 'tol' parametresinden bağımsız olarak varsayılan olarak k = 6 olur. Bunun bir hata olup olmadığı veya 'tol'un hesaplanan tekil değerlerin (boyutlarından ziyade) doğruluğuna başvurması gerekiyorsa net değil
Nick Alger
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.