[R]可能是史上程式碼最少的協同過濾推薦引擎

weixin_33727510發表於2017-09-23

可能是史上程式碼最少的協同過濾推薦引擎 – 不周山
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)

相關文章