为协同过滤创建用户-项目矩阵
Creating a User-Item Matrix for Collaborative Filtering
我正在尝试 运行 对 "User-Item-Rating" 数据的协同过滤 (CF) 算法。我的数据是长格式的,即每一行都有用户对特定项目评分的数据。我需要先将其转换为 "User-Item" 矩阵,然后才能对其应用 CF 算法。
我正在使用 tidyr
包中的 spread
函数来完成这项任务。但考虑到我有超过 50k 个独特的项目,生成的数据框将是巨大的。 R 无法执行此操作(在我的本地计算机上)并抛出 "cannot allocate vector of size" 错误。
处理此问题的最佳方法是什么?我尝试探索的一些选项,但无法使它们起作用:
- 我在想是否有办法 return spread call 的输出作为稀疏矩阵
- 我还尝试探索实现 CF 的包(例如
recommenderlab
)是否有处理此问题的选项。但我看不到任何选项。
任何帮助将不胜感激。
谢谢!
当您(可能)获得稀疏数据时,请使用稀疏矩阵。这是 50000 个稀疏示例评级的示例:
library(stringi)
library(Matrix)
set.seed(1)
df <- data.frame(item = stri_rand_strings(50000, 4))
df$user <- as.factor(1:nrow(df))
df$rating <- sample(1:10, nrow(df), T)
m <- sparseMatrix(
i = as.integer(df$user),
j = as.integer(df$item),
x = df$rating,
dimnames = list(levels(df$user), levels(df$item))
)
我正在尝试 运行 对 "User-Item-Rating" 数据的协同过滤 (CF) 算法。我的数据是长格式的,即每一行都有用户对特定项目评分的数据。我需要先将其转换为 "User-Item" 矩阵,然后才能对其应用 CF 算法。
我正在使用 tidyr
包中的 spread
函数来完成这项任务。但考虑到我有超过 50k 个独特的项目,生成的数据框将是巨大的。 R 无法执行此操作(在我的本地计算机上)并抛出 "cannot allocate vector of size" 错误。
处理此问题的最佳方法是什么?我尝试探索的一些选项,但无法使它们起作用:
- 我在想是否有办法 return spread call 的输出作为稀疏矩阵
- 我还尝试探索实现 CF 的包(例如
recommenderlab
)是否有处理此问题的选项。但我看不到任何选项。
任何帮助将不胜感激。
谢谢!
当您(可能)获得稀疏数据时,请使用稀疏矩阵。这是 50000 个稀疏示例评级的示例:
library(stringi)
library(Matrix)
set.seed(1)
df <- data.frame(item = stri_rand_strings(50000, 4))
df$user <- as.factor(1:nrow(df))
df$rating <- sample(1:10, nrow(df), T)
m <- sparseMatrix(
i = as.integer(df$user),
j = as.integer(df$item),
x = df$rating,
dimnames = list(levels(df$user), levels(df$item))
)