[R]可能是史上代码最少的协同过滤推荐引擎

可能是史上代码最少的协同过滤推荐引擎 – 不周山
http://www.wentrue.net/blog/?p=970

实际上是用R实现的item-based CF推荐算法。

读入数据,原数据是user-subject的收藏二元组

data = read.table('data.dat', sep=',', header=TRUE)

标识user与subject的索引

user = unique(data$user_id)
subject = unique(data$subject_id)
uidx = match(data$user_id, user)
iidx = match(data$subject_id, subject)

从二元组构造收藏矩阵

M = matrix(0, length(user), length(subject))
i = cbind(uidx, iidx)
M[i] = 1

对列向量(subject向量)进行标准化,%*%为矩阵乘法

mod = colSums(M2)0.5 # 各列的模
MM = M %*% diag(1/mod) # M乘以由1/mod组成的对角阵,实质是各列除以该列的模

crossprod实现MM的转置乘以MM,这里用于计算列向量的内积,S为subject的相似度矩阵

S = crossprod(MM)

user-subject推荐的分值

R = M %*% S
R = apply(R, 1, FUN=sort, decreasing=TRUE, index.return=TRUE)
k = 5

取出前5个分值最大的subject

res = lapply(R, FUN=function(r)return(subject[r$ix[1:k]]))

输出数据

write.table(paste(user, res, sep=':'), file='result.dat', quote=FALSE, row.name=FALSE, col.name=FALSE)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容