快点进来get“推荐系统常用的推荐算法”
在知乎搜了一下推荐系统,果真结果比较少,显得小众一些,然后大家对推荐系统普遍的观点是:
(1)重要性UI>数据>算法,就是推荐系统中一味追求先进的算法算是个误区,通常论文研究类的推荐方法有的带有很多的假设限制,有的考虑工程实现问题较少,推荐系统需要大量的数据整理和转化,同时更需要考虑公司业务特性以及与现有系统的集成,方能形成推荐系统和业务之间的良性循环;
(2)推荐系统离线测试很好,上线后要么没有严格的测试结果而只能凭感觉,要么实际效果差强人意,我想主要缘于离线测试比较理想,而在线AB冠军测试无论对于前端还是后台要求都很高,没有雄厚的研发实力难以实现;
(3)推荐系统受到的外部干扰因素特别多(季节、流行因素等),整个系统需要不断的迭代更新,没有一劳永逸的事情。
由于推荐系统比较复杂,所以涉及到的评价指标也很多。当然,用户满意度最为的有效,因为这本来就是推荐系统的最终目标,但是奈何资源有限成本太高,推荐系统还依赖于其它客观评价指标。
(1)推荐准确度:这个参数可以离线计算所得,而且较为的客观,所以是各大研究论文算法最重要的参考指标。总体来说,推荐系统有两大任务:“预测”和“推荐”,所以推荐系统准确度的评分包括:
(2)覆盖率:体现了挖掘算法对发掘长尾商品的能力。最简单的定义是,对所有用户推荐出的产品做并集,然后看这个出现的并集产品与总产品数中所占的比例,这种方式比较的粗线条,因为推荐系统中马太效应频繁,所以好的推荐算法应当是所有商品被推荐的几率差不多,都可以找到各自合适的用户,所以实际中会考虑信息熵、基尼系数等指标。
(3)多样性:其原理可以表述为不在一棵树上吊死。因整个推荐系统涉及到的因素太多,如果只推荐用户一个类别的相似物品,失败风险比较的大,而且也难以实现整个推荐效益的最大化。
(4)新颖性:原理就是那些用户没有接触过、没有操作过的商品,或者是流行度比较低的商品,对用户来说是比较新鲜的物品,往往会有意外的效果。个人觉得这个指标有点扯~~
(5)信任度:这个指标比较的主观,就是让用户信任推荐系统做出的推荐是有根据有理由的,以及推荐系统内部是如何运作的。例如亚马逊的商品推荐会给出推荐理由,作为用户的我会觉得很贴心,否则用户会觉得商家的利益驱动而带有抵触心理。
(6)健壮性:比如针对关联推荐算法,商户恶意下单提高产品的推荐频率,水军恶意评论等。
基本上绝大多数算法都会利用用户-产品的交互数据动态生成个性化的推荐。而静态数据指还没生成用户交互数据的时候,这种情况在系统冷启动的时候尤为的常见,常常使用的静态数据包括:
(1)用户注册时候的性别、年龄、地域、学历、兴趣等人口统计学信息; (2)授权的社交网络账号的好友信息;
这类基于推荐方法简单,可以根据每类用户预先设置好推送内容,也可以根据同类用户相互之间进行推送,但是这种方法面临着推荐颗粒度较大,对于涉及个人品味爱好的个性化强的商品,参考价值有限,同时在大家隐私意识加强的情况下,这类数据不见得能够轻易得到;第二类社交网络好友信息效果会比较好,但也需要相应的平台授权接入才可以。
然后这里引申出对于新加入的用户和新加入的商品的冷启动问题:
其主要根据用户之前的喜好,推荐相似的物品。该系统包括用户属性和产品属性两方面构成,前者包括用户的固有属性(比如人口统计信息)以及用户的历史商品交互信息(比如对看过电影的评分,然后得到该用户对于喜欢电影的属性描述),后者是对商品的本身属性描述,这样通过简单的余弦相似度就可以实现推荐了。同时也能感觉到,对于同类型的物品描述维度相似,这种算法会工作的比较好,对于电商千奇百怪的商品,可能工作效果一般。
这个方法核心要解决的问题是推荐是否具有扩张性,如果根据用户之前的爱好只不断推荐同类的产品,显然整个推荐系统的价值就十分有限,但是如果能准确推荐其他不同类别的商品就会很好了。
Pandora的音乐推荐就是个典型的基于内容的推荐系统,他们把音乐使用各种维度的属性进行描述,然后根据用户之前的兴趣爱好推荐相似属性风格的音乐。
协同过滤算法算是推荐系统中最经典的算法了,也称为基于领域的算法。协同过滤牵涉到用户和商品的交互信息,也就是用户行为,而一般用户对于商品的行为反馈有:
显性反馈行为——用户明确表现出对某项产品和的喜好,比如用户对商品的打分、评论等信息。
隐性反馈行为——不能明确代表用户对产品喜好的行为,比如页面浏览行为等,这类数据量的比较多,常常伴有大量的噪音,需要经过处理和转化才可能有实际的用途。
其基于的假设是——喜欢类似物品的用户可能有相同或者相似的口味和偏好。UserCF实现的步骤包括:
(1)找到与目标用户兴趣相似的用户群;
假设用户u和v的正反馈的商品集合为N(u),N(v),那么两者兴趣相似度可以记为
(2)找到这个集合中用户喜欢的,而目标用户没有听说过得商品推荐之; UserCF提供的一个参数K表示要考虑目标用户兴趣最相似的人的个数,在保证精度的同时,K不宜过大,否则推荐结果会趋向于热门商品,流行度指标和覆盖度指标都会降低。
目前用的最广泛的推荐算法,不是通过商品本身,而是通过用户对商品的行为来计算商品之间的相似度,其假设能够引起用户兴趣的商品,必定与其之前评分高的商品相似。ItemCF的操作步骤包括:
(1)计算商品之间的相似度。
物品相似度可以表示为(其实跟前面的支持度比较像)
第二个式子比第一个式子好在可以惩罚过热产品j。
(2)根据商品的相似度和用户的历史行为,给用户生成推荐列表。
User-CF和Item-CF合称为memory-based CF,而model-based CF使用一般机器学习的方式,其基于样本的用户喜好信息,训练出一个推荐模型,然后根据实时的用户喜好的信息进行预测和计算推荐。
常用的模型包括LSI、贝叶斯网络等。
在现实的情况中,往往物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定,可以离线完成工作量最大的相似性计算步骤,从而大大降低了在线计算量,基于用户的实时性更好一些。但是具体使用的场景,还需要根据具体的业务类型来区分,User-CF偏重于反应用户小群体热点,更具社会化,而Item-CF在于维持用户的历史兴趣,比如:
对于新闻、阅读类的推荐,新闻阅读类的信息是实时更新的,所以ItemCF在这种情况下需要不断更新,而用户对新闻的个性化推荐不是特别的强烈情况,用户有新行为不会导致相似用户的剧烈运动。
对于电子商务类别的,由于用户消费代价比较高,所以对个性化的精确程度要求也比较高,而一段用户有新的行为,也会导致推荐内容的实时变化
协同过滤的算法缺点也很明显,除了上面的冷启动之外,往往商家的用户数量和产品数量都很多,所以矩阵的计算量会非常的大,但某个具体的用户往往买的东西又有限,所以数据同时也是高度稀疏的。
基于标签的推荐算法也是十分常见的,比如豆瓣网、京东的商品评论等。标签信息一般分为专家、学者类打的标签;一类为普通用户给商品打的标签(UGC, User Generated Content)。而标签的内容一般要么描述商品本身的,比如名字、类别、产地等,也或者用户对商品的观点评价,比如便宜、好用、性能强等,三元组(用户、物品、标签)通过标签将用户和物品进行联系。
基于标签推荐最简单的例子比如:统计一个用户最常用的标签,统计每个物品最常被打的标签,然后两者通过一定的关系推荐起来;当然也可以展现标签云,让用户点击自己感兴趣的标签,然后依此个性化推荐。
国内的京东、淘宝、豆瓣都大量使用标签信息。
由于标签的评价用户主观性比较强,所以一方面同样意思用户的用语差异性比较大,规范化可以考虑:用户评价的时候提供常用标签,让用户点击可以减少输入差异,而推荐的标签包括该物品描述性较好的标签,以及用户自己常用的标签(用户一致性);人为或者通过自然语言处理技术对标签进行整理,对于用户积极和消极的评价进行区分;标签也有长尾分布效应,所以除了热门标签外怎么提取那些差异化的有用标签进行更精确的推荐也是应当研究的课题(卡方分布/SVD?)。