- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有三个数据库模型(来自 Django)可用作构建推荐系统的输入:
userId
、username
、email
等movieId
、movieTitle
、Topics
等userId
, movieId
and timestamp
(目前的推荐系统会比通常的简单一点在网上找到的方法没有评分,只有用户保存了某部电影,并且该模型包含所有电影保存)我仍然可以使用矩阵分解 (MF) 来构建推荐系统,即使某个项目的评分只是1
和 0
(已保存或未保存)。
为了使用 scipy
或 surprise
中的所有 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问题:
DataFrame.pivot()
,但是有没有办法从 3 个不同的 DataFrame 构建它?即 indexes
将来自 list(usersSet)
,columns
来自 list(moviesList)
和 values
通过遍历 savesFromDb
并查看哪里有 userId -> movieId 关系并在数据透视表中添加 1
。surprise
的 rating_scale
参数,您可以在其中定义评级(在我的例子中是 (0, 1)
),在算法方法或数据模型结构方面是否有任何其他方法可以利用这样一个事实,即在我的案例中,rating 仅为 1
或 0
(保存还是未保存)?最佳答案
如果可以选择将稀疏矩阵与接受稀疏矩阵的算法一起使用,那么我强烈建议使用稀疏矩阵来消除内存问题。 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/
我正在尝试在 R 中计算任意 N x J 矩阵 S 的投影矩阵 P: P = S (S'S) ^ -1 S' 我一直在尝试使用以下函数来执行此操作: P 概述 solve 基于一般方阵的 LU 分解
所以我有一个包含数千行的非常旧的文件(我猜是手工生成的),我正试图将它们移动到一个 rdb 中,但是这些行没有转换为列的格式/模式。例如,文件中的行如下所示: blah blahsdfas
这实际上只是一个“最佳实践”问题...... 我发现在开发应用程序时,我经常会得到很多 View 。 将这些 View 分解为几个 View 文件是常见的做法吗?换句话说......而不只是有view
使用以下函数foo()作为简单示例,如果可能的话,我想将...中给出的值分配给两个不同的函数。 foo args(mapply) function (FUN, ..., MoreArgs = NUL
正面案例:可以进入列表 groovy> println GroovySystem.version groovy> final data1 = [[99,2] , [100,4]] groovy> d
省略素数计算方法和因式分解方法的详细信息。 为什么要进行因式分解? 它的应用是什么? 最佳答案 哇,这个线程里有这么多争斗。 具有讽刺意味的是,这个问题有一个主要的有效答案。 因式分解实际上在加密/解
术语“分解不良”和“重构”程序是什么意思?你能举一个简单的例子来理解基本的区别吗? 最佳答案 重构是一种通用技术,可以指代许多任务。它通常意味着清理代码、去除冗余、提高代码质量和可读性。 分解不良代码
我以前有,here ,表明 C++ 函数不容易在汇编中表示。现在我有兴趣以一种或另一种方式阅读它们,因为 Callgrind 是 Valgrind 的一部分,在组装时显示它们已损坏。 所以我想要么破坏
最初,我一直在打开并同时阅读两个文件,内容如下: with open(file1, 'r') as R1: with open(file2, 'r') as R2: ### m
我正在尝试摆脱 标签和标签内的内容使用 beatifulsoup。我去看了文档,似乎是一个非常简单的调用函数。有关该功能的更多信息是 here .这是我到目前为止解析的 html 页面的内容...
给定一个 float ,我想将它分成几个部分的总和,每个部分都有给定的位数。例如,给定 3.1415926535 并要求将其分成以 10 为基数的部分,每部分 4 位数字,它将返回 3.141 + 5
我的 JSF 项目被部署为一个 EAR 文件。它还包括一些 war 文件。我需要 EAR 的分解版本(包括分解的内部 WAR)。 有什么工具可以做到吗? 最佳答案 以编程方式还是手动? EAR 和 W
以下函数不使用行透视进行 LU 分解。 R 中是否有一个现有的函数可以使用行数据进行 LU 分解? > require(Matrix) > expand(lu(matrix(rnorm(16),4,4
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 7年前关闭。 Improve this
我正在使用登记数据进行病假研究。从登记册上,我只得到了每个人的病假开始日期和结束日期。但日期并没有逐年分割。例如,对于人 A,只有开始日期 (1-may-2016) 和结束日期 (14-feb-201
我发现以下 R 代码使用 qr 因式分解无法恢复原始矩阵。我不明白为什么。 a <- matrix(runif(180),ncol=6) a[,c(2,4)] <- 0 b <- qr(a) d <-
我正在尝试检测气候数据时间序列中的异常值,其中一些缺失的观测值。在网上搜索我发现了许多可用的方法。其中,STL 分解似乎很有吸引力,因为它去除了趋势和季节性成分并研究了其余部分。阅读 STL: A S
我想使用 javascript 分解数组中的 VIN,可能使用正则表达式,然后使用某种循环... 以下是读取 VIN 的方法: http://forum.cardekho.com/topic/600-
我正在研究 Databricks 示例。数据框的架构如下所示: > parquetDF.printSchema root |-- department: struct (nullable = true
我正在尝试简化我的代码并将其分解为多个文件。例如,我设法做到了: socket.once("disconnect", disconnectSocket); 然后有一个名为 disconnectSock
我是一名优秀的程序员,十分优秀!