在轴 0 上重复 csr_matrix 行以创建矩阵
Repeat a csr_matrix row over axis 0 to create a matrix
我有一个 CSR 格式的稀疏矩阵 (scipy.sparse.csr_matrix),大约有 100,000 行和 10,000 列。行代表用户,列代表项目,矩阵中的值是该用户和项目的评分。
我正在尝试计算两个用户之间的相关性。所以我遍历每个用户(称之为 user_a),并进行矩阵运算以获得 user_a 与所有其他用户的相关性。
第一步,生成当前用户矩阵。此矩阵包含当前用户的元素,屏蔽以匹配 user_a 与所有其他用户的公共元素。
我现在的代码是:
# ratings is the big original matrix
R = ratings.getrow(user_id)
user_matrix = sparse.csr_matrix(R)
user_matrix = user_matrix[numpy.array([0]).repeat(ratings.shape[0]),:]
user_matrix = user_matrix.multiply(ratings.astype(numpy.bool))
()
但是对于只有 500 个项目的用户来说,这些行需要 4 秒。我需要为每个用户(100,000 次)运行。所以有点慢。
我尝试使用 vstack 生成 user_matrix,但花了 7 秒
有没有办法减少这些行的时间?
对于 csr_matrix
ratings
和整数 user_id
,这给出与您的代码相同的结果:
valid_ratings = ratings.astype(bool)
user_matrix = valid_ratings.multiply(ratings[user_id])
但是如果您的 scipy 版本太旧,它将无法工作。我不记得哪个版本的 scipy 扩展了稀疏矩阵的广播行为来实现这项工作。
我有一个 CSR 格式的稀疏矩阵 (scipy.sparse.csr_matrix),大约有 100,000 行和 10,000 列。行代表用户,列代表项目,矩阵中的值是该用户和项目的评分。
我正在尝试计算两个用户之间的相关性。所以我遍历每个用户(称之为 user_a),并进行矩阵运算以获得 user_a 与所有其他用户的相关性。
第一步,生成当前用户矩阵。此矩阵包含当前用户的元素,屏蔽以匹配 user_a 与所有其他用户的公共元素。
我现在的代码是:
# ratings is the big original matrix
R = ratings.getrow(user_id)
user_matrix = sparse.csr_matrix(R)
user_matrix = user_matrix[numpy.array([0]).repeat(ratings.shape[0]),:]
user_matrix = user_matrix.multiply(ratings.astype(numpy.bool))
()
但是对于只有 500 个项目的用户来说,这些行需要 4 秒。我需要为每个用户(100,000 次)运行。所以有点慢。
我尝试使用 vstack 生成 user_matrix,但花了 7 秒
有没有办法减少这些行的时间?
对于 csr_matrix
ratings
和整数 user_id
,这给出与您的代码相同的结果:
valid_ratings = ratings.astype(bool)
user_matrix = valid_ratings.multiply(ratings[user_id])
但是如果您的 scipy 版本太旧,它将无法工作。我不记得哪个版本的 scipy 扩展了稀疏矩阵的广播行为来实现这项工作。