我正在做一项任务,我正在尝试为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);
}
Run Code Online (Sandbox Code Playgroud)
从中创建稀疏矩阵的数据框中的数据样本:
MovieID UserID Rating
1 1 2 3
2 2 3 3
3 2 4 4
4 2 6 3
5 2 7 3
Run Code Online (Sandbox Code Playgroud)
所以最后我想要这样的东西:列是电影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 …Run Code Online (Sandbox Code Playgroud) 我一直在玩 MNIST 数字识别数据集,但我有点卡住了。我通读了一些研究论文并实施了我所理解的。基本上我所做的是首先创建我的训练集和交叉验证集来评估我的分类器,然后我在我的测试集和训练集上运行 PCA,之后我使用 KNN 和 SVM 来执行分类任务。我面临的主要问题是,我应该在所有集合上运行 PCA,然后将我的训练集和交叉验证集分开,还是将它们分开,然后在交叉验证测试和训练集上单独运行 PCA。我很抱歉问了我已经尝试过的事情,因为我已经尝试了这两种情况,在第一种情况下,我的分类器表现出色,因为我猜 PCA 在创建调整我的结果的主要组件时使用了测试数据集,这可能是我的模型中存在偏差的原因,在另一种情况下,性能约为 20% 到 30%,这是非常低的。所以我有点困惑我应该如何改进我的模型,非常感谢任何帮助和指导,我在下面粘贴了我的代码以供参考。
library(ggplot2)
library(e1071)
library(ElemStatLearn)
library(plyr)
library(class)
import.csv <- function(filename){
return(read.csv(filename, sep = ",", header = TRUE, stringsAsFactors = FALSE))
}
train.data <- import.csv("train.csv")
test.data <- train.data[30001:32000,]
train.data <- train.data[1:6000,]
#Performing PCA on the dataset to reduce the dimensionality of the data
get_PCA <- function(dataset){
dataset.features <- dataset[,!(colnames(dataset) %in% c("label"))]
features.unit.variance <- names(dataset[, sapply(dataset, function(v) var(v, na.rm=TRUE)==0)])
dataset.features <- dataset[,!(colnames(dataset) %in% features.unit.variance)]
pr.comp <- prcomp(dataset.features, retx = …Run Code Online (Sandbox Code Playgroud) 我想从例如稀疏矩阵的第i行的非零值中减去矢量的第i个值
[,1] [,2] [,3] [,4]
[1,] 0 0 4 0
[2,] 0 5 0 3
[3,] 1 2 0 0
Run Code Online (Sandbox Code Playgroud)
这是我试图减去的向量:
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)
所以我最终需要的是:
[,1] [,2] [,3] [,4]
[1,] 0 0 3 0
[2,] 0 3 0 1
[3,] -2 -1 0 0
Run Code Online (Sandbox Code Playgroud)
我试过这个使用申请,但一直无法解决问题,它并没有让我回想起我想要的东西.矩阵的尺寸太大,我不想使用循环.感谢致敬.