2014-03-06 121 views
0

我有一个数据帧如下,每一行代表交易(即用户001收听涅,并且还听取Metallica的,但不是杀手)R数据帧变换

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    

这是构建一个推荐系统,因此,如果任何人都可以点我在正确的方向,或给我,我将不胜感激的方法之间的余弦相似矩阵莫名其妙地结束了。

+0

[这里](http://stackoverflow.com/questions/14340275/how-to-compute-cosine-similarity-using-two-matrices)一种方法 –

回答

1

方法

做到这一点的步骤包括:

  1. 变换所述数据集
  2. 创建歌曲/歌曲数据帧
  3. 计算余弦相似度为每个小区

转型

要改变我们使用plyr库来获得子集,其中国家是德国的数据集(我只是在德国有兴趣) 库(plyr) data.germany < - (数据[$国家在% %“德国”,])

然后,我们要创建一个频率表,我们只希望用户听了

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

我们现在有我们的持有人矩阵读取。注意:For循环在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]) 
0

我推荐使用arules包并传递用户标识和艺术家。该软件包有非常明确的说明。快速和简单...生成的规则是高质量的。

假设你需要需要基于项目的CF,没有别的办法,请尝试Recommender Lab软件包。它具有预构建的功能,虽然我发现它很薄,并且没有很多文档,但可能会有所帮助。

我发现大多数人认为推荐引擎和协作过滤是同义词,当他们根本没有。

+0

我必须同时使用这两个项目^ _^ 我刚才看到推荐人实验室,我同意这看起来很不好意思。我破解了我现在要解决的一个解决方案。 – salemmarafi