基于矩阵分解的算法

class surprise.prediction_algorithms.matrix_factorization.SVD(n_factors=100, n_epochs=20, biased=True, init_mean=0, init_std_dev=0.1, lr_all=0.005, reg_all=0.02, lr_bu=None, lr_bi=None, lr_pu=None, lr_qi=None, reg_bu=None, reg_bi=None, reg_pu=None, reg_qi=None, random_state=None, verbose=False)

基类: AlgoBase

著名的 SVD 算法,因 Simon Funk 在 Netflix Prize 期间推广而流行。当不使用基线时,这等效于概率矩阵分解 [SM08] (参见下面的注意)。

预测值 \(\hat{r}_{ui}\) 设定为

\[\hat{r}_{ui} = \mu + b_u + b_i + q_i^Tp_u\]

如果用户 \(u\) 是未知用户,则偏差 \(b_u\) 和因子 \(p_u\) 假定为零。对于物品 \(i\)\(b_i\)\(q_i\) 也是如此。

详情请参见 [KBV09] 中的公式 (5)。另请参见 [RRSK10],第 5.3.1 节。

为了估计所有未知量,我们最小化以下正则化平方误差

\[\sum_{r_{ui} \in R_{train}} \left(r_{ui} - \hat{r}_{ui} \right)^2 + \lambda\left(b_i^2 + b_u^2 + ||q_i||^2 + ||p_u||^2\right)\]

最小化过程通过一种非常直接的随机梯度下降执行

\[\begin{split}b_u &\leftarrow b_u &+ \gamma (e_{ui} - \lambda b_u)\\ b_i &\leftarrow b_i &+ \gamma (e_{ui} - \lambda b_i)\\ p_u &\leftarrow p_u &+ \gamma (e_{ui} \cdot q_i - \lambda p_u)\\ q_i &\leftarrow q_i &+ \gamma (e_{ui} \cdot p_u - \lambda q_i)\end{split}\]

其中 \(e_{ui} = r_{ui} - \hat{r}_{ui}\)。这些步骤在训练集的所有评分上执行,并重复 n_epochs 次。基线被初始化为 0。用户和物品因子根据正态分布随机初始化,可以使用 init_meaninit_std_dev 参数进行调整。

您还可以控制学习率 \(\gamma\) 和正则化项 \(\lambda\)。两者对于每种参数都可以不同 (见下文)。默认情况下,学习率设定为 0.005,正则化项设定为 0.02

注意

您可以选择使用该算法的无偏版本,只需预测

\[\hat{r}_{ui} = q_i^Tp_u\]

这等效于概率矩阵分解 ([SM08],第 2 节),可以通过将参数 biased 设置为 False 来实现。

参数:
  • n_factors – 因子数量。默认值是 100

  • n_epochs – SGD 过程的迭代次数。默认值是 20

  • biased (bool) – 是否使用基线(或偏差)。参见上面的注意。默认值是 True

  • init_mean – 因子向量初始化的正态分布均值。默认值是 0

  • init_std_dev – 因子向量初始化的正态分布标准差。默认值是 0.1

  • lr_all – 所有参数的学习率。默认值是 0.005

  • reg_all – 所有参数的正则化项。默认值是 0.02

  • lr_bu\(b_u\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_bi\(b_i\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_pu\(p_u\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_qi\(q_i\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • reg_bu\(b_u\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_bi\(b_i\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_pu\(p_u\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_qi\(q_i\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • random_state (int, 来自 numpy 的 RandomState 实例,或 None) – 决定初始化时使用的随机数生成器 (RNG)。如果是 int,random_state 将被用作新的 RNG 的种子。这对于在多次调用 fit() 时获得相同的初始化很有用。如果是 RandomState 实例,则使用此实例作为 RNG。如果是 None,则使用 numpy 当前的 RNG。默认值是 None

  • verbose – 如果 True,则打印当前 epoch。默认值是 False

pu

用户因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users, n_factors)

qi

物品因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items, n_factors)

bu

用户偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users)

bi

物品偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items)

class surprise.prediction_algorithms.matrix_factorization.SVDpp(n_factors=20, n_epochs=20, init_mean=0, init_std_dev=0.1, lr_all=0.007, reg_all=0.02, lr_bu=None, lr_bi=None, lr_pu=None, lr_qi=None, lr_yj=None, reg_bu=None, reg_bi=None, reg_pu=None, reg_qi=None, reg_yj=None, random_state=None, verbose=False, cache_ratings=False)

基类: AlgoBase

SVD++ 算法,是 SVD 的扩展,考虑了隐式评分。

预测值 \(\hat{r}_{ui}\) 设定为

\[\hat{r}_{ui} = \mu + b_u + b_i + q_i^T\left(p_u + |I_u|^{-\frac{1}{2}} \sum_{j \in I_u}y_j\right)\]

其中 \(y_j\) 项是一组捕捉隐式评分的新的物品因子。在这里,隐式评分描述了这样一个事实:用户 \(u\) 评价了物品 \(j\),而无论评分值如何。

如果用户 \(u\) 是未知用户,则偏差 \(b_u\) 和因子 \(p_u\) 假定为零。对于物品 \(i\)\(b_i\)\(q_i\)\(y_i\) 也是如此。

详情请参见 [Kor08] 中的第 4 节。另请参见 [RRSK10],第 5.3.1 节。

SVD 一样,参数是使用基于正则化平方误差目标的 SGD 进行学习的。

基线被初始化为 0。用户和物品因子根据正态分布随机初始化,可以使用 init_meaninit_std_dev 参数进行调整。

您可以控制学习率 \(\gamma\) 和正则化项 \(\lambda\)。两者对于每种参数都可以不同 (见下文)。默认情况下,学习率设定为 0.007,正则化项设定为 0.02

参数:
  • n_factors – 因子数量。默认值是 20

  • n_epochs – SGD 过程的迭代次数。默认值是 20

  • cache_ratings – 是否在 fit() 期间缓存评分。这应该会加快训练速度,并占用更高的内存。默认值是 False。

  • init_mean – 因子向量初始化的正态分布均值。默认值是 0

  • init_std_dev – 因子向量初始化的正态分布标准差。默认值是 0.1

  • lr_all – 所有参数的学习率。默认值是 0.007

  • reg_all – 所有参数的正则化项。默认值是 0.02

  • lr_bu\(b_u\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_bi\(b_i\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_pu\(p_u\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_qi\(q_i\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • lr_yj\(y_j\) 的学习率。如果设置,则优先于 lr_all。默认值是 None

  • reg_bu\(b_u\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_bi\(b_i\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_pu\(p_u\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_qi\(q_i\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • reg_yj\(y_j\) 的正则化项。如果设置,则优先于 reg_all。默认值是 None

  • random_state (int, 来自 numpy 的 RandomState 实例,或 None) – 决定初始化时使用的随机数生成器 (RNG)。如果是 int,random_state 将被用作新的 RNG 的种子。这对于在多次调用 fit() 时获得相同的初始化很有用。如果是 RandomState 实例,则使用此实例作为 RNG。如果是 None,则使用 numpy 当前的 RNG。默认值是 None

  • verbose – 如果 True,则打印当前 epoch。默认值是 False

pu

用户因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users, n_factors)

qi

物品因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items, n_factors)

yj

(隐式)物品因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items, n_factors)

bu

用户偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users)

bi

物品偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items)

class surprise.prediction_algorithms.matrix_factorization.NMF(n_factors=15, n_epochs=50, biased=False, reg_pu=0.06, reg_qi=0.06, reg_bu=0.02, reg_bi=0.02, lr_bu=0.005, lr_bi=0.005, init_low=0, init_high=1, random_state=None, verbose=False)

基类: AlgoBase

一种基于非负矩阵分解的协同过滤算法。

该算法与 SVD 非常相似。预测值 \(\hat{r}_{ui}\) 设定为

\[\hat{r}_{ui} = q_i^Tp_u,\]

其中用户和物品因子保持为 正数。我们的实现遵循 [LZXZ14] 中建议的方法,在其非正则化形式下等效于 [ZWFM96]。两者都是 NMF 在密集矩阵 [LS01] 上的直接应用。

优化过程是采用特定步长选择的(正则化的)随机梯度下降,确保因子为非负,前提是它们的初始值也为正。

在 SGD 过程的每一步中,用户 \(u\) 和物品 \(i\) 的因子 \(f\) 按如下方式更新

\[\begin{split}p_{uf} &\leftarrow p_{uf} &\cdot \frac{\sum_{i \in I_u} q_{if} \cdot r_{ui}}{\sum_{i \in I_u} q_{if} \cdot \hat{r_{ui}} + \lambda_u |I_u| p_{uf}}\\ q_{if} &\leftarrow q_{if} &\cdot \frac{\sum_{u \in U_i} p_{uf} \cdot r_{ui}}{\sum_{u \in U_i} p_{uf} \cdot \hat{r_{ui}} + \lambda_i |U_i| q_{if}}\\\end{split}\]

其中 \(\lambda_u\)\(\lambda_i\) 是正则化参数。

该算法高度依赖初始值。用户和物品因子在 init_lowinit_high 之间均匀初始化。更改它们风险自负!

通过将 biased 参数设置为 True,可以使用偏置版本。在这种情况下,预测值设定为

\[\hat{r}_{ui} = \mu + b_u + b_i + q_i^Tp_u,\]

仍确保因子为正。基线以与 SVD 算法相同的方式进行优化。虽然能带来更好的准确性,但偏置版本似乎高度倾向于过拟合,因此您可能需要减少因子数量(或增加正则化)。

参数:
  • n_factors – 因子数量。默认值是 15

  • n_epochs – SGD 过程的迭代次数。默认值是 50

  • biased (bool) – 是否使用基线(或偏差)。默认值是 False

  • reg_pu – 针对用户的正则化项 \(\lambda_u\)。默认值是 0.06

  • reg_qi – 针对物品的正则化项 \(\lambda_i\)。默认值是 0.06

  • reg_bu\(b_u\) 的正则化项。仅与偏置版本相关。默认值是 0.02

  • reg_bi\(b_i\) 的正则化项。仅与偏置版本相关。默认值是 0.02

  • lr_bu\(b_u\) 的学习率。仅与偏置版本相关。默认值是 0.005

  • lr_bi\(b_i\) 的学习率。仅与偏置版本相关。默认值是 0.005

  • init_low – 因子随机初始化的下限。必须大于 0 以确保因子为非负。默认值是 0

  • init_high – 因子随机初始化的上限。默认值是 1

  • random_state (int, 来自 numpy 的 RandomState 实例,或 None) – 决定初始化时使用的随机数生成器 (RNG)。如果是 int,random_state 将被用作新的 RNG 的种子。这对于在多次调用 fit() 时获得相同的初始化很有用。如果是 RandomState 实例,则使用此实例作为 RNG。如果是 None,则使用 numpy 当前的 RNG。默认值是 None

  • verbose – 如果 True,则打印当前 epoch。默认值是 False

pu

用户因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users, n_factors)

qi

物品因子 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items, n_factors)

bu

用户偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_users)

bi

物品偏差 (仅当调用了 fit() 后存在)

类型:

numpy 数组,大小为 (n_items)