Python中的稀疏矩阵SVD

6

有人知道如何在Python中对稀疏矩阵执行SVD操作吗?看起来scipy.sparse.linalg没有提供这样的功能。


看来你运气不太好,必须自己包装一个Fortran库,比如PROPACK。或者向Scipy开发人员请求在即将发布的版本中添加基于PROPACK的SVD。 - Philipp
还有SVDPACK库,它有C和C++版本/接口。 - Philipp
4个回答

4
听起来像是您正在寻找的东西是 sparsesvd!它将 SVDLIBC 在 Python 中高效地包装(在 RAM 中不会进行额外的数据复制)。
只需运行 "easy_install sparsesvd" 即可安装。

3

使用python-recsys库的简单示例:

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

3
您可以使用 Divisi 库来完成此操作;从主页上可以看到:
  • 它是一个用Python编写的库,使用C库(SVDLIBC)使用Lanczos算法执行稀疏SVD操作。其他数学计算由NumPy执行。

3

1
你可能指的是名为“svds”的过程。我尝试过它,但自己对结果并不满意... - dividebyzero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接