在目前公司,主要做C++后端开发,一直在做推荐系统开发工作,对推荐系统有了些许认识,总结一下。
推荐系统近几年开始火起来,想百度,谷歌这些搜索引擎要解决的是用户明确的知道自己想要找什么信息,根据用户的输入检索出与数据最相关的信息,推荐系统要解决的是如今信息过载的问题,用户不是很明确的知道自己需要的具体信息,需要推荐系统来根据用户的以往操作记录等来推荐出有价值的信息,亚马逊的推荐系统给订单提供了20%的交易量,淘宝等电商对推荐也是相当的重视,今日头条凭借牛逼的推荐算法,提供个性化阅读,如今市值都奔着百亿美刀去了。
推荐系统的应用
1.电商行业:
商品详情页的推荐,店铺推荐,猜你喜欢,领家好货,买了还买,看了还看等。淘宝,蘑菇街,京东等各大电商公司都很重视。
2.音乐,电影行业:
国内的网易云音乐的个人FM,荔枝FM等都有个性化频道,用户体验都很好。
3.个性化阅读
比较典型的是今日头条,如今UC首页,各大新闻网站都有不同程度的推荐个性化推荐
我经历的推荐系统实践
1.基于简单规则的推荐:
初期的推荐系统很简单,完全基于规则去做:比如用户店铺内查看某个商品信息,我们就给推荐同一类型的按销量排序的物品列表。这对于初期有一定的效果,但效果很低,但对于同类类物品推荐结果一直都是不变得,比较死板。一些销量不好的商品永远不会被推荐出来。
2.基于商品属性的推荐:
一件商品有自己的一些属性,比如品牌,分类,价格,性别,卖家,渠道(现货或者代购)。用户喜欢这件物品,该商品的某些属性必然是用户喜欢的。我们可以根据以往的点击数据,给各个属性分配一定的权重,和正在浏览的物品属性对比,通不过不断的组合测试,选择出点击效果最佳的组合策略,以此该策略的最终的得分高低来选择是否推荐给用户。最终的效果比简单的规则有了明显的提升。
seller:brand:price:gender:channel = 2:2:2:2:2
3.基于内容的推荐:
商品的描述内容主要体现在商品名字(罗西尼情侣手表)以及一些标签,比如小白鞋,大眼睛等。我们可以尝试基于内容相似性的算法根据物品的描述信息来计算物品相似度。
在数据挖掘、文本处理、信息检索等都会涉及到提取它的关键词,业内有个经典的算法TF-IDF算法
它的理论在于:文章是由单词构成的,如果除过那些的等停用词,一个单词出现的次数很多次,那么它和内容就越相关,但是这样可能在一篇文章的出现次数一样多的单词,如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("蜜蜂"、"养殖")给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。
知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词
第一步,计算词频。
第二步,计算逆文档频率。
这时,需要一个语料库(corpus),用来模拟语言的使用环境。
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
第三步,计算TF-IDF。
TF-IDF = TF * IDF
然后基于物品的tf-idf值用余弦相似度计算两两的相似性,计算量略大,需要做一些过滤限定。
4.基于协同过滤的推荐:
UserCF和ItemCF是协同过滤中最为古老的两种算法,在top-N的推荐上被广泛应用它的思想在于,UserCF认为一个人会喜欢和他有相同爱好的人喜欢的东西,而ItemCF认为一个人会喜欢和他以前喜欢的东西相似的东西。这两个假设都有其合理性。
收集数据
这里的数据指的都是用户的历史行为数据,比如用户的购买历史,关注,收藏行为,或者发表了某些评论,给某个物品打了多少分等等,这些都可以用来作为数据供推荐算法使用,服务于推荐算法。需要特别指出的在于,不同的数据准确性不同,粒度也不同,在使用时需要考虑到噪音所带来的影响,比如给热销物品降权。
找到相似的用户或物品
当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐,这就是最典型的 CF 的两个分支:基于用户的 CF 和基于物品的 CF。这两种方法都需要计算相似度。
相似度的计算
关于相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。在推荐的场景中,在用户 - 物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。下面我们详细介绍几种常用的相似度计算方法:
****欧几里德距离(Euclidean Distance)****
最初用于计算欧几里德空间中两个点的距离,假设 x,y 是 n 维空间的两个点,它们之间的欧几里德距离是:
当用欧几里德距离表示相似度,一般采用以下公式进行转换:距离越小,相似度越大
****皮尔逊相关系数(Pearson Correlation Coefficient)****
皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度,它的取值在 [-1,+1] 之间。
sx, sy是 x 和 y 的样品标准偏差。
****Cosine 相似度(Cosine Similarity)****
Cosine 相似度被广泛应用于计算文档数据的相似度:
Tanimoto 系数(Tanimoto Coefficient)
Tanimoto 系数也称为 Jaccard 系数,是 Cosine 相似度的扩展,也多用于计算文档数据的相似度:
itemCf:适用于物品数明显过于用户数的场景,例如电商行业等。ItemCF算法的推荐结果着重于维护目标用户的历史兴趣。
UserCf:适用于用户数远大于物品数,比如热点新闻等。UserCF算法的推荐结果着重于反映那些与目标用户兴趣相似的小群体的热点。
UserCF的推荐更加社会化,而ItemCF的推荐更加个性化。
在实际的推荐系统中,最终的推荐结果都是多种策略的融合的结果,各种推荐算法都会有使用,推荐算法整体都差不多,却别的是各个公司在计算的时候,对参数做了一些调整,更加准确,这些具体的参数,外界是很难知道的。
用户画像:
用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识。在推荐系统中,用户画像的作用在于标识了用户的一些基本信息,比如地域,年龄,消费偏好,价格区间,用户类别,这些属性能够帮助系统能够进行一些目标型更强的推荐,比如过滤掉超过用户消费水平的bad case。
推荐效果的评定
比较粗暴的就是拿点击率,订单贡献率,推荐系统的最终目标是发现更多的更好的长尾物品。此外还有。
流行度:随着K的增大,推荐结果的流行度会逐渐提高,但是当K增加到一定的程度,流行度就不会再有明显变化。
覆盖率:K越大,覆盖率会相应地降低。
认真体验过京东和淘宝的推荐算法,目前大部分推荐都在使用最近点击模型,大部分都在推同类商品,商品详情页一般都会有店铺内推荐限定,和最近浏览记录关联很紧密。
参照:
1.TF-IDF与余弦相似性的应用(一):自动提取关键词
2.深入推荐引擎相关算法 - 协同过滤