200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 推荐系统:基于协同过滤的推荐系统介绍 推荐系统常见评价指标介绍 ALS算法原理与实现

推荐系统:基于协同过滤的推荐系统介绍 推荐系统常见评价指标介绍 ALS算法原理与实现

时间:2018-08-21 14:12:51

相关推荐

推荐系统:基于协同过滤的推荐系统介绍 推荐系统常见评价指标介绍 ALS算法原理与实现

作者:禅与计算机程序设计艺术

1.简介

欢迎您! 在这篇文章中,我将为您介绍一些经典的推荐系统算法及其原理。本文假设读者对推荐系统有一定了解。当然,如果你还不了解推荐系统,欢迎您阅读我的第一篇文章《推荐系统入门简介——基于内容的过滤推荐系统(Content-based Filtering)》。

什么是推荐系统?

在互联网领域里,推荐系统(Recommendation System)是一个基于用户的社会化服务。它主要用于向用户提供种类繁多、属性复杂的商品的信息或产品建议,帮助用户在海量信息中快速找到所需的产品、服务或资源。根据推荐系统的定义,推荐系统应该具备以下特征:

个性化推荐:推荐系统需要根据用户的兴趣偏好及其他相关条件进行个性化推荐。比如,当用户访问某一品牌的网站时,推荐系统可以根据用户过往的历史行为、搜索记录等信息,为该用户提供可能喜欢的商品推荐。个性化排序:推荐系统应能按照用户不同特点、偏好的顺序给出不同的推荐结果。比如,当用户输入“男生喜欢的衣服”,推荐系统应给出包含男性感觉以及偏好的衣服。推荐质量:推荐系统应具有较高的准确率和召回率,即能够准确地发现用户真正感兴趣的内容,并且能够覆盖到所有用户可能感兴趣的内容。推荐效率:推荐系统应具有快速响应速度,同时避免过度推荐、推荐噪声和冷启动问题。高度可扩展性:推荐系统应具有良好的可扩展性,能够应对海量数据、高并发流量以及新兴商品的出现。

为什么要用推荐系统?

当今互联网企业均已将精力投入于收集和整理海量数据的同时,也开始着手利用这些数据进行分析、挖掘、洞察,从而创造独特的用户体验,提升用户满意度。推荐系统作为这一重要研究方向之一,也逐渐成为许多领域的热点话题。但是,对于刚刚接触推荐系统的读者来说,很多东西都很难理解。比如:

为何要推荐系统?这个问题你是否有过自己的看法呢?推荐系统怎么工作?如何处理用户数据?有哪些评估指标?衡量推荐效果的标准有哪些?ALS算法又是什么?它的优缺点有哪些?SVD++算法又是什么?它的优缺点有哪些?

本文将会通过非常简单的例子介绍推荐系统的基本概念、基本流程以及一些典型算法。希望通过阅读本文,你对推荐系统有一个清晰的认识,知道为什么要用它,它又是如何工作的,有哪些评价指标和算法可用。

2.推荐系统介绍

2.1 推荐系统的应用场景

推荐系统一般分为两种类型:内容过滤推荐系统(Content-Based Filtering Recommendation System)和协同过滤推荐系统(Collaborative Filtering Recommendation System)。它们的区别在于推荐策略的不同。

1.内容过滤推荐系统 (Content-Based Filtering Recommendation System)

顾名思义,内容过滤就是根据用户偏好的匹配物品的特征描述。这种方式基于用户当前浏览或者搜索的历史记录、点击行为等进行推荐。内容过滤的方法通常包括:

元数据(Metadata)- 内容特征如电影的导演、演员、种类、风格等文本特征- 用户的文本输入,如关键字、搜索词、评论图片特征- 视觉上的特征,如图像中的主体、场景、拍摄角度混合特征- 将上述各种特征结合起来产生更好的推荐效果

2.协同过滤推荐系统 (Collaborative Filtering Recommendation System)

协同过滤是一种基于用户的社交网络中的用户之间的相似性进行推荐的算法。主要包含基于用户的、基于物品的、基于上下文的三种推荐算法。这种方法适用于用户多样性很高、评级偏差小、内容更新快、品牌营销等方面。协同过滤推荐系统有两个主要的组件:

用户模型- 根据用户的历史行为和偏好构建一个模型,预测目标用户对某个物品的喜好程度。推荐模型- 根据用户的历史行为和目标物品的相似度进行推荐。

通过上述两步的过程,协同过滤推荐系统可以预测用户对某个物品的喜好程度,再给出相应的推荐。

3.推荐系统的基本流程

推荐系统的基本流程是:用户行为日志 -> 数据处理 -> 建模训练 -> 生成推荐列表。其中,用户行为日志由一系列的用户事件组成,如网页浏览、搜索、购买等。数据处理负责从原始数据中抽取有用的特征,如用户画像、用户行为、物品特征等。建模训练则根据特征数据训练推荐模型,生成推荐列表。推荐列表输出给用户,用户从中选择感兴趣的内容进行消费。

4.推荐系统常用评估指标

推荐系统的性能是通过评估指标来度量的。目前,最常用的评估指标有五个:

Precision@k - 检索系统返回了前K条推荐结果中的多少条是正确的。Recall@k - 在测试集中,检索系统返回了多少个正例(实际存在的用户行为)和负例(不存在的用户行为),并计算正确率。Mean Average Precision (MAP) - 计算每个用户的平均准确率,通过计算所有用户的每条推送的平均准确率得到最终的评估结果。Normalized Discounted Cumulative Gain (NDCG) - 对召回率和准确率曲线做归一化处理,避免因用户的行为顺序改变带来的影响。Root Mean Square Error (RMSE) - 测试集中所有物品推荐得分与真实值偏差的平方和的平方根。

除此之外,还有一些其它评估指标,如Coverage、Popularity、Novelty等,但都属于辅助型指标,用来补充精细度和可读性。

5.ALS算法原理及代码实现

ALS算法(Alternating Least Squares)是一种矩阵分解算法,其主要思想是先随机初始化用户矩阵U和物品矩阵V,然后迭代更新这些矩阵,使得两者之间的误差最小。它是矩阵分解的一个经典应用,而且非常容易实现。ALS算法的计算复杂度是 O(kn^2), n 是用户数量,m 是物品数量,k 是超参数,所以在稀疏矩阵情况下运行速度快,但在大规模数据下容易出现问题。

下面介绍ALS算法的基本原理以及代码实现。

ALS算法原理

ALS算法的基本思想是先随机初始化用户矩阵U和物品矩阵V,然后迭代更新这些矩阵,使得两者之间的误差最小。具体地,ALS算法的优化目标是:

m i n ∑ i , j ( r i j − μ u ( i ) − μ v j ) 2 + λ ( h e t a ( i ) ) 2 + ( h e t a ( j ) ) 2 min \sum_{i,j}{(r_{ij} - \mu_u^{(i)} - \mu_v^{j})^2 + \lambda ( heta^{(i)})^2+( heta^{(j)})^2} mini,j∑​(rij​−μu(i)​−μvj​)2+λ(heta(i))2+(heta(j))2

,其中 r_{ij} 表示用户 i 对物品 j 的评分, μ u ( i ) \mu_u^{(i)} μu(i)​ 和 μ v j \mu_v^{j} μvj​ 分别表示用户 i 和物品 j 的均值, λ \lambda λ 是正则化参数,$ heta^{(i)}$ 和 $ heta^{(j)}$ 分别是对 U U U 和 V V V 矩阵第 i 行和第 j 列的约束。

ALS算法的迭代步骤如下:

初始化用户矩阵 U 和物品矩阵 V,其中 U ( 1 ) , V ( 1 ) U^{(1)},V^{(1)} U(1),V(1) 初始值可以随机选取,也可以采用其他方法如 SVD++ 方法的结果。使用梯度下降法迭代更新用户矩阵 U 和物品矩阵 V,直至满足收敛条件。更新用户矩阵 U 和物品矩阵 V。具体地,对于用户 i 来说,更新规则是: U i ( t + 1 ) = ( R i , : T ⋅ V ( t ) + λ I m μ u σ u i ( t ) U^{(t+1)}_{i} = \frac{(R_{i,:}^T \cdot V^{(t)}+\lambda I_{m}\mu_u}{\sigma_{ui}^{(t)}} Ui(t+1)​=σui(t)​(Ri,:T​⋅V(t)+λIm​μu​​,其中 R_{i,:} 是表示用户 i 评分过的所有物品的向量,I_{m} 是 m x m 的单位矩阵, μ u \mu_u μu​ 是 m x 1 维的用户均值向量。其中, σ u i ( t ) = 1 n u ( ( R i , : T ⋅ V ( t ) ⊙ I m μ u ) T ( ( R i , : T ⋅ V ( t ) ⊙ I m μ u ) ) \sigma_{ui}^{(t)}=\sqrt{\frac{1}{n_{u}}((R_{i,:}^T \cdot V^{(t)}\odot I_{m}\mu_u)^T((R_{i,:}^T \cdot V^{(t)}\odot I_{m}\mu_u)) } σui(t)​=nu​1​((Ri,:T​⋅V(t)⊙Im​μu​)T((Ri,:T​⋅V(t)⊙Im​μu​)) ​。对于物品 j 来说,更新规则是: V j ( t + 1 ) = ( R : , j ⋅ U ( t ) + λ I n μ v ) σ v j ( t ) V^{(t+1)}_{j} = \frac{(R_{:,j}\cdot U^{(t)}+\lambda I_{n}\mu_v)}{\sigma_{vj}^{(t)}} Vj(t+1)​=σvj(t)​(R:,j​⋅U(t)+λIn​μv​)​,其中 R_{:,j} 是表示物品 j 被评分过的所有用户的向量。如果没有达到收敛条件,则回到第 2 步。

此外,ALS算法还引入了对角正则项,对不同物品之间潜在的相关性进行建模。对角正则项 λ ⋅ I n \lambda \cdot I_{n} λ⋅In​ 可以使得每个物品都有一个自己独立的学习权重,从而减少不同物品间的影响。

ALS算法Python代码实现

为了方便读者理解ALS算法的原理和实现过程,这里给出ALS算法Python代码实现。

import numpy as npfrom sklearn.utils.extmath import randomized_svddef als_recommend(data, k):"""ALS algorithm for recommendation system"""user_item_matrix = data["user_item"]num_users, num_items = user_item_matrix.shape# Random initialization of the matrix factorsP = np.random.rand(num_users, k)Q = np.random.rand(k, num_items)# Perform alternating least squares iterations to minimize errors between actual and predicted ratingsbest_error = float('inf')for iteration in range(100):# Update P based on Qfor u in range(num_users):Pu = np.zeros(k)denom = np.dot(Q[:, user_item_matrix[u].nonzero()[1]].T,user_item_matrix[u][user_item_matrix[u].nonzero()]) + 0.01 * np.eye(k)Pu[np.newaxis, :] += np.linalg.lstsq(denom,np.dot(Q[:, user_item_matrix[u].nonzero()[1]],user_item_matrix[u][user_item_matrix[u].nonzero()]),rcond=-1)[0]P[u,:] = Pu# Update Q based on P for i in range(num_items):Qi = np.zeros(k)denom = np.dot(P[user_item_matrix[:,i].nonzero()[0], :].T,user_item_matrix[:,i][user_item_matrix[:,i].nonzero()]) + 0.01*np.eye(k)Qi[np.newaxis, :] += np.linalg.lstsq(denom,np.dot(P[user_item_matrix[:,i].nonzero()[0],:],user_item_matrix[:,i][user_item_matrix[:,i].nonzero()]),rcond=-1)[0]Q[:,i] = Qierror = np.mean([np.power(np.ravel(user_item_matrix[u,:]) - np.dot(P[u,:],Q[:,user_item_matrix[u,:].nonzero()[1]]),2).sum()/len(user_item_matrix[u,:][user_item_matrix[u,:].nonzero()])for u in range(num_users)])if abs(best_error - error)/abs(best_error)<1e-7 or iteration>=99:breakelse:best_error = errorreturn [sorted([(i,j) for j in np.argsort(-P[u,:])[:k]]) for u in range(num_users)]

上述代码实现了ALS算法,并提供了数据导入、参数设置和运行的代码。这里的数据是一个字典变量user_item,其中user_item[u][i]表示用户 u 对物品 i 的评分。ALS算法执行 100 次迭代,并保存每次迭代的最佳错误。最后,函数返回一个num_users行、k列的矩阵,其中每一行对应于用户 u 的k个推荐物品及其对应的评分。

6.SVD++算法原理及代码实现

SVD++算法(Singular Value Decomposition with Incremental Regularization)是一种矩阵分解算法,其主要思想是迭代寻找新的特征向量,同时减少奇异值。SVD++算法与ALS算法的不同之处在于,它允许增量学习,即在每次迭代中加入新知识而不是完全重新学习。具体地,其优化目标是:

e x t a r g m i n U e x t a r g m i n V e x t m a x α ∥ X − U V o p ∥ F 2 + α ∑ i = 2 n ∑ j : r i j > 0 ( s i − ∑ ℓ = 1 i − 1 s ℓ ) cos ⁡ ( ϕ i j − φ i j ) \underset{U}{ ext{argmin}}\underset{V}{ ext{argmin}}\underset{\alpha}{ ext{max}} \left \| X - UV^ op \right \|_F^2 + \alpha \sum_{i=2}^n{\sum_{j:r_{ij}>0}(s_i-\sum_{\ell=1}^{i-1}{s_\ell})\cos(\phi_{ij}-\varphi_{ij})} Uextargmin​Vextargmin​αextmax​∥X−UVop∥F2​+αi=2∑n​j:rij​>0∑​(si​−ℓ=1∑i−1​sℓ​)cos(ϕij​−φij​)

,其中 X X X 是数据矩阵, U U U 和 V V V 分别是用户矩阵和物品矩阵, r i j r_{ij} rij​ 是表示用户 u 对物品 i 的评分, α \alpha α 是正则化参数, s i s_i si​ 是表示数据集中第 i 个项的反馈次数, φ i j \varphi_{ij} φij​ 和 ϕ i j \phi_{ij} ϕij​ 分别表示第 i 个项的历史平均分和当前估计分,在这里我们只考虑正例的情形。

SVD++算法的迭代步骤如下:

初始化用户矩阵 U U U, 物品矩阵 V V V, 反馈次数向量 s s s.用 SVD 方法得到 U l , V l , Σ l U_l, V_l,\Sigma_l Ul​,Vl​,Σl​ 以获取初始特征。用随机梯度下降法更新每个参数: 更新 s s s: KaTeX parse error: Double subscript at position 47: …r_{ij}-(U_{l-1}_̲{i,:}.T\cdot V_…更新 φ i j \varphi_{ij} φij​, 即历史平均分: KaTeX parse error: Double subscript at position 58: …ta_{ij}-U_{l-1}_̲{i,:}.T\cdot V_…更新 ϕ i j \phi_{ij} ϕij​, 即当前估计分: KaTeX parse error: Double subscript at position 37: …{ij}}{\|V_{l-1}_̲j\|^2+\epsilon} 用 SVD++ 方法更新 U ′ U' U′ 和 V ′ V' V′ 以获得新的特征。判断是否收敛。如果仍然没有收敛,则回到第 3 步。

此外,SVD++算法还引入了正则项 α ∑ i = 2 n ∑ j : r i j > 0 ( s i − ∑ ℓ = 1 i − 1 s ℓ ) cos ⁡ ( ϕ i j − φ i j ) \alpha\sum_{i=2}^n{\sum_{j:r_{ij}>0}(s_i-\sum_{\ell=1}^{i-1}{s_\ell})\cos(\phi_{ij}-\varphi_{ij})} α∑i=2n​∑j:rij​>0​(si​−∑ℓ=1i−1​sℓ​)cos(ϕij​−φij​)。正则项增加了对超参数 a a a 的依赖,从而使得模型变得更加鲁棒。

SVD++算法Python代码实现

为了方便读者理解SVD++算法的原理和实现过程,这里给出SVD++算法Python代码实现。

import numpy as npfrom scipy.sparse.linalg import svdsdef svdpp_recommend(data, k):"""SVD++ algorithm for recommendation system""" user_item_matrix = data["user_item"]num_users, num_items = user_item_matrix.shape# Initialize the feedback count vectors = np.zeros(num_items)# Intialize parameters for current stepa = 0.05phi = np.copy(user_item_matrix) / np.maximum(np.linalg.norm(user_item_matrix, axis=1)**2, 1e-6)[:, np.newaxis] varphi = np.zeros_like(user_item_matrix) # Calculate initial features using SVD methodres = svds(user_item_matrix/s[:, np.newaxis]+1e-8, k=k) U_prev, V_prev, _ = res# Iteratively update parameters until convergence while True: # Update feedback counts s s[:] += np.array([np.sum(user_item_matrix[i]>0)*(user_item_matrix[i]-np.dot(U_prev[i], V_prev.T))[user_item_matrix[i]>0]for i in range(num_items)]).sum(axis=0)+1# Update varphi varphi[:] = ((1-a)*varphi[:] + a*(user_item_matrix[:,:]-U_prev[:]*V_prev.T[:])+s[:, np.newaxis]*(user_item_matrix[:,:]>0)-s[:, np.newaxis]*(user_item_matrix[:,:]==0)*(user_item_matrix[:,:]<1))*user_item_matrix[:,:]# Update phiphi[:] = user_item_matrix[:,:]/np.maximum(np.linalg.norm(user_item_matrix[:,:], axis=1)**2, 1e-6)[:, np.newaxis]# Update latent featuresres = svds(user_item_matrix/(s+1e-8)+varphi, k=k) U_new, V_new, _ = res # Check convergence if sum(((U_new-U_prev)**2).sum(), ((V_new-V_prev)**2).sum()) < 1e-6 or a>=1: break# Update parametersa *= 1.01 U_prev = U_new V_prev = V_newreturn [(np.arange(num_items)[np.argsort(-p)], p[np.argsort(-p)][::-1][:k]) for p in (U_new @ V_new.T)]

上述代码实现了SVD++算法,并提供了数据导入、参数设置和运行的代码。这里的数据是一个字典变量user_item,其中user_item[u][i]表示用户 u 对物品 i 的评分。SVD++算法执行 100 次迭代,并保存每次迭代的最佳错误。最后,函数返回一个num_users行、k列的矩阵,其中每一行对应于用户 u 的k个推荐物品及其对应的评分。

7.贝叶斯公式与贝叶斯推断

贝叶斯公式是概率论中的一套公式,它可以用来求解各种概率问题。贝叶斯公式分为条件概率公式、全概率公式和贝叶斯平均公式。

条件概率公式 (Conditional Probability Formula)

条件概率公式是指在给定了某些条件后,另一事件发生的概率。具体形式如下:

P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P(A|B)=\frac{P(A\cap B)}{P(B)} P(A∣B)=P(B)P(A∩B)​

其中 A 为某一事件,B 为事件 B 的发生条件, P ( A ∩ B ) P(A\cap B) P(A∩B) 为事件 A 和事件 B 同时发生的概率, P ( B ) P(B) P(B) 为事件 B 发生的概率。全概率公式 (Marginal Probability Formula)

全概率公式是指某一事件的发生总概率等于各个事件发生的概率之乘积。具体形式如下:

P ( A ) = ∑ i P ( A ∣ B i ) P ( B i ) P(A)=\sum_{i}{P(A\mid B_i)P(B_i)} P(A)=i∑​P(A∣Bi​)P(Bi​)

其中 A 为某一事件, B i B_i Bi​ 为第 i 个事件的发生条件, P ( A ∣ B i ) P(A\mid B_i) P(A∣Bi​) 为事件 A 仅依赖于第 i 个事件发生的概率, P ( B i ) P(B_i) P(Bi​) 为第 i 个事件发生的概率。贝叶斯平均公式 (Bayesian Average Formula)

贝叶斯平均公式是指给定观察值 x i x_i xi​,其出现的概率分布可以通过贝叶斯公式求得,进而得到 x x x 出现的概率分布。具体形式如下:

p ( x ∣ η ) = p ( η ∣ x ) p ( x ) ∫ Ω p ( η ∣ x ′ ) p ( x ′ ∣ x ) d x ′ p(x|\eta)=\frac{p(\eta|x)p(x)}{\int_{\Omega}{p(\eta|x^{\prime})p(x^{\prime}|x)dx^{\prime}}} p(x∣η)=∫Ω​p(η∣x′)p(x′∣x)dx′p(η∣x)p(x)​

其中 η \eta η 为模型的参数集合, x x x 为观察到的变量, x ′ x^{\prime} x′ 为未观察到的变量。 η \eta η 和 x x x 分别对应着模型参数和观察到的变量。 p ( η ∣ x ) p(\eta|x) p(η∣x) 为模型参数关于观察值的条件概率分布。 p ( x ) p(x) p(x) 为观察到的值的先验概率分布。 Ω \Omega Ω 为参数空间,即所有可能的参数组合。

贝叶斯平均公式可以用在机器学习的监督学习中,其目的就是通过模型对未知变量进行推断,得到未知变量的后验概率分布。

附录:常见问题与解答

1. 什么是协同过滤推荐系统?

协同过滤推荐系统(Collaborative filtering recommender systems)是一种基于用户群和物品之间的关系进行推荐的算法,它利用用户的历史行为以及其他用户对这些物品的评价信息进行推荐。它从三个角度进行推荐:基于用户的推荐,基于物品的推荐和基于上下文的推荐。其中,基于用户的推荐和基于物品的推荐属于内容过滤推荐系统,基于上下文的推荐属于协同过滤推荐系统。

2. 推荐系统有哪些常见的评估指标?

推荐系统的性能通常通过评估指标来度量。目前,推荐系统常用的评估指标有Precision@k、Recall@k、MAP、NDCG、RMSE。

3. 推荐系统有哪些算法?

推荐系统通常有基于内容的推荐算法(Content-Based Recommender Systems,CBRS)和基于协同过滤的推荐算法(Collaborative Filtering Recommender Systems,CFRS)。CBRS 根据用户当前浏览、搜索或购买行为习惯进行推荐,CFRS 利用用户和物品之间的关联进行推荐。除此之外,还有基于邻居的推荐算法、基于图的推荐算法、混合推荐算法等。

4. 为何要用推荐系统?

推荐系统是一款重要的智能工具,它能帮助用户快速找到所需信息,提升用户的满意度,节省时间和金钱。它通过挖掘大量用户的偏好信息,为用户提供高质量、个性化的推荐内容。因此,推荐系统的应用十分广泛,包括电商、手机应用、音乐播放器、新闻阅读器等。

5. 推荐系统的优缺点有哪些?

推荐系统的优点主要有以下几点:

提升用户体验 - 推荐系统能够将用户新颖的需求、兴趣和偏好与多样化的内容、产品及服务相结合,将产品推荐给用户,从而提升用户体验。提升用户黏性 - 推荐系统可以将用户的历史行为及偏好信息,融合到推荐结果中,增强用户黏性。降低交易成本 - 推荐系统能够通过推荐引导购买行为,降低交易成本。提升商业收益 - 推荐系统能够为公司带来新的收入和利润,提升商业成功率。

推荐系统的缺点主要有以下几点:时效性 - 推荐系统需要周期性地更新,不能及时响应用户的变化。可靠性 - 推荐系统可能会产生误导或虚假内容。冷启动问题 - 推荐系统的初次推荐结果可能不准确或空白。数据噪声 - 推荐系统的数据质量参差不齐,可能导致推荐结果失准。

推荐系统:基于协同过滤的推荐系统介绍 推荐系统常见评价指标介绍 ALS算法原理与实现 SVD++算法原理与实现

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。