Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R数据帧变换_R_Recommendation Engine - Fatal编程技术网

R数据帧变换

R数据帧变换,r,recommendation-engine,R,Recommendation Engine,我有一个数据框,如下所示,每一行代表一个事务(即用户001听了Nirvana,也听了Metallica,但不是Slayer) 现在我需要对其进行预处理,以进行基于项目的推荐。我需要在歌曲元素之间建立一个余弦相似矩阵 nirvana metallica slayer nirvana 0.2 0 metallica 0.24 0 slaye

我有一个数据框,如下所示,每一行代表一个事务(即用户001听了Nirvana,也听了Metallica,但不是Slayer)

现在我需要对其进行预处理,以进行基于项目的推荐。我需要在歌曲元素之间建立一个余弦相似矩阵

             nirvana       metallica      slayer
nirvana                    0.2            0
metallica    0.24                         0
slayer       0             0               

这是为了建立一个推荐系统,所以如果有人能给我指出正确的方向或给我一个方法,我将不胜感激

我建议使用arules包并传递用户ID和艺术家。包装上有很清楚的说明。快速简单。。。生成的规则具有高质量

假设您需要基于商品的CF,而其他什么都不行,请尝试Recommender Lab package。它有预构建的功能,可能会有所帮助,尽管我发现它很脆弱,而且没有太多文档


我发现大多数人将推荐引擎和协同过滤视为同义词,其实它们根本不是

执行此操作的步骤包括:

  • 转换数据集
  • 创建歌曲/歌曲数据帧
  • 计算每个单元格的余弦相似性
  • 转换

    为了转换数据集,我们使用plyr库获取国家为德国的子集(我只对德国感兴趣) 图书馆(plyr)
    data.germany一种方法我在一个项目中必须同时使用这两种方法^ ^我早些时候看到了推荐人实验室,我同意这看起来相当可疑。我想出了一个解决方案,我现在就提出。
                 nirvana       metallica      slayer
    nirvana                    0.2            0
    metallica    0.24                         0
    slayer       0             0               
    
    germany.frequency<-as.data.frame((table(data.germany$user,data.germany$artist,dnn=c("user","artist"))))
    
    germany.frequency<-subset(germany.frequency,Freq>=1)
    
    germany.users <- as.matrix(unique(data.germany$user))
    germany.artists <- as.matrix(unique(data.germany$artist))
    holder <- matrix(NA, nrow=nrow(germany.users),ncol=nrow(germany.artists),dimnames=list((germany.users),(germany.artists)))
    holder[,] <- 0
    for(i in 1:nrow(holder)) {
      for(j in 1:ncol(holder)) {
        if(nrow(subset(germany.frequency, (user == rownames(holder)[i] & artist ==    colnames(holder)[j])))>0)
        {  holder[i,j]<-1 }  
      }
    }
    
    # Reorder the column names alphabetically
    data.germany<-(holder[,order(colnames(holder))])
    
    data.germany.ibs <- (data.germany[,!(names(data.germany) %in% c("user"))])
    
    getCosine <- function(x,y) 
    {
      this.cosine <- sum(x*y) / (sqrt(sum(x*x)) * sqrt(sum(y*y)))
      return(this.cosine)
    }
    
    holder <- matrix(NA, nrow=ncol(data.germany.ibs),ncol=ncol(data.germany.ibs),dimnames=list(colnames(data.germany.ibs),colnames(data.germany.ibs)))
    
    data.germany.ibs.similarity <- as.data.frame(holder)
    
    for(i in 1:ncol(data.germany.ibs)) {
        for(j in 1:ncol(data.germany.ibs)) {
          data.germany.ibs.similarity[i,j]= getCosine(data.germany.ibs[i],data.germany.ibs[j])
    }
    
    write.csv(data.germany.ibs.similarity,file="final-germany-similarity.csv")
    
    data.germany.neighbours <- matrix(NA, nrow=ncol(data.germany.ibs.similarity),ncol=11,dimnames=list(colnames(data.germany.ibs.similarity)))
    
    for(i in 1:ncol(data.germany.ibs)) 
    {
        data.germany.neighbours[i,] <- (t(head(n=11,rownames(data.germany.ibs.similarity[order(data.germany.ibs.similarity[,i],decreasing=TRUE),][i]))))
    }
    
      write.csv(file="final-germany-item-neighbours.csv",x=data.germany.neighbours[,-1])