聊一聊推荐系统

推荐系统的应用场景有很多:新闻推荐(今日头条),音乐推荐(网易云音乐),商品推荐(京东,天猫),电影推荐等。今天我们就来聊一聊就在我们身边的推荐系统。

1.推荐系统的基本原理(以电影推荐为例

1)基于内容的电影推荐系统原理

我们可以根据电影评分表矩阵电影内容矩阵求出我们想要的用户喜好矩阵。用户喜好矩阵中包含的是每个用户对每种电影的喜好程度。用户喜好矩阵的求解公式如下:


基于内容的电影推荐系统存在的问题是:电影内容矩阵的构建十分麻烦。我们很难计算一部电影中爱情成分,喜剧成分,武侠成分。

2)基于协同过滤的电影推荐系统的原理


我们根据电影评分表矩阵用户喜好矩阵,可以求出电影内容矩阵。电影内容矩阵求解的公式如下:

基于协同过滤的电影推荐系统所存在的问题是:我们可以通过在线问卷调查的方式收集用户对电影的评价,但是问题在于并不是所有的用户都会填写在线问卷调查。就算用户填写了也不一定填写的是正确信息。

那么我们该如何解决这种问题呢?我们可以采用一种更加高效的方式来同时求解用户喜好矩阵和电影内容矩阵。求解公式如下:

我们首先需要随机初始化电影内容矩阵和用户喜好矩阵,我们的目标是最小化这个公式的结果,我们可以采用梯度下降算法或者其它的优化算法,最终我们求解得到对于电影评分表拟合效果比较好的电影内容矩阵和用户喜好矩阵。使用这种方法的好处在于 我们只需要有用户对电影的评分就可以了,系统会自动判断用户对于不同类型的电影的喜好程度以及电影的内容。

上面我们实现协同过滤的方法叫做矩阵分解(Matix Factorization),在矩阵分解中我们会得到两个矩阵。在本文中我们会得到一个电影矩阵和用户喜好矩阵。那么我们怎么使用我们得到这两个矩阵进行电影推荐呢?假设我要对用户A进行电影推荐,我们可以看一下这个用户看过哪些电影,然后使用电影内容矩阵找到与用户看过的电影相似的电影,然后推荐给该用户。我们也可以使用用户喜好矩阵找到与用户A相似的其他的用户,将与之相似的其他用户看过的电影推荐给用户A。那么现在的问题就是,我们该如何计算两个电影之间的相似度以及两个用户之间的相似度呢?其实每个电影或者每个用户我们都可以用向量来表示。我们可以将向量想象成为高维空间中的点,两个点之间的距离越近那么这两个点越相似。所以我们可以通过计算点与点之间的距离,来度量两个点之间的相似性,更具体来说就是度量两个实例之间的相似性。

    A.基于item的协同过滤    

    在这种协同过滤中,我们先计算商品(电影)之间的相似度,然后根据商品的相似度来向用户推荐。我们通常使用以下公式来度量商品之间的相似度。

计算完商品的相似度之后,我们就可以使用以下公式预测用户对商品的评分了。


这个公式想要表达的意思是:根据用户对与商品i相似商品的评分来推断用户对商品i的评分。当我们求出用户对所有商品的预测评分之后,将其进行排序,选择得分最高的商品推荐给用户。

    B.基于用户的协同过滤

    在这种协同过滤中,我们先计算用户之间的相似度,然后根据其他用户购买过的商品推荐给该用户。我们通常使用以下公式来度量用户之间的相似度。


计算完用户的相似度之后,我们就可以使用以下公式预测用户对商品的评分了。


这个公式想表达的意思是:根据与用户u相似的其他用户v对商品i的评分,来预测该用户对商品i的评分。当我们求出该用户对所有商品预测评分之后,选择得分最高的那几个商品推荐给该用户。

2.推荐系统的评估

通常情况下一个推荐系统从开发到投入商业使用要同时结合线下评估和线上评估。

1)线下评估

A.线下评估的方法--均方跟误差RMSERoot Mean Square Error


比如我们将数据集划分为训练集和测试集,使用训练集数据训练推荐系统,训练完成之后我们将推荐系统在测试集上进行测试。假设推荐系统对用户A对商品I的评分进行预测,预测结果为3分,实际是4分,此时的误差就是-1。对测试集中的数据都执行这样的运算,在计算误差的平方和,计算平均值,最后计算 算术平法根。RMSE的值越小,表示推荐系统的性能越好。

B.线下评估的方法--绝对平均误差MAEmean absolute error


MAE的计算公式如上所示,可以看出相比RMSEMAE对误差较大的预测惩罚较小,计算开销没有RMSE大,因为该方法不涉及乘方操作。

C.线下评估的方法--recall+precision

不管是RMSE还是MAE,都要求拥有用户对商品的评分信息。当然有些用户是很懒的,他们并不会去评价商品,这个时候就没有评分信息。所以当评分信息不多的时候使用RMSE或者MAE对推荐系统的性能进行评估就不太合适了。更多的时候我们拥有的信息是用户有没有看过这个商品或者有没有购买这个商品,这种情况下我们可以使用--recall+precision

假如A购买了10个商品,现在我们将购买的商品隐藏,使用推荐系统向A用户推荐商品。假如推荐系统的推荐的50个商品中,有6个是用户买的。那么recall = 6/10precision= 6/50。具体的计算公式如下:


通常我们结合precisionrecall这两个的值可以得到F scoreF的值越大就说明这个推荐系统的性能越好,F值的求解公式如下所示:


2)线上评估

A.线上评估的方法--A/B testing


我们可以使用A/B testing这种方式对多个推荐系统进行线上评估。假设我们构建了3个推荐系统的模型,这些推荐系统性能在线下测试的时候性能相当,现在进行在线测试。我们将用户分成不同的组,不同分组的用户使用不同的推荐系统进行推荐。最后看看哪个分组的推荐系统性能较好,这就是A/B testing。

B.线上评估--CTR(Click Through Rate)CR(Conversion Rate)

假设推荐系统向用户A重复推送一系列相同的商品10次,用户A3次点击了其中的商品。那么推荐系统的CTR=3/10CTR越高说明用户对这个商品越感兴趣。当用户点击进去之后,用户是否看完了这部电影,看完了这篇文章,购买了这部商品。也就是说,用户不但点击了链接,而且好好体验了商品,这就是CRCR(转化率)越高,用户的体验越好,自然你的推荐系统的性能就是越好的。

C.线上评估--ROIQA


在推荐系统中ROI越大,说明推荐系统的性能越好。有时候凭借算法来衡量推荐系统的性能总会出现一些奇怪的地方,所以最好成立一个QA小组,来测试推荐系统,根据个人的经验来评判推荐系统的好坏。

推荐系统从构建到投入使用,要经过一系列的评估。评估分为两个阶段,首先是线下评估,我们快速构建多个合适的推荐系统,然后制定评估推荐系统的标准,以进行线下评估。线下评估结束后,将选择得到的模型进行线上评估。我使用A/B testing的方式来评估推荐系统,评估方式可以结合CTR+CRROI+QA来进行综合评估,最后得到可靠的推荐系统。

以上就是自己对推荐系统的一些拙见,欢迎大家指点和吐槽!








猜你喜欢

转载自blog.csdn.net/zhengzhoudaxuexujay/article/details/80374126
今日推荐