Kısmi Tekil Değer Ayrıştırmalarının (SVD) bellek verimli uygulamaları


10

Modelin indirgenmesi için, matrisi olan bir matrisin en büyük tekil değerlerini - say 20 ile ilişkili olan sol tekil vektörleri hesaplamak istiyorum , burada ve . Ne yazık ki, matrisim herhangi bir yapı olmadan yoğun olacak. N 10 6 k 10 3 AARN,kN106k103A

Ben sadece bu boyutta rastgele bir matris için Python modülünden svdrutin çağırırsanız, numpy.linalgbir bellek hatası ile karşılaşıyorum. Bunun nedeni ayrışımı için tahsis edilmesidir . A = V S UVRN,NA=VSU

Etrafta bu tuzaklardan kaçınan algoritmalar var mı? Örneğin, yalnızca sıfır olmayan tekil değerler ile ayrılmış tekil vektörler oluşturarak.

Hesaplama zamanı ve doğruluğu ile ticaret yapmaya hazırım.


1
İlginç, Numpy ince bir SVD yapmayı bilmiyor gibi görünüyor ...
JM

İpucu için teşekkürler. Gerçekten de, numpy.linalg.svd seçeneği full_matricesyalnızca 'sıfır olmayan' parçaların hesaplanması için False olarak ayarlanmış seçeneğe sahiptir . Yine de, hesaplamayı daha da azaltmanın bir yolu var mı?
Jan

3
Arka numpyuç, LAPACKE_dgesvdstandart svd için rutin olan fortran kodunu kullanır . Ancak, genellikle matrisiniz C_CONTIGOUS(ile kontrol edin matrix.flags). Bu nedenle verileri fortran hizalaması için kopyalar. Ayrıca, lapack rutin dgesvd'yi çalıştırırken matrisinizin başka bir kopyası (veya en azından bunun için bellek) gereklidir. Bellek hizalamasının en başından itibaren fortran tarzı olduğundan emin olursanız, bir kopyadan kurtulabilirsiniz.
Bort

Yanıtlar:


6

Sadece birkaç tekil değer / vektör istiyorsanız, ARPACK hile yapmalıdır. SVD dokümanlar büyük değildir ve bu dağıtım güncel fazlasıdır.

EDIT: Bunu python ile yapmak istiyorsanız, SciPy bir sarıcı var . Matrisiniz yoğun olduğundan, blok seyrek satır (BSR) biçimini deneyebilirsiniz .


ARPACK'in python ile nasıl bütünleştiğine bir göz atacağım ...
Ocak

1
Scipy'nin paketleyicileri var gibi görünüyor. Onları bedene cevaplamak için ekleyeceğim.
Max Hutchinson



2

Intel MKL yeni Jacobi-SVD algoritmasını uygular. Uygulama ayrıntıları: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

Ve LAPACK rutini: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

Çalışma boyutu elbette ayarlanabilir. Cython, SWIG veya başka bir sarma mekanizmasını kullanarak Python'dan C işlevlerini kolayca çağırabilirsiniz.

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.