在recommenderlab R包中,在基于二进制评分矩阵预测
UBCF
时,为什么脚本在knn(k
最近邻居)相似性和项目的新输入二进制评分之间进行交叉生成?我正在写一项研究,我想知道为什么这是一个好方法。
预测结果在购物篮推荐方面非常好,我对
crossprod
有用感到困惑。
如此处所述,在
UBCF
中,缺失的评分被预测为相似(相邻)用户的聚合评分。
一旦找到附近的用户,他们的评分就会被聚合以形成活跃用户的预测评分
u_a
(如下所示)。
现在,
crossprod()
用于计算加权平均值(当权重相等时也可用于计算简单平均值)。给定矩阵 x
、y
,矩阵叉积由 crossprod()
计算为 t(x) %*% y
或 t(y) %*% x
(来自 文档)。
取文档中的以下示例,如下图所示:
这里,u_1、u_2 和 u_4 是活跃用户 u_a 的邻居用户,其中缺少 4 个项目的评分。让我们看看如何使用
crossprod()
分别通过相邻用户评分的简单平均值和加权平均值来计算缺失的评分(使用类似于 原始实现 的代码)。
r_neighbors <- matrix(c(NA, 4.0, 4.0, 2.0, 1.0, 2.0, NA, NA,
3.0, NA, NA, NA, 5.0, 1.0, NA, NA,
4.0, NA, NA, 2.0, 1.0, 1.0, 2.0, 4.0), nrow=3, byrow=T)
u_a <- matrix(c(NA,NA,4.0,3.0,NA,1.0,NA,5.0), nrow=1)
# simple average of neighbor ratings, with all weights equal to 1
s_uk <- matrix(rep(1, 3), ncol=1)
r_a <- as(crossprod(replace(r_neighbors, is.na(r_neighbors), 0), s_uk), "matrix") /
as(crossprod(!is.na(r_neighbors), s_uk), "matrix")
u_a[is.na(u_a)] <- r_a[is.na(u_a)]
u_a
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 3.5 4 4 3 2.333333 1 2 5
以上评级与图中计算的评级完全一致。
如果您想使用基于用户相似性的权重,相同的代码将完成这项工作,这次使用相似性权重,
u_a <- matrix(c(NA,NA,4.0,3.0,NA,1.0,NA,5.0), nrow=1)
s_uk <- matrix(c(0.3, 1.0, 0.3), ncol=1)
r_a <- as(crossprod(replace(r_neighbors, is.na(r_neighbors), 0), s_uk), "matrix") /
as(crossprod(!is.na(r_neighbors), s_uk), "matrix")
u_a[is.na(u_a)] <- r_a[is.na(u_a)]
u_a
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 3.230769 4 4 3 3.5 1 2 5