[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)

你可能感兴趣的:([R]可能是史上代码最少的协同过滤推荐引擎)