2010-07-13 23 views
6

Python'da seyrek bir matriste svd işleminin nasıl yapıldığını bilen var mı? Scipy.sparse.linalg'de böyle bir işlevsellik bulunmadığı görülmektedir.python'da seyrek matris svd

+0

Eğer şans bitti ve bu ProPack kendin gibi bir Fortran kütüphane sarmak zorunda görünüyor. Ya da Scipy geliştiricilerinin PROPACK tabanlı SVD'yi gelecek sürümde eklemelerini isteyin. – Philipp

+0

Ayrıca C ve C++ sürümleri/arabirimleri olan SVDPACK kitaplığı da vardır. – Philipp

cevap

3

Bunu yapmak için Divisi kitaplığını kullanabilirsiniz; ana sayfasından:

  • O Lanczos algoritması kullanılarak seyrek SVD işlemi gerçekleştirmek için bir C kütüphanesi (SVDLIBC) kullanılarak Python ile yazılmış bir kütüphane vardır. Diğer matematiksel hesaplamalar NumPy tarafından gerçekleştirilir.
3

scipy.sparse.linalg.svd belgelerini kullanmaya devam edebilirsiniz, ancak belgeler hala devam eden bir çalışmadır ve bu nedenle daha laconic.

+1

Muhtemelen "svds" denilen yordamı kastediyorsunuz. Denedim ama sonuçlarla kendimden memnun olmadım ... – dividebyzero

4

sparsesvd gibi geliyor! SVDLIBC, Python'a verimli bir şekilde sarılmıştır (RAM'de ekstra veri kopyaları yoktur).

Yüklemek için "easy_install sparsesvd" komutunu çalıştırın.

2

kütüphaneyi kullanan Basit bir örnek:

from recsys.algorithm.factorize import SVD 

svd = SVD() 
svd.load_data(dataset) 
svd.compute(k=100, mean_center=True) 

ITEMID1 = 1 # Toy Story 
svd.similar(ITEMID1) 
# Returns: 
# [(1, 1.0),     # Toy Story 
# (3114, 0.87060391051018071), # Toy Story 2 
# (2355, 0.67706936677315799), # A bug's life 
# (588, 0.5807351496754426), # Aladdin 
# (595, 0.46031829709743477), # Beauty and the Beast 
# (1907, 0.44589398718134365), # Mulan 
# (364, 0.42908159895574161), # The Lion King 
# (2081, 0.42566581277820803), # The Little Mermaid 
# (3396, 0.42474056361935913), # The Muppet Movie 
# (2761, 0.40439361857585354)] # The Iron Giant 

ITEMID2 = 2355 # A bug's life 
svd.similarity(ITEMID1, ITEMID2) 
# 0.67706936677315799