推荐系统笔记: 基于邻居的协同过滤问题 中的降维

2021/12/20 23:50:33

本文主要是介绍推荐系统笔记: 基于邻居的协同过滤问题 中的降维,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1 介绍

        降维方法可用于在质量和效率方面改进基于邻域的协同过滤方法。

        特别是,在稀疏评分矩阵中很难稳健地计算成对相似性,但降维提供了在潜在因素方面的密集低维表示。因此,此类模型也称为潜在因子模型 latent factor model。

        即使两个用户的共同评分项目很少,也可以计算他们的低维潜在向量之间的距离

        此外,使用低维潜在向量确定peer组更有效

        为便于讨论,我们将仅描述基于用户的协同过滤方法。(基于item的是类似的)

        在基于用户的协同过滤方法中,基本思想是通过使用主成分分析PCA/SVD 或者其他方式 将 m×n 评分矩阵 R 转换到一个低维空间的矩阵

        生成的矩阵 R' 的大小为 m × d,其中 d远小于n。

        因此,对应于用户评级的每个(稀疏)n 维向量都被转换为低维的 d 维空间。

        此外,与原始评分向量不同,d 维中的每一个都是有数值的。

        在确定每个用户的这个 d 维表示后,使用这个d维简化表示计算从目标用户到每个用户的相似度。

        由于新的低维向量中每个条目都是有数值的,因此简化表示中的相似度计算更加稳健

        此外,由于潜在表示的低维数,相似度计算更有效。低维向量上的简单余弦或点积足以计算此低维空间中的相似性。

2 用SVD 进行 转换

        第一步是填充稀疏打分矩阵R中缺失的条目。 缺失的条目估计等于矩阵中相应行的平均值(即相应用户的平均评分)。 另一种方法是将缺失的条目估计为矩阵中相应列的平均值(即相应项目的平均评分)。

         将所得矩阵表示为 R_f。 然后,我们计算项目之间的 n × n 相似度矩阵(item-item),由S=R_f^TR_f给出。 这个矩阵是半正定的。 为了确定  R_f矩阵经过SVD分解之后 的主要基向量,我们对相似矩阵 S 执行如下对角化:

        

        这里,P 是一个 n × n 矩阵,其列包含 S 的正交特征向量。

        Δ 是一个对角矩阵,包含 S 沿其对角线的非负特征值。(非负的原因是S是一个半正定矩阵)

        令 P_d为 n × d 矩阵,其中仅包含 P 中对应于最大 d 个特征向量的列。

        然后,R_f 的低维表示由矩阵乘积R_f P_d给出

        因此,m 个用户中的每一个现在都表示在一个 d 维空间中。 然后使用该表示来确定每个用户的peer组。 一旦确定了peer组,就可以使用peer组的打分情况对该用户进行评级预测。

         通过将整个降维方法应用于R_f的转置,这种方法也可以用于基于项目item的协同过滤。

2.1 PCA近似

        许多其他方法使用主成分分析 (PCA) 代替 SVD,但总体结果非常相似。 在PCA方法中,使用R_f的协方差矩阵代替相似度矩阵S=R_f^TR_f  

3  填充稀疏打分矩阵带来的问题

        这一小节我们使用PCA而不是SVD,即用协方差矩阵。

        在第二小节中,我们知道,矩阵R_f是通过用沿行或列的平均值填充稀疏打分矩阵 R 而得到的。 这种方法很可能会造成相当大的偏差。 

        假设 12 位用户对《教父》、《角斗士》和《尼禄》三部电影进行打分。  我们假设缺失值被沿列的平均值替换。

 

        很明显,电影《角斗士》和《尼禄》的评分之间的相关性非常高,因为在有数值的四个打分中,评分非常相似。 《教父》和《角斗士》之间的相关性似乎不那么显着。

        但是,许多用户并未指定他们对《尼禄》 的评级。 由于《尼禄》 的平均评分为 (1 + 7 + 1 + 7)/4 = 4,因此这些未指定的评分将替换为平均值 4。

        这些新条目的添加显着降低了《角斗士》和《尼禄》之间的估计协方差。 但是,新条目的添加对教父和角斗士之间的协方差没有影响。 填写缺失的评分后,三部电影之间的成对协方差的估计如下:

        

import numpy as np
a=np.array([[1,1,1],
            [7,7,7],
            [3,1,1],
            [5,7,7],
            [3,1,4],
            [5,7,4],
            [3,1,4],
            [5,7,4],
            [3,1,4],
            [5,7,4],
            [3,1,4],
            [5,7,4]])

np.cov(a.T)

'''
array([[2.54545455, 4.36363636, 2.18181818],
       [4.36363636, 9.81818182, 3.27272727],
       [2.18181818, 3.27272727, 3.27272727]])
'''

           根据上述估计,《教父》和《角斗士》之间的协方差大于《角斗士》和《尼禄》之间的协方差。 这似乎不正确,因为表 2.3 中对角斗士和尼禄的评级在两者都被指定的情况下是相同的。 因此,角斗士和尼禄之间的相关性应该更高。

         此错误是由于使用该列的平均值填充未指定条目而导致的偏差造成的。 这种偏差在稀疏矩阵中可能非常显着,因为大多数条目都是未指定的。

        因此,需要设计方法来减少因使用平均评分代替未指定条目而引起的偏差。 在下文中,我们探讨了此问题的两种可能解决方案。

3.1 最大似然估计近似

        假设数据采用生成模型,并且有打分的条目被视为生成模型的结果。

        协方差矩阵可以作为估计该生成模型参数的过程的一部分进行估计。

        在下文中,我们提供了这种方法的简化。在这种简化的方法中,计算协方差矩阵的最大似然估计。

        每对项目之间协方差的最大似然估计被估计为仅有打分的条目之间的协方差。换句话说,只有对有评分的数据才用于估计协方差。在一对item之间没有共同用户的情况下,协方差估计为0。通过使用这种方法,我们重新估计协方差矩阵

        

         在这种情况下,很明显《角斗士》和《尼禄》之间的协方差几乎是教父和角斗士之间的三倍。此外,电影 Nero 的方差是最初估计的三倍多,并且在所有电影中评分方差最大。

        在使用均值填充的时候,《教父》和《角斗士》之间的成对协方差最大。但这一对现在是成对协方差中最小的。

        这个例子表明偏差修正在某些情况下可能非常重要。矩阵中无数值条目的比例越大,均值填充的偏差就越大。

        因此,仅利用有数值条目的改进技术用于计算协方差矩阵。虽然这种技术并不总是有效,但它优于均值填充技术。

        前面所述的 n × d 基矩阵 Pd 是通过选择·结果协方差矩阵的前 d 个特征向量来计算的。

3.1.1 直接映射到Pd上

        为了进一步减少表示上的偏差,可以将不完全矩阵R直接投影到缩减矩阵Pd上,而不是将填充矩阵Rf投影到Pd上。

         这个想法是计算每个观察到的评分对 Pd 的每个潜在向量上的投影的贡献,然后对这些评分的贡献进行加权平均。

        该平均贡献计算如下: 设e_i是 Pd 的第 i 列(第i个特征向量),其中第 j 个条目是 e_{ij}r_{uj}是用户 u 对项目 j 的评分。然后,用户 u 对潜在向量 e_i的投影的贡献由 r_{uj}e_{ij}给出。

         那么,如果集合I_u 表示用户 u 的指定项目评分的索引,则用户 u 在第 i 个潜在向量上的平均贡献 a_{uj}如下:

        

         于是我们得到一个 m*d维的矩阵A,我们可以用这个矩阵来计算目标用户的邻居了。

        虽然上述方法可以在一定程度上纠正协方差估计中的偏差,但在评级稀疏程度较高的情况下并不完全有效。 这是因为协方差矩阵估计需要足够数量的每对项目的观察评级才能进行稳健估计。 当矩阵稀疏时,协方差估计在统计上是不可靠的。

参考内容:Sci-Hub | Recommender Systems | 10.1007/978-3-319-29659-3



这篇关于推荐系统笔记: 基于邻居的协同过滤问题 中的降维的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程