基于协同过滤算法的电影推荐系统设计(二) - ALS算法详解

0 系列文章目录

0.1 基于协同过滤算法的电影推荐系统设计(一) - 项目简介

0.2 基于协同过滤算法的电影推荐系统设计(二) - 推荐系统介绍

ALS是alternating least squares的缩写 , 意为交替最小二乘法,而ALS-WR是alternating-least-squares with weighted-λ -regularization的缩写,意为加权正则化交替最小二乘法.

该方法常用于基于矩阵分解的推荐系统中.
例如:将用户(user)对商品(item)的评分矩阵分解为两个矩阵

  • 一个是用户对商品隐含特征的偏好矩阵
  • 另一个是商品所包含的隐含特征的矩阵

在这个矩阵分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户最商品推荐了。

由于评分数据中有大量的缺失项,传统的矩阵分解SVD(奇异值分解)不方便处理这个问题,而ALS能够很好的解决这个问题。
对于R(m×n)的矩阵,ALS旨在找到两个低维矩阵X(m×k)和矩阵Y(n×k),来近似逼近R(m×n),即:

  • R(m×n)代表用户对商品的评分矩阵
  • X(m×k)代表用户对隐含特征的偏好矩阵
  • Y(n×k)表示商品所包含隐含特征的矩阵,T表示矩阵Y的转置

实际中,一般取k<<min(m, n), 也就是相当于降维了。这里的低维矩阵,有的地方也叫低秩矩阵。

为了找到使低秩矩阵X和Y尽可能地逼近R,需要最小化下面的平方误差损失函数:

  • xu(1×k)表示示用户u的偏好的隐含特征向量
  • yi(1×k)表示商品i包含的隐含特征向量,
  • rui表示用户u对商品i的评分
  • 向量xu和yi的内积xuTyi是用户u对商品i评分的近似。

损失函数一般需要加入正则化项来避免过拟合等问题,我们使用L2正则化,所以上面的公式改造为:

  • λ是正则化项的系数。

至此,协同过滤就成功转化成了一个优化问题。
由于变量xu和yi耦合到一起,这个问题并不好求解,所以我们引入了ALS,也就是说我们可以先固定Y(例如随机初始化X),然后利用公式(2)先求解X,然后固定X,再求解Y,如此交替往复直至收敛,即所谓的交替最小二乘法求解法。

具体求解过程

先固定Y

将损失函数L(X,Y)对xu求偏导,并令导数=0,得到:

同理固定X

可得:

  • ru(1×n)是R的第u行
  • ri(1×m)是R的第i列
  • I是k×k的单位矩阵。

迭代步骤

首先随机初始化Y,利用公式(3)更新得到X, 然后利用公式(4)更新Y, 直到均方根误差变RMSE化很小或者到达最大迭代次数。

上文提到的模型适用于解决有明确评分矩阵的应用场景,然而很多情况下,用户没有明确反馈对商品的偏好,也就是没有直接打分,我们只能通过用户的某些行为来推断他对商品的偏好。
比如,在电视节目推荐的问题中,对电视节目收看的次数或者时长,这时我们可以推测次数越多,看得时间越长,用户的偏好程度越高,但是对于没有收看的节目,可能是由于用户不知道有该节目,或者没有途径获取该节目,我们不能确定的推测用户不喜欢该节目。
ALS-WR通过置信度权重来解决这些问题:对于更确信用户偏好的项赋以较大的权重,对于没有反馈的项,赋以较小的权重。ALS-WR模型的形式化说明如下:

ALS-WR的目标函数

  • α是置信度系数。

求解方式还是最小二乘法

其中Cu是n×n的对角矩阵,Ci是m×m的对角矩阵;Cuii = cui, Ciii = cii。

参考

初识交替最小二乘ALS

联系我


1.Java开发技术交流Q群

2.完整博客链接

3.个人知乎

4.gayhub

ALS(Alternating Least Squares)协同过滤算法是一种常用的推荐算法,可以用于商品推荐系统。下面我们将介绍如何使用ALS算法实现商品推荐系统。 1. 数据准备 首先需要准备数据,包括用户、商品和评分。通常评分可以是1到5的整数,表示用户对商品的兴趣程度。 2. 将数据转换为矩阵 将数据转换为一个矩阵,其中行表示用户,列表示商品,矩阵中的元素表示用户对商品的评分。 3. 分解矩阵 使用ALS算法将矩阵分解为用户矩阵和商品矩阵,其中用户矩阵包含用户的特征向量,商品矩阵包含商品的特征向量。 4. 计算预测评分 使用用户矩阵和商品矩阵计算预测评分矩阵,其中预测评分矩阵中的元素表示对应用户对对应商品的预测评分。 5. 推荐商品 根据预测评分矩阵推荐商品给用户,通常选择预测评分最高的商品作为推荐结果。 下面是一个基于ALS算法的商品推荐系统的示例代码: ```python import numpy as np from scipy.sparse.linalg import spsolve class ALSRecommender: def __init__(self, n_users, n_items, n_factors=20, reg=0.01): self.n_users = n_users self.n_items = n_items self.n_factors = n_factors self.reg = reg def fit(self, X, n_iterations=10): self.user_factors = np.random.normal(size=(self.n_users, self.n_factors)) self.item_factors = np.random.normal(size=(self.n_items, self.n_factors)) X = X.tocoo() for i in range(n_iterations): self.user_factors = self._als_step(X, self.user_factors, self.item_factors) self.item_factors = self._als_step(X.T, self.item_factors, self.user_factors) def _als_step(self, X, solve_vecs, fixed_vecs): A = fixed_vecs.T.dot(fixed_vecs) + np.eye(self.n_factors) * self.reg b = X.dot(fixed_vecs) solve_vecs = spsolve(A, b.T) return solve_vecs.T def predict(self, user_id, item_id): return self.user_factors[user_id].dot(self.item_factors[item_id]) def recommend(self, user_id, n=10): scores = np.dot(self.user_factors[user_id], self.item_factors.T) top_items = np.argsort(scores)[::-1][:n] return top_items ``` 这个代码中,我们使用了numpy和scipy库来进行矩阵计算和求解线性方程组。在fit函数中,我们使用ALS算法迭代更新用户矩阵和商品矩阵,直到收敛。在predict函数中,我们使用用户矩阵和商品矩阵预测对应用户对对应商品的评分。在recommend函数中,我们根据预测评分矩阵推荐商品给用户。 使用这个类可以很方便地实现基于ALS算法的商品推荐系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值