我有一个数据框如下,每行代表一个事务(即用户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
这是建立一个推荐系统,所以如果有人能指出我正确的方向或给我一个方法我会很感激。
答案 0 :(得分:1)
方式强>
执行此操作的步骤包括:
<强>转化强>
要转换数据集,我们使用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并且没有别的办法,请尝试使用推荐实验室软件包。它有预先构建的功能可能会有所帮助,虽然我发现它很脆弱,而且没有很多文档。
我发现大多数人将推荐引擎和协同过滤视为同义词,而不是根本不同。