项目 | 信息 |
---|---|
名称 | Item-Based Top- N N N Recommendation Algorithms |
作者 | Mukund Deshpande,George Karypis |
期刊 | ACM Transactions on Information Systems (TOIS) |
年份 | 2004 |
卷 | 22 |
期 | 1 |
页码 | 143—177 |
DOI | https://doi.org/10.1145/963770.963776 |
引用量 | 2930 |
这篇文章的重点是一类特定的基于模型的 top- N N N 推荐算法,该算法通过分析各个项目之间的相似性构建推荐模型,然后使用这些相似的项目来识别要推荐的项目集。
这篇文章的贡献分为两个部分。
第一个贡献,详细研究了影响基于项目的 top- N N N 推荐算法性能的两个关键步骤。
在第一步中,作者研究了两中不同计算项目–项目之间相似度的方法。第一个建模为用户空间中的向量,并使用余弦函数来测量相似度。另一个则使用基于两个项目之间的条件概率的技术来计算项目到项目的相似性。在第二步中,作者提出了一种组合这些相似性的方法,该方法解释了可能错误地偏向整体推荐的不同密度的项目邻域。
第二个贡献,是将这些基于项目的方案扩展到高阶模型,这些模型通过利用项目集之间的关系来获得最终推荐。作者提出了一类基于插值的高阶项目的 top- N N N 推荐算法,该算法通过首先确定各种项目集–项目的相似性,然后将它们组合以确定用户的购物篮和候选推荐项目之间的相似性来构建推荐模型。
符号 | 含义 |
---|---|
n n n | 不同用户的数量(the number of distinct users)。 |
m m m | 不同项目的数量(the number of distinct items)。 |
N N N | 需要为特定用户计算的推荐数量。 |
customers | 消费者,users 的同义词(synonym)。 |
products | 产品,items 的同义词(synonym)。 |
dataset | 有关不同用户已购买的物品的交易集。 |
R R R | 用户–项目的二元矩阵,维度是 n × m n\times m n×m。 |
R i , j R_{i, j} Ri,j | 取值为 { 0 , 1 } \{0, 1\} {0,1}。1 表示第 i 个消费者购买了第 j 个项目;否则为 0。 |
active user | 想要为其计算 top- N N N 推荐的用户。 |
定义1(top- N N N 推荐问题):给定用户–项目矩阵 R R R 和一个用户已购买的项目集 U U U,识别有序项目集 X X X,满足 ∣ X ∣ ≤ N \left| X \right| \leq N ∣X∣≤N 且 X ∩ U = ∅ X \cap U = \empty X∩U=∅。
使用项目与项目相似度来计算不同项目之间相关性的一类基于模型的 top- N N N 推荐算法。
这些算法背后的主要动机是一个消费者更倾向于购买和过去他/她曾经购买过的项目相似的项目。因此,通过分析历史购买信息,就可以自动识别这些相似项目的集合,并使用它们来形成 top- N N N 推荐。
在高层次上,这些算法由两个不同的组件组成。第一个组件构建一个模型来捕获不同项目之间的相关性,第二个组件应用这个预先计算的模型来为活动用户获得 top- N N N 推荐。
算法流程(伪代码)如下图所示。
输入变量 | 含义 |
---|---|
R R R | n × m n\times m n×m 的用户–项目矩阵。 |
k k k | 参数,它指定将为每个项目存储的项目到项目相似性的数量。 |
输出变量 | 含义 |
---|---|
M \mathcal{M} M | 模型本身, m × m m \times m m×m 的矩阵,第 j j j 列存储了和项目 j j j 最相似的 k k k 个项目。 M i , j \mathcal{M}_{i,j} Mi,j 的值表示项目 j j j 和项目 i i i 之间的相似度。 |
对于项目 j j j 来说( j j j 从 1 1 1 变化到 m m m),分为两步:
M \mathcal{M} M 对 k k k 的参数化是出于对性能的考虑,它的选择代表了性能质量的权衡。
一般来说,两个项目 i i i 和 j j j,如果有很多客户都购买了这两个项目,那么它们之间的相似度应该很高。
如果这样的客户很少,则应该很低。
还需要考虑两个不太明显的方面:
基于余弦的相似度(cosine-based similarity),是一个对称相似度方法(symmetric)。
R R R 是一个 n × m n \times m n×m 用户–项目矩阵,项目 i i i 和项目 j j j 的相似度定义为对应于 R R R 矩阵中第 i i i 列和第 j j j 列 n n n 维向量的余弦。这些向量之间的余弦定义为:
sim ( i , j ) = cos ( R ⃗ ∗ , i , R ⃗ ∗ , j ) = R ⃗ ∗ , i ⋅ R ⃗ ∗ , j ∥ R ⃗ ∗ , i ∥ 2 ∥ R ⃗ ∗ , j ∥ 2 , (1) \qquad \qquad \text{sim}(i,j)=\cos(\vec{R}_{\ast, i}, \vec{R}_{\ast, j}) = \cfrac{\vec{R}_{\ast, i} \cdot \vec{R}_{\ast, j}}{\Vert \vec{R}_{\ast, i} \Vert_2 \Vert \vec{R}_{\ast, j} \Vert_2}, \qquad \qquad \qquad \textbf{(1)} sim(i,j)=cos(R∗,i,R∗,j)=∥R∗,i∥2∥R∗,j∥2R∗,i⋅R∗,j,(1)其中 “ ⋅ \cdot ⋅” 是向量的点击操作。
结果,经常购买的物品将倾向于与其他经常购买的物品相似,而不是与不经常购买的物品相似,反之亦然。在最简单的形式中, R R R 的行可以对应于原始的二进制购买信息,在这种情况下,余弦相似度函数对购买少量和大量商品的客户一视同仁。但是,可以对每一行进行缩放,以便生成的基于余弦的相似度函数可以区分这些客户集。这可以通过将每一行缩放为单位长度(或任何其他范式)来完成。这种缩放的效果是,购买较少商品的客户将比购买更多商品的客户对等式中的点积贡献更高的权重。
基于条件概率的相似性(conditional probability-based similarity),是一个非对称相似度方法(asymmetric)。
在已经购买的 i i i 的情况下购买 j j j 的条件概率 P ( j ∣ i ) P(j\mid i) P(j∣i) 只不过是同时购买商品 i i i 和 j j j 的顾客数量除以购买 i i i 的顾客总数,即
P ( j ∣ i ) = Freq ( i j ) Freq ( i ) . P(j \mid i)=\cfrac{\text{Freq}(ij)}{\text{Freq}(i)}. P(j∣i)=Freq(i)Freq(ij).其中 Freq ( X ) \text{Freq}(X) Freq(X) 是购买集合 X X X 中商品的客户数量。记住,一般的, P ( j ∣ i ) ≠ P ( i ∣ j ) P(j \mid i)\neq P(i \mid j) P(j∣i)=P(i∣j)。
如前所述,使用非对称相似度函数的一个限制是,每件商品 i i i 都倾向于与经常购买的商品有较高的条件概率。这个问题可以通过将 P ( j ∣ i ) P(j \mid i) P(j∣i) 除以一个取决于项目 j j j 出现频率的量来纠正。已经提出了两种不同的方法来实现这一点。受信息检索系统中执行的逆文档频率缩放的启发,
实验表明,这种缩放极大地影响了推荐系统的性能,并且最佳缩放程度取决于问题。由于这些原因,文章使用以下公式来计算两个项目之间的相似度:
sim ( i , j ) = Freq ( i j ) Freq ( i ) × ( Freq ( j ) ) α , (2) \qquad\qquad\qquad\qquad\qquad\text{sim}(i,j)=\cfrac{\text{Freq}(ij)}{\text{Freq}(i)\times (\text{Freq}(j))^{\alpha}}, \qquad \qquad \qquad \qquad \textbf{(2)} sim(i,j)=Freq(i)×(Freq(j))αFreq(ij),(2)其中 α \alpha α 是取值为 0 到 1 之间的参数。当 α = 0 \alpha=0 α=0 时,就是 P ( j ∣ i ) P(j\mid i) P(j∣i)。当 α = 1 \alpha=1 α=1 时,它变得与 P ( j ∣ i ) P( j \mid i) P(j∣i) 除以 P ( j ) P(j) P(j) 的公式相似(直到一个比例因子)。
公式(2)的相似性方法没有区分购买不同数量项目的用户。为实现这种区分并赋予购买较少商品的客户更高的权重,通过以下方式扩展了公式(2)的相似性度量:首先将矩阵 R R R 的每一行归一化为单位长度,然后定义物品 i i i 和 j j j 之间的相似度:
sim ( i , j ) = ∑ ∀ q : R q , j > 0 R q , j Freq ( i ) × ( Freq ( j ) ) α . (3) \qquad \qquad \qquad \text{sim}(i,j)=\cfrac{\sum_{\forall q: R_{q, j} > 0} R_{q,j}}{\text{Freq}(i) \times (\text{Freq}(j))^{\alpha}}. \qquad \qquad \qquad \qquad \textbf{(3)} sim(i,j)=Freq(i)×(Freq(j))α∑∀q:Rq,j>0Rq,j.(3)
公式(2)和公式(3)的区别是,取而代之使用在用户–项目矩阵第 j j j 列的相应非零条目的总和,而不是使用共现频率。由于行被标准化为单位长度,购买更多商品的客户往往对整体相似性的贡献较小。这强调了购买较少商品的客户的购买决策。
输入变量 | 含义 |
---|---|
M \mathcal{M} M | 模型。 |
U U U | 存储活跃用户已购买项目的 m × 1 m \times 1 m×1 向量。向量 U U U 中活跃用户的信息编码为如果用户购买了第 i i i 个项目则设置 U i = 1 U_i=1 Ui=1,否则设置为 0。 |
N N N | 将要推荐的项目数量。 |
输出变量 | 含义 |
---|---|
x x x | m × 1 m \times 1 m×1 向量,非零条目对应推荐的 top- N N N 项目。 |
这些非零条目的权重表示推荐强度的度量,并且可以以非增加的推荐强度权重对各种推荐进行排序。在大多数情况下, x x x 将恰好有 N N N 个非零条目。然而,推荐的实际数量可能小于 N N N,因为它取决于用于构建 M \mathcal{M} M 的 k k k 的值以及活跃用户已经购买的商品数量。
向量 x x x 分三步计算。
算法 4.2 的一个潜在缺点是每个项目 j j j 与其 k k k 个最相似的项目之间的原始相似性可能显著不同。也就是说,项目邻域具有不同的密度。对于不经常购买的物品尤其如此,因为与其他不经常购买的物品的适度重叠会导致相对较高的相似度值。因此,这些项目可以对 top- N N N 项目的选择产生很大的影响,有时会导致错误的推荐。出于这个原因,文章不使用第 4.1.1 节中描述的各种方法计算的实际相似度,而是首先对每个项目 j j j 进行归一化,使它们相加为 1。即 ∥ M ∗ , j ∥ = 1 \Vert \mathcal{M}_{\ast, j} \Vert=1 ∥M∗,j∥=1,对于 j = 1 , . . . , m j = 1, . . . ,m j=1,...,m。正如实验所示,这总是可以提高 top-N 推荐质量。
对于每一个项目,需要计算其与 R R R 中的其它项目之间的相似性,那么需要计算 ( m − 1 ) (m-1) (m−1) 次。所有的项目与项目之间的相似性,则总计需要计算 m ( m − 1 ) m(m-1) m(m−1) 次。计算一个项目与另一个项目之间的相似性,时间复杂度为 O ( n ) O(n) O(n)。所以模型构建这一步的复杂度上限为 O ( m 2 n ) O(m^2n) O(m2n)。实际复杂度要显著小于这个复杂度,因为相似度矩阵是极其稀疏的。
最后为每一个已购买 q q q 个项目的活跃用户计算 top- N N N 推荐的时间为 O ( k q ) O(kq) O(kq),因为需要访问用户已购买的每一个项目的 k k k 个最相似的项目,并识别出总体上 N N N 个最相似的物品。
到目前为止,文章的讨论主要集中在基于项目的 top- N N N 推荐算法上,其中推荐是通过考虑项目对(pairs of item)之间的关系来计算的,也就是说,对于活动用户篮子中的每个项目,确定相似的项目并且这些相似的被聚合以获得所需的 top- N N N 推荐。
为了解决这个问题,文章开发了基于项目的 top- N N N 推荐方案,在确定要推荐给用户的项目集时,使用项目的所有组合(即项目集)直到特定大小 l l l。
算法 5.1 计算了 l l l 个不同的模型矩阵 M 1 \mathcal{M}^1 M1、 M 2 \mathcal{M}^2 M2、 … \dots …、 M l \mathcal{M}^l Ml,大小分别是 m × m m\times m m×m、 m × m 2 m \times m^2 m×m2、 … \dots …、 m × m l m \times m^l m×ml。对于 r r r 的一个特定值, M r \mathcal{M}^r Mr 是通过生成 r r r 个项目的所有可能组合来构建 { q 1 , q 2 , … , q r } \{q_1, q_2, \dots, q_r\} {q1,q2,…,qr}(行 1 的循环),计算这些集合与数据集中所有其他 m m m 个项目之间的相似性(行 2 的循环),其中仅保留 M r \mathcal{M}^r Mr 对应列中的 k k k 个最大相似度。
输入变量 | 含义 |
---|---|
R R R | 用户–项目购买矩阵。 |
l l l | 阶数。 |
k k k | 最大相似度的数目。 |
输出变量 | 含义 |
---|---|
M 1 , M 2 , … , M l \mathcal{M}^1,\mathcal{M}^2,\dots,\mathcal{M}^l M1,M2,…,Ml | 模型矩阵。 |
个 人 理 解 {\color{cyan}个人理解} 个人理解
第一个循环(行 1)我也没看懂,不知道怎么计算的,猜测大概是求了一个集合。这里利用计算来验证一下,顺便理解一下这个循环的功能。这里假设 l = 2 l=2 l=2, m = 10 m=10 m=10。
r = 1 r = 1 r=1 | j ∈ [ 1..1 0 1 ] j \in [1..10^1] j∈[1..101] | i ∈ [ 1..1 ] i \in [1..1] i∈[1..1] | q i ← ( ( j m o d m r − i + 1 ) div m r − i ) + 1 q_i \leftarrow \left( (j \bmod m^{r-i+1}) \operatorname{div} m^{r-i} \right) +1 qi←((jmodmr−i+1)divmr−i)+1 |
---|---|---|---|
1 | 1 | 1 | q 1 = ( ( 1 m o d 1 0 1 ) div 1 0 0 ) + 1 = 2 q_1=\left( (1 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 2 q1=((1mod101)div100)+1=2 |
1 | 2 | 1 | q 1 = ( ( 2 m o d 1 0 1 ) div 1 0 0 ) + 1 = 3 q_1=\left( (2 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 3 q1=((2mod101)div100)+1=3 |
… \dots … | … \dots … | … \dots … | … \dots … |
1 | 9 | 1 | q 1 = ( ( 9 m o d 10 0 1 ) div 1 0 0 ) + 1 = 10 q_1=\left( (9 \bmod 100^1) \operatorname{div} 10^0 \right) + 1 = 10 q1=((9mod1001)div100)+1=10 |
1 | 10 | 1 | q 1 = ( ( 10 m o d 10 0 1 ) div 1 0 0 ) + 1 = 1 q_1=\left( (10 \bmod 100^1) \operatorname{div} 10^0 \right) + 1 = 1 q1=((10mod1001)div100)+1=1 |
r = 2 r = 2 r=2 | j ∈ [ 1..1 0 2 ] j \in [1..10^2] j∈[1..102] | i ∈ [ 1..2 ] i \in [1..2] i∈[1..2] | q i ← ( ( j m o d m r − i + 1 ) div m r − i ) + 1 q_i \leftarrow \left( (j \bmod m^{r-i+1}) \operatorname{div} m^{r-i} \right) +1 qi←((jmodmr−i+1)divmr−i)+1 |
---|---|---|---|
2 | 1 | 1 | q 1 = ( ( 1 m o d 1 0 2 ) div 1 0 1 ) + 1 = 1 q_1=\left( (1 \bmod 10^2) \operatorname{div} 10^1 \right) + 1 = 1 q1=((1mod102)div101)+1=1 |
2 | 1 | 2 | q 2 = ( ( 1 m o d 1 0 1 ) div 1 0 0 ) + 1 = 2 q_2=\left( (1 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 2 q2=((1mod101)div100)+1=2 |
2 | 2 | 1 | q 1 = ( ( 2 m o d 1 0 2 ) div 1 0 1 ) + 1 = 1 q_1=\left( (2 \bmod 10^2) \operatorname{div} 10^1 \right) + 1 = 1 q1=((2mod102)div101)+1=1 |
2 | 2 | 2 | q 2 = ( ( 2 m o d 1 0 1 ) div 1 0 0 ) + 1 = 3 q_2=\left( (2 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 3 q2=((2mod101)div100)+1=3 |
… \dots … | … \dots … | … \dots … | … \dots … |
2 | 99 | 1 | q 1 = ( ( 99 m o d 1 0 2 ) div 1 0 1 ) + 1 = 10 q_1=\left( (99 \bmod 10^2) \operatorname{div} 10^1 \right) + 1 = 10 q1=((99mod102)div101)+1=10 |
2 | 99 | 2 | q 2 = ( ( 99 m o d 1 0 1 ) div 1 0 0 ) + 1 = 10 q_2=\left( (99 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 10 q2=((99mod101)div100)+1=10 |
2 | 100 | 1 | q 1 = ( ( 100 m o d 1 0 2 ) div 1 0 1 ) + 1 = 1 q_1=\left( (100 \bmod 10^2) \operatorname{div} 10^1 \right) + 1 = 1 q1=((100mod102)div101)+1=1 |
2 | 100 | 2 | q 2 = ( ( 100 m o d 1 0 1 ) div 1 0 0 ) + 1 = 1 q_2=\left( (100 \bmod 10^1) \operatorname{div} 10^0 \right) + 1 = 1 q2=((100mod101)div100)+1=1 |
循环 2 的功能是遍历所有的项目 i i i,计算 i i i 与 r r r 阶下第 j j j 个项目集 { q 1 , … , q r } \{q_1, \dots, q_r\} {q1,…,qr} 之间的相似度 M i , j r \mathcal{M}^r_{i, j} Mi,jr。如果 i i i 是 { q 1 , … , q r } \{q_1,\dots,q_r\} {q1,…,qr} 中的一员,那么相似度置为 0。如果不是,那么使用相似度计算公式获得。
举两个例子
当 r = 1 r=1 r=1, j = 1 j=1 j=1:
循环 1 得到的结果为 q 1 = 2 q_1=2 q1=2,那么 { q 1 , … , q r } = { q 1 } = { 2 } \{q_1,\dots,q_r\}=\{q_1\}=\{2\} {q1,…,qr}={q1}={2},这个就是选择好的项目集。
循环 2, i i i 从 1 变化到 m m m。当 i ∈ { 2 } i \in \{2\} i∈{2} 时,即 i i i 在项目集中,此时置 M j , j = 0 \mathcal{M}_{j,j}=0 Mj,j=0。当 i ∉ { 2 } i \not \in \{2\} i∈{2} 时,即 i i i 不在项目集中,此时计算第 i i i 个项目的购买数据 R ∗ , i R_{\ast, i} R∗,i 与项目集的购买数据 { R ∗ , 2 } \{R_{\ast, 2}\} {R∗,2} 之间的相似度,并将其赋值给 M i , j 1 \mathcal{M}^1_{i,j} Mi,j1。所以出现一个 M j , j \mathcal{M}_{j,j} Mj,j 是什么操作?
i i i | i ∈ { q 1 , … , q r } i \in \{q_1,\dots, q_r\} i∈{q1,…,qr} | M i , j r or M j , j \mathcal{M}^r_{i,j} \operatorname{or} \mathcal{M}_{j,j} Mi,jrorMj,j |
---|---|---|
1 | False | M 1 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 1 ) \mathcal{M}^1_{1,1} = \operatorname{sim}(\{R_{\ast, 2}\},R_{\ast, 1}) M1,11=sim({R∗,2},R∗,1) |
2 | True | M 1 , 1 = 0 \mathcal{M}_{1, 1} = 0 M1,1=0 |
… \dots … | … \dots … | … \dots … |
9 | False | M 9 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 9 ) \mathcal{M}^1_{9, 1} = \operatorname{sim}(\{R_{\ast, 2}\}, R_{\ast, 9}) M9,11=sim({R∗,2},R∗,9) |
10 | False | M 10 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 10 ) \mathcal{M}^1_{10, 1}=\operatorname{sim}(\{R_{\ast, 2}\}, R_{\ast, 10}) M10,11=sim({R∗,2},R∗,10) |
所以我严重怀疑论文循环 2 写错了。
接下来,让我求证一下
当 r = 2 r=2 r=2, j = 98 j=98 j=98:
循环 1 得到的结果为 q 1 = 10 , q 2 = 9 q_1=10,q_2=9 q1=10,q2=9,那么 { q 1 , q 2 , … , q r } = { 10 , 9 } \{q_1,q_2,\dots,q_r\}=\{10,9\} {q1,q2,…,qr}={10,9},这就是选择好的项目集。
i i i | i ∈ { q 1 , … , q r } i \in \{q_1,\dots,q_r\} i∈{q1,…,qr} | M i , j r or M j , j \mathcal{M}^r_{i,j} \operatorname{or} \mathcal{M}_{j,j} Mi,jrorMj,j |
---|---|---|
1 | False | M 1 , 98 2 = sim ( { R ∗ , 10 , R ∗ , 9 } , R ∗ , 1 ) \mathcal{M}^2_{1,98}=\operatorname{sim}(\{R_{\ast, 10}, R_{\ast, 9}\}, R_{\ast, 1}) M1,982=sim({R∗,10,R∗,9},R∗,1) |
… \dots … | … \dots … | … \dots … |
9 | True | M 98 , 98 = 0 \mathcal{M}_{98,98}=0 M98,98=0 |
10 | True | M 98 , 98 = 0 \mathcal{M}_{98, 98}=0 M98,98=0 |
前文提到 M r \mathcal{M}^r Mr 的维度为 m × m r m \times m^r m×mr。这里 M 2 \mathcal{M}^2 M2 的维度为 98 ∗ 98 98*98 98∗98,而 m = 10 m =10 m=10,正确维度应该为 10 × 1 0 2 10\times 10^2 10×102。所以已经能确定图中的算法循环 2 是错误的。进一步地,循环 2 中出现了 M \mathcal{M} M,这个变量(矩阵)在算法中并没有使用。无用的变量拿来干嘛???那么有没有可能 M \mathcal{M} M 表示 r = 1 r=1 r=1 时的相似度矩阵呢?答案是:也不可能!因为算法最后一句返回了 M 1 \mathcal{M}^1 M1,说明当 r = 1 r=1 r=1 时,相似度是用 M 1 \mathcal{M}^1 M1 表示的。
综上两点可知,循环 2 是确实有误的。
经 过 上 面 的 分 析 , 循 环 2 是 错 误 的 , 正 确 形 式 为 : {\color{red}经过上面的分析,循环 2 是错误的,正确形式为:} 经过上面的分析,循环2是错误的,正确形式为:
M i , j r = { sim ( { R ∗ , q 1 , … , R ∗ , q r } , R ∗ , i ) , if i ∉ { q 1 , … , q r } ; 0 , otherwise . \mathcal{M}^r_{i,j}= \begin{cases} \operatorname{sim}(\{R_{\ast,q_1},\dots,R_{\ast,q_r}\}, R_{\ast,i}), & \text{if } i \not \in \{q_1,\dots,q_r\}; \\ 0, & \text{otherwise}. \end{cases} Mi,jr={sim({R∗,q1,…,R∗,qr},R∗,i),0,if i∈{q1,…,qr};otherwise.
经过修改后,算法的循环 2 就正确表达了论文作者的意图。(PS:但是循环 1 还存在问题,这里不再讨论。)
修改后的循环 1 和循环 2 的例子
当 r = 1 r=1 r=1, j = 1 j=1 j=1:
循环 1 得到的结果为 q 1 = 2 q_1=2 q1=2,那么 { q 1 , … , q r } = { q 1 } = { 2 } \{q_1,\dots,q_r\}=\{q_1\}=\{2\} {q1,…,qr}={q1}={2},这个就是选择好的项目集。
循环 2, i i i 从 1 变化到 m m m。当 i ∈ { 2 } i \in \{2\} i∈{2} 时,即 i i i 在项目集中,自身与自身的相似度置为 0,此时置 M i , 1 1 = 0 \mathcal{M}^1_{i,1}=0 Mi,11=0。当 i ∉ { 2 } i \not \in \{2\} i∈{2} 时,即 i i i 不在项目集中,此时计算第 i i i 个项目的购买数据 R ∗ , i R_{\ast, i} R∗,i 与项目集的购买数据 { R ∗ , 2 } \{R_{\ast, 2}\} {R∗,2} 之间的相似度,并将其赋值给 M i , 1 1 \mathcal{M}^1_{i,1} Mi,11。
i i i | i ∈ { 2 } i \in \{2\} i∈{2} | M i , 1 1 = sim ( { R ∗ , 2 } , R ∗ , i ) \mathcal{M}^1_{i,1}=\operatorname{sim}(\{R_{\ast, 2}\},R_{\ast,i}) Mi,11=sim({R∗,2},R∗,i) |
---|---|---|
1 | False | M 1 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 1 ) \mathcal{M}^1_{1,1} = \operatorname{sim}(\{R_{\ast, 2}\},R_{\ast, 1}) M1,11=sim({R∗,2},R∗,1) |
2 | True | M 2 , 1 1 = 0 \mathcal{M}^1_{2,1} = 0 M2,11=0 |
… \dots … | … \dots … | … \dots … |
9 | False | M 9 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 9 ) \mathcal{M}^1_{9, 1} = \operatorname{sim}(\{R_{\ast, 2}\}, R_{\ast, 9}) M9,11=sim({R∗,2},R∗,9) |
10 | False | M 10 , 1 1 = sim ( { R ∗ , 2 } , R ∗ , 10 ) \mathcal{M}^1_{10, 1}=\operatorname{sim}(\{R_{\ast, 2}\}, R_{\ast, 10}) M10,11=sim({R∗,2},R∗,10) |
当 r = 2 r=2 r=2, j = 98 j=98 j=98:
循环 1 得到的结果为 q 1 = 10 , q 2 = 9 q_1=10,q_2=9 q1=10,q2=9,那么 { q 1 , q 2 , … , q r } = { 10 , 9 } \{q_1,q_2,\dots,q_r\}=\{10,9\} {q1,q2,…,qr}={10,9},这就是选择好的项目集。
循环 2, i i i 从 1 变化到 m m m。当 i ∈ { 9 , 10 } i \in \{9,10\} i∈{9,10} 时,即 i i i 在项目集中,自身与自身的相似度置为 0,此时置 M i , 98 2 = 0 \mathcal{M}^2_{i,98}=0 Mi,982=0。当 i ∉ { 9 , 10 } i \not \in \{9,10\} i∈{9,10} 时,即 i i i 不在项目集中,此时计算第 i i i 个项目的购买数据 R ∗ , i R_{\ast, i} R∗,i 与项目集的购买数据 { R ∗ , 9 , R ∗ , 10 } \{R_{\ast, 9}, R_{\ast, 10}\} {R∗,9,R∗,10} 之间的相似度,并将其赋值给 M i , 98 2 \mathcal{M}^2_{i,98} Mi,982。
i i i | i ∈ { 9 , 10 } i \in \{9,10\} i∈{9,10} | M i , 98 2 = sim ( { R ∗ , 9 , R ∗ , 10 } , R ∗ , i ) \mathcal{M}^2_{i,98}=\operatorname{sim}(\{R_{\ast, 9}, R_{\ast, 10}\},R_{\ast,i}) Mi,982=sim({R∗,9,R∗,10},R∗,i) |
---|---|---|
1 | False | M 1 , 98 2 = sim ( { R ∗ , 10 , R ∗ , 9 } , R ∗ , 1 ) \mathcal{M}^2_{1,98}=\operatorname{sim}(\{R_{\ast, 10}, R_{\ast, 9}\}, R_{\ast, 1}) M1,982=sim({R∗,10,R∗,9},R∗,1) |
… \dots … | … \dots … | … \dots … |
9 | True | M 9 , 98 2 = 0 \mathcal{M}^2_{9,98}=0 M9,982=0 |
10 | True | M 10 , 98 2 = 0 \mathcal{M}^2_{10, 98}=0 M10,982=0 |
算法 5.1 分析:
基于余弦的方法。首先构造一个 v ⃗ \vec{v} v。 v ⃗ \vec{v} v 是一个 n n n 元向量,
v ⃗ ( i ) = { 0 , if at least one of the R i , q j = 0 for j = 1 , 2 , … , r ; ∑ j = 1 r R i , q j ∥ R ∗ , q j ∥ 2 , otherwise . \vec{v}(i)=\begin{cases} 0, & \text{if at least one of the }R_{i, q_j}=0 \text{ for } j=1,2,\dots,r; \\ \sum\limits_{j=1}^r \cfrac{R_{i,q_j}}{\Vert R_{\ast, q_j} \Vert_2}, & \text{otherwise}. \end{cases} v(i)=⎩⎪⎨⎪⎧0,j=1∑r∥R∗,qj∥2Ri,qj,if at least one of the Ri,qj=0 for j=1,2,…,r;otherwise.
本质上, v ⃗ \vec{v} v 是项目集中项目的单个单位长度归一化项目向量的总和,并添加了约束,即如果矩阵的特定行不包含所有 r r r 个项目,它将被设置为零。
此时项目集 { q 1 , q 2 , … , q r } \{q_1,q_2,\dots,q_r\} {q1,q2,…,qr} 用 v ⃗ \vec{v} v 表示。项目集 { q 1 , q 2 , … , q r } \{q_1,q_2,\dots,q_r\} {q1,q2,…,qr} 和其他项目 u u u 之间的相似度,就变成了 v ⃗ \vec{v} v 与 u u u 之间的相似度,直接使用公式(1)。
基于条件概率的方法。相似度计算则使用和公式(3)相似的公式,如下所示:
sim ( { q 1 , q 2 , … , q r } , u ) = ∑ ∀ i : R i , q j > 0 , for j = 1 , 2 , … , r R i , q 1 Freq ( { q 1 , q 2 , … , q r } ) × ( Freq ( u ) ) α , (4) \qquad \qquad \operatorname{sim}(\{q_1,q_2,\dots,q_r\},u) = \cfrac{\sum_{\forall i:R_{i,q_j}>0, \text{for } j=1,2,\dots,r} R_{i,q_1}}{\operatorname{Freq}(\left\{q_1,q_2,\dots,q_r\right\}) \times \left(\operatorname{Freq}(u)\right)^{\alpha}}, \qquad \qquad \textbf{(4)} sim({q1,q2,…,qr},u)=Freq({q1,q2,…,qr})×(Freq(u))α∑∀i:Ri,qj>0,for j=1,2,…,rRi,q1,(4)其中 Freq ( { q 1 , q 2 , … , q r } ) \operatorname{Freq}(\left\{q_1,q_2,\dots,q_r \right\}) Freq({q1,q2,…,qr}) 是矩阵中包含项目集中所有项目的行数量。此外,由于用户–项目矩阵 R R R 的行已被归一化为单位长度, R i , q 1 = R i , q 2 = ⋯ = R i , q r R_{i,q_1}=R_{i,q_2}=\dots=R_{i,q_r} Ri,q1=Ri,q2=⋯=Ri,qr。
算法 5.2 展示了为活跃用户进行 top- N N N 推荐的计算,其中 M 1 , M 2 , … , M l \mathcal{M}^1,\mathcal{M}^2,\dots,\mathcal{M}^l M1,M2,…,Ml 是不同的模型矩阵, U U U 是一个存储用户已购买项目的 m × 1 m \times 1 m×1 向量, N N N 是将被推荐的项目数。 U U U 的格式和返回向量的格式与早期的项目–项目相似度算法使用的格式相同(算法 4.2)。
输入变量 | 含义 |
---|---|
M 1 , M 2 , … , M l \mathcal{M}^1,\mathcal{M}^2,\dots,\mathcal{M}^l M1,M2,…,Ml | 不同的模型矩阵。 |
U U U | 用户已购买项目的 m × 1 m\times 1 m×1 向量。 |
N N N | 将被推荐的项目数。 |
输出变量 | 含义 |
---|---|
x x x | 推荐列表。 |
循环 1 生成 l l l 个不同的向量 U 1 U^1 U1、 U 2 U^2 U2、……、 U l U^l Ul,大小分别是 m × 1 m \times 1 m×1、 m 2 × 1 m^2 \times 1 m2×1、……、 m l × 1 m^l \times 1 ml×1。对于 r r r 的一个特定值, U r U^r Ur 通过生成 r r r 个项目 { q 1 , q 2 , … , q r } \{q_1,q_2,\dots,q_r\} {q1,q2,…,qr} 的每个可能组合来构建。如果活跃用户购买了所有的这些项目,则设置 U r U^r Ur 相应条目设置为 1,否则设置为 0。第 2 行,每个项目集的行索引 j j j 的构造使其与用于填充相应 M r \mathcal{M}^r Mr 矩阵的相同项目集的列索引相同。 x x x 是 M r \mathcal{M}^r Mr 和 U r U^r Ur 对矩阵–向量乘积的结果。循环 3 将活跃用户已购买的项目剔除,也就是将 x x x 中对应的条目置为 0。循环 4 保留 x x x 中 N N N 个最相似的项目。
存在的问题:
基于以上考虑,文章仅适用于在用户–项目矩阵 R R R 中出现足够多次数的项目集。使用计算高效的算法,寻找一个大小为 l l l 且出现在 σ % \sigma\% σ% 的行中的所有频繁项集,并仅针对这些频繁项集计算 k k k 个最相似的其他项目。
(说实话,看到这里,我已经不知道作者是怎么解决的了!!!)
略——后面有时间再慢慢补充……
时间 | 内容 |
---|---|
2022年5月17日20:35:56 | “在”→“再” |