2010-07-13 3 views
6

Кто-нибудь знает, как выполнить операцию svd на разреженной матрице в python? Кажется, что в scipy.sparse.linalg нет такой функции.sparse matrix svd in python

+0

Кажется, вы не повезло и придется обернуть Fortran библиотеки, такие как PROPACK самостоятельно. Или попросите разработчиков Scipy добавить SVD на основе PROPACK в предстоящую версию. – Philipp

+0

Существует также библиотека SVDPACK с версиями и интерфейсами C и C++. – Philipp

ответ

3

Для этого вы можете использовать библиотеку Divisi; на домашней странице:

  • Это библиотека, написанная на Python, с использованием библиотеки C (SVDLIBC) для выполнения разреженной операции SVD с использованием алгоритма Ланцоша. Другие математические вычисления выполняются NumPy.
3

Вы можете попробовать scipy.sparse.linalg.svd, хотя документация все еще находится в процессе разработки и, следовательно, лаконична.

+1

Вы, вероятно, имеете в виду процедуру под названием «svds». Я попробовал, но сам не был доволен результатами ... – dividebyzero

4

Похоже, sparsesvd - это то, что вы ищете! SVDLIBC эффективно завернут в Python (без дополнительных копий данных в ОЗУ).

Просто запустите «easy_install sparsesvd» для установки.

2

Простой пример использования библиотеки:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^