[英]R data frame transformation
我有一个数据框,如下所示,每一行代表一个事务(即用户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
这是为了建立一个推荐系统,因此,如果有人可以向我指出正确的方向或给我一种方法,我将不胜感激。
方法
为此,需要执行以下步骤:
转型
为了转换数据集,我们使用plyr库来获取Country是德国(我只对德国感兴趣)的子集library(plyr)data.germany <-(data [data [data $ country%in%“ 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])
我建议使用arules软件包并传递userid和artist。 该软件包有非常清晰的说明。 快速简单...生成的规则质量很高。
假设您需要基于项目的CF,并且没有其他操作,请尝试使用Recommender Lab软件包。 它具有预构建的功能,尽管我发现它不可靠并且没有很多文档,但可能会有所帮助。
我发现大多数人根本不将推荐引擎和协作过滤视为同义词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.