原文 Finding Similar Music using Matrix Factorization
用户对Item的兴趣偏好数据有显式的、隐式的。显式的如评分数据,对电影的1-5星的评分,或者点赞、喜欢/不喜欢等明确表达了用户对物品喜好的数据。显式数据其实是比较稀疏的,更多的是隐式数据。比如用户观看过一个电影,但他并没有评分,我们不知道他看过后是喜欢还是不喜欢。或者用户浏览过一个商品、购买过一个商品,但并没有评价它,这些都是隐式的数据。本文介绍矩阵因式分解MF技术应用在这两种用户-物品数据上做推荐。
一、MF矩阵因式分解
矩阵因式分解MF的主要思想是将高维矩阵R分解成两个低维的矩阵U、I,称为因子矩阵U、因子矩阵I,使得 。
求解 的方法有:
- SVD奇异值分解的方法
- ALS交替最小二乘法
U_factors, _, I_factors = scipy.sparse.linalg.svds(bm25_weight(plays), 50)
有了因子矩阵U、I后就可以近似计算R矩阵中任何一个位置的元素
当然也可以计算因子矩阵中任意两行/列之间的相似度,使用余弦公式,
这种使用SVD做矩阵分解的方法也被叫做隐语义分析LSA(Latent Semantic Analysis)。之所以叫隐语义分析是因为它分解矩阵后得到了输入数据的隐藏的数据结构,而这种结构是很难被直观理解和解释的。
二、MF应用于显式数据做推荐
矩阵因式分解MF用在用户显式评分数据R上,是将评分矩阵R分解成两个低维的矩阵,即用户因子矩阵U、物品因子矩阵I,使得 。
求解 的方法有:
- SGD随机梯度下降法 (目标函数是使得重构误差最小)
如上MF矩阵分解的部分,有了分解矩阵后就可以获取Top-N推荐。
如使用因子矩阵U、I 分别对应的用户u和物品i的向量去估计用户u对物品i的可能评分,即可得到用户对物品i的可能喜好程度。
也可以用余弦公式去计算用户之间的相似度、物品之间的相似度,以获得Top-N的相似的物品推荐。
三、MF应用于隐式数据做推荐
对于使用隐式的数据做推荐,基本思路也是一样的,但在目标函数、损失函数和优化求解过程上完全不一样。
在隐式用户评分数据上,我们把用户未有过行为的物品标记为负样本0,但我们对此负样本的置信度是低的。而把用户有过明确行为的物品标记为正样本,也相应的有较高的置信度。
如我们有用户在一年内听过的音乐数据集。
矩阵表示用户收听音乐的二元值矩阵。(行为用户,列为音乐,值为二元值0或1,表示用户是否听过该音乐家音乐)。
矩阵表示用户对该音乐家喜爱程度的置信度。(这里我们可以用收听次数、或者收听总时长、或者加上时间惩罚的收听次数/时长来构造置信度矩阵)。
我们的假设函数是希望构造用户矩阵X,物品矩阵Y,使得 , 即我们的拟合目标不是评分数据,而是二元值的偏好倾向。
损失函数为相应置信度下的误差平方,即
加入正则项防止过拟合,我们的优化目标,代价函数为
求解 的方法:
- ALS交替最小二乘法 (pyspark-MLlib支持的方法)
- Implicit ALS 隐式交替最小二乘法
- Conjugate Gradient 共轭梯度法
注:这篇翻译的博文里主要是介绍的 Implicit ALS方法,共轭梯度法在原作者的另一篇博文里。
使用交替最小二乘法ALS计算,随机初始化,固定其中一个,比如Y因式作为已知的,然后对X使用梯度下降法进行数值更新;更新完X的值后,把X当作已知矩阵,再对Y进行梯度下降数值更新;依次交替迭代下去,直到收敛,或者满足终止条件。
这里有个比较有意思的技巧来计算梯度,如对 求偏导,
矩阵是稀疏矩阵,向量也是稀疏的,所以, 很容易计算。
而对于计算 这一项,由于 ,
通过设置负样本的置信度为1 , 也是稀疏的,
而 可以提前计算好。
artist_factors, user_factors = alternating_least_squares(bm25_weight(plays), 50)
利用隐式数据使用Implicit MF方法计算出来的模型效果还是不错的,但是Implicit MF的计算速度并不快。作者为了解决这个问题用了并行化计算的方式来解决。