推荐系统
常用的推荐系统算法可以分为以下三种:
- 1、基于人口统计学的推荐
- 2、基于内容的推荐
- 3、基于协同过滤的推荐
其中,本文简单介绍一下基于UGC(用户自定义标签)推荐和基于协同过滤的推荐。
基于UGC(用户自定义标签)推荐
UGC推荐表示了用户u给物品i打上了标签b,可以表示成(u,i,b)。那么用户u对物品i的兴趣公式可以表示为:
p
(
u
,
i
)
=
∑
b
n
u
,
b
,
n
b
,
i
p(u,i) = \sum_{b}n_{u,b},n_{b,i}
p(u,i)=b∑nu,b,nb,i
- n u , b n_{u,b} nu,b是用户u打过标签b的次数
- n b , i n_{b,i} nb,i是物品i被打过标签b的次数。
然而,该公式会存在一个问题,在生活中的热门标签中,物品被打标签次数占较大的权重,会导致推荐系统降低了其新颖度和个性化水平。参考了TF-IDF的思想 (TF(词频):在物品所有标签中的频率;IDF(逆文档频率):在其它物品标签中普遍出现的频率),在上式中加入了惩罚项后可表示为:
p
(
u
,
i
)
=
∑
b
n
u
,
b
log
(
1
+
n
b
(
u
)
)
n
b
,
i
log
(
1
+
n
i
(
u
)
)
p(u,i) = \sum_{b}\frac{n_{u,b}}{\log{(1+n_b^{(u)})}}\frac{n_{b,i}}{\log{(1+n_i^{(u)})}}
p(u,i)=b∑log(1+nb(u))nu,blog(1+ni(u))nb,i
- n b ( u ) n_b^{(u)} nb(u)记录了标签b被多少个不同的用户使用过(针对热门标签)
- n i ( u ) n_i^{(u)} ni(u)记录了物品i被多少个不同的用户打过标签(针对热门物品)
基于协同过滤的推荐
基于CF的推荐也可以分为两种形式,分别为基于用户(User-CF)和基于物品(Item-CF) 。一般来说,在电商、电影、音乐等领域由于大多数情况下用户的数量远远大于物品,所以更倾向于使用Item-CF;而在新闻等领域中,由于信息每天在更新迭代,物品的数量远远大于了用户,所以更倾向于使用User-CF。在实现CF算法的过程中,有以下两种方法:
- 基于近邻:利用用户行为数据预测偏好(可以近似理解为分类问题)
- 基于模型:利用用户行为数据训练模型,找内在规律做预测(可以近似理解为回归问题,其中一般利用LFM(隐语义算法))
因为CF算法十分依赖历史数据,一般情况下评分矩阵是稀疏矩阵,所以要对原始数据进行降维,用到了矩阵因子分解的方法,分解之后的矩阵代表了User和Item的隐藏特征。
接下来本文将详细介绍一下矩阵因子分解的过程,假设存在下式:
R
∗
=
P
m
×
k
T
⋅
Q
k
×
n
≈
R
R^{*} = P_{m \times k}^{T} \cdot Q_{k \times n} \approx R
R∗=Pm×kT⋅Qk×n≈R
- 预测评分矩阵 R ∗ R^{*} R∗
- 评分矩阵 R R R
- m m m个用户
- n n n个物品
- k k k个隐类
- 用户特征 P P P
- 物品特征 Q Q Q
原始稀疏矩阵进行分解后再乘回去可以得到预测矩阵,即相应得到预测评分数据,可以通过求解最小化的损失函数得到结果。但在实际情况中,这样做容易过拟合,需要加入正则化项: ( λ ∑ u ∥ P u ∥ 2 + λ ∑ i ∥ Q i ∥ 2 ) (\lambda\sum_{u}\left\| {P_u} \right\|^2 +\lambda\sum_{i}\left\| {Q_i} \right\|^2) (λ∑u∥Pu∥2+λ∑i∥Qi∥2)
- λ \lambda λ可以通过交叉验证获得
- 该正则化项表示了特征越多,其值越大,也就是说矩阵越复杂,越容易过拟合,达到了一定的惩罚作用
在求解损失函数的过程中,一般使用ALS算法(交替最小二乘法),通过固定Q求P的最小值;再固定P求Q的最小值,直到满足条件(误差小于阈值 ϵ \epsilon ϵ或者达到一定的迭代次数)
以下为手工推导矩阵因子分解详细过程:
今天先写到这里啦,有错误的话欢迎各位大佬指出~(谦虚