基于矩阵分解的算法¶
- 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_mean
和init_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_mean
和init_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_low
和init_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)