方法
执行此操作的步骤包括:
- 转换数据集
- 创建歌曲/歌曲数据框
- 计算每个单元格的余弦相似度
转型
为了转换数据集,我们使用 plyr 库来获取 Country 为 Germany 的子集(我只对德国感兴趣)
图书馆(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))])
我们现在读取了持有人矩阵。注意:R 中的 for 循环需要很长时间。
基于项目的相似性
删除用户列并创建一个新的数据框
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])