R数据帧转换

时间:2014-03-06 16:12:01

标签: r recommendation-engine

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

userid   artist      gender    country
001      nirvana     m         germany
001      metallica   m         germany
002      slayer      m         usa
003      nirvana     m         germany
003      metallica   m         germany
...      ...         ...       ...

现在我需要对此进行预处理以执行基于项目的推荐。我需要以某种方式最终得到歌曲元素之间的余弦相似度矩阵

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

这是建立一个推荐系统,所以如果有人能指出我正确的方向或给我一个方法我会很感激。

2 个答案:

答案 0 :(得分:1)

方式

执行此操作的步骤包括:

  1. 转换数据集
  2. 创建歌曲/歌曲数据框
  3. 计算每个单元格的余弦相似度
  4. <强>转化

    要转换数据集,我们使用plyr库来获取Country是德国的子集(我只对德国感兴趣)     库(plyr)     data.germany&lt ;-(data [data $ country%in%&#34; Germany&#34;,])

    然后我们想创建一个频率表,我们只想要用户收听的歌曲

    germany.frequency<-as.data.frame((table(data.germany$user,data.germany$artist,dnn=c("user","artist"))))
    
    germany.frequency<-subset(germany.frequency,Freq>=1)
    

    然后我们填充二进制矩阵,其中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))])
    

    我们现在已经阅读了持有人矩阵。注意:对于循环需要很长时间在R.

    基于项目的相似性

    删除用户列并创建一个新数据框

    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")
    

    获取每个

    的前10名邻居
    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])
    

答案 1 :(得分:0)

我建议使用arules包并传递用户ID和艺术家。该包装有非常明确的说明。快速而简单......生成的规则具有高质量。

假设您需要基于项目的CF并且没有别的办法,请尝试使用推荐实验室软件包。它有预先构建的功能可能会有所帮助,虽然我发现它很脆弱,而且没有很多文档。

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