R 从数据帧创建稀疏矩阵
我正在做一项作业,试图为Netflix大奖数据建立一个协作过滤模型。我使用的数据是在一个CSV文件中,我可以轻松地将其导入到数据框中。现在我需要做的是创建一个稀疏矩阵,由用户作为行,电影作为列组成,每个单元格由相应的评级值填充。当我试图在数据框中映射出值时,我需要为数据框中的每一行运行一个循环,这在R中花费了很多时间,请大家推荐一个更好的方法。以下是示例代码和数据:R 从数据帧创建稀疏矩阵,r,machine-learning,sparse-matrix,R,Machine Learning,Sparse Matrix,我正在做一项作业,试图为Netflix大奖数据建立一个协作过滤模型。我使用的数据是在一个CSV文件中,我可以轻松地将其导入到数据框中。现在我需要做的是创建一个稀疏矩阵,由用户作为行,电影作为列组成,每个单元格由相应的评级值填充。当我试图在数据框中映射出值时,我需要为数据框中的每一行运行一个循环,这在R中花费了很多时间,请大家推荐一个更好的方法。以下是示例代码和数据: buildUserMovieMatrix <- function(trainingData) { UIMatrix &l
buildUserMovieMatrix <- function(trainingData)
{
UIMatrix <- Matrix(0, nrow = max(trainingData$UserID), ncol = max(trainingData$MovieID), sparse = T);
for(i in 1:nrow(trainingData))
{
UIMatrix[trainingData$UserID[i], trainingData$MovieID[i]] = trainingData$Rating[i];
}
return(UIMatrix);
}
所以最后我想要这样的东西:
列是电影ID,行是用户ID
1 2 3 4 5 6 7
1 0 0 0 0 0 0 0
2 3 0 0 0 0 0 0
3 0 3 0 0 0 0 0
4 0 4 0 0 0 0 0
5 0 0 0 0 0 0 0
6 0 3 0 0 0 0 0
7 0 3 0 0 0 0 0
所以解释是这样的:用户2将电影1评为三星级,用户3将电影2评为三星级,其他用户和电影依此类推。在我的数据框中大约有8500000行,我的代码只需要30-45分钟就可以创建这个用户项矩阵,我想得到任何建议,这可能比循环快
library(reshape2)
m <- dcast(df,UserID~MovieID,fill=0)[-1]
m
# 1 2
# 1 3 0
# 2 0 3
# 3 0 4
# 4 0 3
# 5 0 3
library(重塑2)
m矩阵包有一个专门为您的数据类型制作的构造函数:
library(Matrix)
UIMatrix <- sparseMatrix(i = trainingData$UserID,
j = trainingData$MovieID,
x = trainingData$Rating)
(但我绝对推荐使用sparseMatrix
方法。),此方法无法正确映射用户ID和电影ID,例如,用户11从培训数据中丢失,因此现在在第11行中,我有用户12的用户ID和电影ID评级,随后所有行都被1移位,我的训练集中有10916个用户,我希望将所有用户都保留在我的用户项矩阵中,如果我的训练数据中缺少用户,我可以将整行向量标记为零,这将防止训练数据帧和我的矩阵中出现任何不匹配的情况,你可以建议其他方法吗,谢谢sparseMatrix方法比第二种方法工作得更快,谢谢。:)
library(data.table)
DT <- as.data.table(df)
m <- dcast(DT,UserID~MovieID,fill=0)[-1]
setDT(df)
m <- dcast(df,UserID~MovieID,fill=0)[-1]
library(Matrix)
UIMatrix <- sparseMatrix(i = trainingData$UserID,
j = trainingData$MovieID,
x = trainingData$Rating)
buildUserMovieMatrix <- function(trainingData) {
UIMatrix <- Matrix(0, nrow = max(trainingData$UserID),
ncol = max(trainingData$MovieID), sparse = TRUE);
UIMatrix[cbind(trainingData$UserID,
trainingData$MovieID)] <- trainingData$Rating;
return(UIMatrix);
}