方法
做到这一点的步骤包括:
- 变换所述数据集
- 创建歌曲/歌曲数据帧
- 计算余弦相似度为每个小区
转型
要改变我们使用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])
[这里](http://stackoverflow.com/questions/14340275/how-to-compute-cosine-similarity-using-two-matrices)一种方法 –