gpt4 book ai didi

python - 大数据矩阵分解推荐系统给出MemoryError

转载 作者:太空狗 更新时间:2023-10-30 01:30:46 25 4
gpt4 key购买 nike

我有三个数据库模型(来自 Django)可用作构建推荐系统的输入:

  • 用户列表 - 包含 userIdusernameemail
  • 电影列表 - 包含 movieIdmovieTitleTopics
  • Saves List - with userId, movieId and timestamp(目前的推荐系统会比通常的简单一点在网上找到的方法没有评分,只有用户保存了某部电影,并且该模型包含所有电影保存)

我仍然可以使用矩阵分解 (MF) 来构建推荐系统,即使某个项目的评分只是10(已保存或未保存)。

为了使用 scipysurprise 中的所有 MF 算法,我必须创建一个 pandas DataFrame 并将其旋转所有 userIds 将是行(索引),所有 movieIds 将是列。

执行此操作的代码片段是:

# usersSet and moviesSet contain only ids of users or movies

zeros = numpy.zeros(shape=(len(usersSet), len(moviesSet)), dtype=numpy.int8)

saves_df = pandas.DataFrame(zeros, index=list(usersSet), columns=list(moviesSet))

for save in savesFromDb.iterator(chunk_size=50000):
userId = save['user__id']
movieId = save['movie__id']

saves_df.at[userId, movieId] = 1

目前遇到的问题:

  • 使用 pandas 中的 DataFrame.loc 代替 DataFrame.at 为多个列赋值会产生 MemoryError。这就是我选择后一种方法的原因。
  • 使用 scipy 中的 svds 进行 MF 需要 float 或 double 作为 DataFrame 的值,并且只要我这样做 DataFrame.asfptype() 我得到一个 MemoryError

问题:

  1. 鉴于有约 10 万用户、约 12 万部电影和约 45 万次保存,为了使用推荐算法但仍然不会出现 MemoryError,最好的建模方法是什么?
  2. 我也尝试过使用 DataFrame.pivot(),但是有没有办法从 3 个不同的 DataFrame 构建它?即 indexes 将来自 list(usersSet)columns 来自 list(moviesList)values 通过遍历 savesFromDb 并查看哪里有 userId -> movieId 关系并在数据透视表中添加 1
  3. 除了 surpriserating_scale 参数,您可以在其中定义评级(在我的例子中是 (0, 1)),在算法方法或数据模型结构方面是否有任何其他方法可以利用这样一个事实,即在我的案例中,rating 仅为 10 (保存还是未保存)?

最佳答案

如果可以选择将稀疏矩阵与接受稀疏矩阵的算法一起使用,那么我强烈建议使用稀疏矩阵来消除内存问题。 scipy.linalg.svds 适用于 scipy 稀疏矩阵。

这是为您的案例创建稀疏矩阵的方法:

假设我们有 3 个用户('a'、'b'、'c')和 3 部电影('aa'、'bb'、'cc')。保存历史如下:

  • a救aa

  • b救bb

  • c 保存 cc

  • a 救了 bb

我们需要创建一个 csr_matrix A_sparse,这样用户代表行,电影列,如果用户 i 保存了电影 j,则 A[i, j] = 1

import numpy as np
from scipy.sparse import csr_matrix

# index users and movies by integers
user2int = {u:i for i, u in enumerate(np.unique(users))}
movies2int = {m:i for i, m in enumerate(np.unique(movies))}

# get saved user list and corresponding movie lists
saved_users = ["a", "b", "c", "a"]
saved_movies = ["aa", "bb", "cc", "bb"]

# get row and column indices where we need populate 1's
usersidx = [user2int[u] for u in saved_users]
moviesidx = [movies2int[m] for m in saved_movies]

# Here, we only use binary flag for data. 1 for all saved instances.
# Instead, one could also use something like count of saves etc.
data = np.ones(len(saved_users), )

# create csr matrix
A_sparse = csr_matrix((data, (usersidx, moviesidx)))

print("Sparse array", A_sparse)

#<3x3 sparse matrix of type '<class 'numpy.float64'>'
# with 4 stored elements in Compressed Sparse Row format>

print(A_sparse.data.nbytes)
# 32

print("Dense array", A_sparse.A)

#array([[1., 1., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])

print(A_sparse.A.nbytes)
# 72

您可以注意到,由于我们一半的数据点是零(大约),稀疏矩阵大小几乎是 numpy ndarray 的一半。因此,内存压缩将按矩阵中零的百分比比例增加。

关于python - 大数据矩阵分解推荐系统给出MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57370472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com