Recommenderlab:通过 UBCF 二元评分矩阵预测

问题描述 投票:0回答:1

在recommenderlab R包中,在基于二进制评分矩阵预测

UBCF
时,为什么脚本在knn(
k
最近邻居)相似性和项目的新输入二进制评分之间进行交叉生成?我正在写一项研究,我想知道为什么这是一个好方法。

预测结果在购物篮推荐方面非常好,我对

crossprod
有用感到困惑。

r statistics collaborative-filtering cross-product recommenderlab
1个回答
0
投票

此处所述,在

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
© www.soinside.com 2019 - 2024. All rights reserved.