常用推荐系统算法总结

一,常用推荐系统算法总结

1、Itemcf (基于商品的协同过滤)

这个算法是cf中的一种,也是当今很多大型网站都在采用的核心算法之一。对于商城网站(以Amazon为代表,当然也包括京东那种具有搞笑特色的推荐系统在内),影视类推荐,图书类推荐,音乐类推荐系统来说,item的增长速度远不如user的增长速度,而且item之间的相似性远不如user之间的相似性那么敏感,所以可以在离线系统中将item的相似度矩阵计算好,以供线上可以近乎即时地进行推荐。因为这种方法靠的是item之间的相关性进行推荐,所以推荐的item一般都和喜欢的item内容或者特性高度相似,很难推荐出用户潜在喜欢的item,多样性也比较差。

2、Usercf (基于用户的协同过滤)

这个是cf中的另外一种,它的主要特色是可以发现和用户具有同样taste的人,有句俗话叫做观其友知其人,大概也是这个道理吧。找到用户的相似用户,通过相似用户喜欢的item推荐给该用户。因为用户的相似用户群还是比较敏感的,所以要频繁地计算出用户的相似用户矩阵,这样的话运算量会非常大。而且这个算法往往推荐出来的item很多都是大家都喜欢的比较hot的item,有的时候它提供的结果并不是个性化,反而成了大众化的推荐了。用这种算法的web应用一般都是item更新频繁,比如提供资讯类服务的应用(以“指阅”为代表的),或者笑话类推荐(以“冷笑话精选”为代表的)。当然这种算法的一个中间产物-----用户相似度矩阵是一个很有用的东西,社交类的网站可以利用这个中间产物来为用户提供相同品位的好友推荐。

3、Content_based(基于内容的推荐)

基于内容的推荐,很大程度上是在进行文本挖掘。web应用提供的内容或者爬取的内容在推给用户之前可以做一些挖掘,比如资讯类的应用,将抓取到的资讯,通过文本分析那一套算法提取出每篇资讯的关键词,以及统计频次和逆向文档频率来聚类或者笨一点地话计算出资讯的相似度矩阵,即共同的key words越多,两篇资讯的相似度越高。当你的用户很少很少,你的显式反馈数据非常非常少的时候,你可以根据用户的浏览或者搜索等等各种行为,来给用户进行推荐。再猥琐一点的话,你可以在用户刚刚注册好你的应用的时候,给他一些提问,比如让他输入一些感兴趣的话题啊,或者对以前看过的电影打分什么的。(当然这些电影都是你从各个簇中随机选取的,要足够多样性)这个算法它好就好在,不需要拿到用户--项目的评分矩阵,只需要知道用户喜欢什么,就可以很快速地推荐给用户十分相关的item。这个算法需要每天都要根据你抓取的资讯,不断地计算item之间的相似性。这个算法有个好处在于可以从容应对上面的两个算法其实都很难应对的问题,就是如果你想推出一个新的item,因为没有一个人有对这个new item的评分,所以上述的两个算法不可能推荐新的东西给你,但你可以用基于内容的算法将新的item计算出它属于哪个类,然后时不时地推出你的新item,这点对于商城尤其重要。

4、Knn(邻近算法)

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

5、Slope One

推荐系统的最最本质的事情就是把user-item rating矩阵中的空白填好,看穿这个本质以后,你可能会觉得问题一下子简单多了,填格子啊?填格子谁不会啊。因此很多高效加搞笑的算法就出来了。slope one就是其中,说实话,这个算法我自己没有写过,但是看到这个算法怎么实现的,我就觉得应该很好做,而且算起来会很快,但结果肯定不会特别理想。

Slope One的基本概念很简单, 例子1, 用户X, Y和A都对Item1打了分. 同时用户X,Y还对Item2打了分, 用户A对Item2可能会打多少分呢?

User Rating to Item 1 Rating to Item 2

X 5 3

Y 4 3

A 4 ?

根据SlopeOne算法, 应该是:4 - ((5-3) + (4-3))/2 = 2.5.

当然这个只是个算例简单地说明下原理,当user和item都很多的时候,你可以用加权的办法来做。为什么我会感觉这个算法的效果会不理想呢?因为,这个算法总是把你的口味和大众的平均口味作对等,推荐出来的东西很难是非常个性化的。很容易让很多用户的推荐结果趋向一致,也就是大数的平均值,也即大众的平均口味。

6、Svd(奇异值分解)

svd的全称是:Singular Value Decomposition,翻译过来是奇异值分解,是一种矩阵分解的方法。其实,这个方法是提取一般实矩阵“特征值”的算法,(这里特征值加引号是因为,特征值是针对方阵来定义的,而一般的m*n的实矩阵是没有特征值的。)其实,矩阵就是一个线性变换的表示方法,因为一个向量乘一个矩阵的结果是一个向量,第一个向量通过线性变换来变成第二个向量。线性变换有许多变换方向,比如你可以对一个图像矩阵做伸缩同时也做平移。那么特征值和特征向量又是什么?一个特征向量就是表示其中的一个变换方向,而对应的特征值则表示这个变换方向对于整个线性变换有多么重要。书归正传,那么奇异值又是什么?我觉得奇异值就是特征值从方阵往一般实矩阵的一个推广。你将一个m*n的实矩阵和它的转置相乘,就会得到一个方阵,然后对这个方阵做特征值分解,得到的特征值就是所谓的奇异值的平方。我的意思是说,某种意义上,可以讲奇异值和特征值理解为一回事。那么拿到奇异值又会有什么用呢?拿到奇异值后,我们就可以抓到主要的成分,丢掉次要和非常次要的成分进行分析。也就是说,我们可以对原来的庞大的常常又非常稀疏的矩阵进行降维和分解,而分解后得到的矩阵都是稠密矩阵。最终我们会得到一个表示user特性的矩阵和一个表示item特性的矩阵。拿到这些数据之后,我们就可以进行推荐了,而且也可以很容易地进行聚类分析。这个算法的好处在于,可以解决rating矩阵的稀疏性问题,同时可以降低矩阵的维度,提高运算速度。但它的缺点是付出的空间代价太大。在做svd分解时,你需要先把一个大的rating矩阵分解成三个大的矩阵,这三个矩阵需要存在计算机内存中,然后才能进行降维。其实,svd这个方法的思路和PCA(主成分分析法)很像,抓住主要矛盾,忽略次要矛盾。分解降维后的矩阵非常约等于原来的矩阵。

7、聚类算法

这里用到的聚类算法,是用来降低维度以及为并行计算作准备的。拿到rating矩阵之后,可以通过这些评分将用户自然地聚成几簇,然后用上述的算法对各个簇做推荐算法并行计算,充分地利用好所有计算资源。当然你也可以在svd分解之后,拿到user和item矩阵之后,对这两个矩阵分别作聚类分析,你可以得到user的簇以及item的簇。这样的结果会非常有意义,你可以作好友推荐,相似item推荐等等。在基于内容的算法中,因为很多资讯之间并不是那么的相关,把他们都相互计算相似度,会得到很多的0,所以没有必要。因此可以在计算之前,对整个item做个聚类,然后分别对各簇来做相似度计算。聚类算法中,我用过性能最好的也是最简单的就是k-means。

8、组合算法

任何一个算法都有它独特的优势和固有的缺陷,因此单用一个算法的web应用很少,往往是将各种算法组合起来用。

一种方式是:将多种算法计算出来的结果,加权之后排序推荐给用户。

一种方式是:将多种算法计算出来的结果,各取前几个推荐给用户,这样做的好处是结果很丰富多彩。

一种方式是:用svd算法填充后的矩阵作为输入,用普通cf做计算来输出,然后排序推荐。这种叫做层次推荐,可以得到两种方法的好处。

一种方式是:对新用户做基于内容的推荐,因为新用户没有任何评分数据,对老用户用cf来做。

… …

二,性能评价

1. 训练集大小对于推荐性能的影响

使用SlopeOne算法,每次随机选取6%的用户预测其喜好,进行5次实验,取MAE的均值,得到下表:

训练集大小(%


MAE


90


0.71718149


70


0.73005925


50


0.77483222


30


0.83092947


10


0.98020104

绘制成折线图,如下图所示:

由此可知,训练集越大,则推荐的准确率越高。

2. 不同相似度度量对性能的影响

使用ItemCF算法,训练集大小为数据集的90%,每次随机选取30%的用户预测其喜好,进行5次实验,取MAE的均值,得到下表:

相似度度量方法


MAE


皮尔逊相关系数


0.86158483


曼哈顿距离


0.82744657


欧几里德距离


0.80844643


对数似然值相似度


0.80750607


Jaccard相似度


0.78540776


余弦相似度


0.81422523

绘制成直方图,如下图:

由此可知,Jaccard相似度的性能略好于其他几种相似度,但是优势很小。使用不同相似度度量方法差别不大。

3. 不同推荐算法的性能

使用皮尔逊相关系数作为相似度,训练集大小为数据集的90%,每次随机选取6%的用户预测其喜好,进行5次实验,取MAE的均值。其中KNN算法取近邻大小为5;EM算法的学习速度为0.005,过度拟合值为0.02,随机噪声值为0.005,EM的迭代次数为20。得到下表:

推荐算法


MAE


ItemCF


0.86158483


UserCF


1.03740876


Slope One


0.71718149


KNN(k = 5)


0.83184328


SVD

(Compute SVD using EM Algorithm:

learning rate = 0.005,

overfitting prevention = 0.02,

random noise = 0.005,

epoch = 20)


0.70493273

绘制成直方图,如下图:

由此可知,SVD和Slope One算法的推荐结果最为精确,UserCF最差。这个数据和推荐系统相关著作中的结论是吻合的。

此外,在内存方面,Slope One最占内存,1G内存下最多只能处理6%左右的用户。而其他算法均能轻松地处理30%以上的用户量。

在速度方面,SVD速度最快,处理每个用户的平均时间约为4ms,Slope One的平均时间约为30ms,ItemCF和UserCF的平均处理时间都在10ms左右。KNN的速度是最慢的,平均处理时间约为100ms。

时间: 2025-01-06 02:56:29

常用推荐系统算法总结的相关文章

大数据算法->推荐系统常用算法之基于内容的推荐系统算法

港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一个好的商品,向朋友安利之类的.在以前广告系统不发达的时候,我们也是靠口口相传来进行商品的推广.那么为什么,现在推荐系统变的非常重要了呢?,在以前,我们的商品不像现在的物品一样琳琅满目,我们有时间,可以把商品都浏览一遍在进行选择,因为我们都想选择所有商品中最好的,而现在,由于资源的众多,我们不会用大把

Spark中常用的算法

Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测.精确营销.客户获取.个性偏好等.MLlib 目前支持分类算法有:逻辑回归.支持向量机.朴素贝叶斯和决策树. 案例:导入训练数据集,然后在训练集上执行训练算法,最后在所得模型上进行预测并计算训练误差. import org.apache.sp

大数据技术之_24_电影推荐系统项目_04_推荐系统算法详解

第九章 推荐系统算法详解9.1 常用推荐算法分类9.1.1 基于人口统计学的推荐与用户画像9.1.2 基于内容的推荐与特征方程9.1.3 基于协同过滤的推荐 第九章 推荐系统算法详解 9.1 常用推荐算法分类 9.1.1 基于人口统计学的推荐与用户画像 9.1.2 基于内容的推荐与特征方程 特征按照不同的数据类型分类,有不同的特征处理方法 推荐系统常见反馈数据 基于 UGC 的推荐 TF-IDF算法代码示例 9.1.3 基于协同过滤的推荐 基于近邻的协同过滤的推荐 基于模型的协同过滤的推荐 模型

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

DotNet常用排序算法总结

数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法,希尔排序算法,快速排序算法. (1).选择排序算法:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(1大于等于i小于等于n)个记录交换. (2).希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各

推荐系统算法

最近在学习研究推荐系统算法.比较常见的两种是基于好友关系的协同推荐,以及基于物品特征.特性的协同推荐. 其实基于人协同推荐存在一种非同类人的爱屋及乌推荐方法,例如关注的微博大v.微信大v.微信公众账户.以及网红,关注他们是对他们的认可, 对于他们推荐的书籍.或商品会有格外的认同感.这样两个人之间是不存在协同关系的,更多的是一种单向的认同.认可.其实新浪博客.微博. 微信公众账户都是基于此类方法来获取大量用户的,推荐商品领域未见类似说法.----爱屋及乌推荐方法.基于背书的推荐方法

常用MD5算法代码

常用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 维基百科:MD5 MD5加密后是一个字节数组, 但我们一般是取其十六进制的字符串表示法,当然,十六进制数字符串是区分大小写,在 mysql数据库,Java,和JavaScript语言中,一般是使用小写的字符串来表示, 而在 Oracle数据库官方提供的包中,返回的是大写字符串,这算是一个坑,如果你想要执行多次 md5,可能需要转换为小

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排