我正在做一项作业,尝试为 Netflix 奖项数据构建协作过滤模型。我使用的数据位于 CSV 文件中,我可以轻松地将其导入到数据框中。现在我需要做的是创建一个稀疏矩阵,其中用户作为行,电影作为列,每个单元格都由相应的评级值填充。当我尝试绘制数据框中的值时,我需要为数据框中的每一行运行一个循环,这在 R 中花费了大量时间,请任何人都可以建议更好的方法。这是示例代码和数据:
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);
}
创建稀疏矩阵的数据帧中的数据示例:
MovieID UserID Rating
1 1 2 3
2 2 3 3
3 2 4 4
4 2 6 3
5 2 7 3
所以最后我想要这样的东西:
列是电影 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 星,用户 3 将电影 2 评为 3 星,对于其他用户和电影依此类推。我的数据框中约有 8500000 行,我的代码只需大约 30-45 分钟即可创建此用户项矩阵,我想得到任何建议
The Matrix
包有一个专门为您的数据类型制作的构造函数:
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);
}
(但我绝对会推荐sparseMatrix
对此的方法。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)