配色: 字号:
part3-协同过滤
2018-07-31 | 阅:  转:  |  分享 
  
协同过滤算法

1协同过滤算法概述

协同过滤算法是常用的推荐算法之一,推荐算法(协同过滤)主要有两种形式:

基于物品推荐

考察具有相同特质的物品从而推荐给选择了某件物品的用户。(基于物品相似性)

基于用户推荐

通过考察具有相同爱好的用户对相同物品的评分标准进行计算。(基于用户相似性)

基于用户的推荐(志趣相投)



(1)分析:从上图可知,用户3购买物品1和物品5,用户1购买物品1物品3物品5,而用户二购买物品2和物品4,进而得知用户1与用户3更为相似。因此理论上可以将用户1所喜欢的商品推荐给用户3。

(2)基于用户推荐的过程

1)确定相似用户

根据购买相同物品,计算出用户相似度,确定相似用户。

2)相似用户物品之间的推荐

获得相似用户后,将相似用户之间的物品进行相互推荐。(如上图中,用户3和用户1相似,因此可以把用户1的物品3推荐给用户3)

关键词:用户相似度







基于物品推荐(物以类聚)



分析:基于物品推荐,是针对同一个用户,而不是用户之间。根据用户已有的偏好数据去推荐一个未知物品是合理的。这就是基于物品的推荐算法。

根据上图,用户3购买了物品1和物品5,而物品3与物品1的相似度很大,因此将物品3推荐各用户3。

关键词:物品相似度



注意:上述基于物品推荐和基于用户推荐最终都是将物品3推荐给用户3。但其实现方式显然不同。

协同过滤算法不足

基于用户推荐不足:数据庞大,准确度不够。

基于物品推荐不足:虽然数据量相对较小,但往往会推荐同类产品,而推荐同类产品意义不大,如推荐出不同品牌的牙膏,事实上消费者只会购买其中的一种,因此推荐无效。



注:事实上上述两种推荐方式,目的是挖掘用户可能喜欢的产品,而不是做广告让用户选择同类产品的不同品牌。这才是推荐的真正目的











相似度量

对于不同形式的协同过滤举证,最重要的部分是相似度的求得。如果不同的用户或者物品之间的相似度缺乏有效而可靠的算法定义,那么协同过滤算法就失去了成立的基础条件。

2.1基于欧几里得的相似度计算

欧几里得距离是最常用计算距离的公式,欧几里得相似度计算是一种基于用户之间直线距离的计算方式。在相似度计算中,不同的物品或者用户可以将其定义位不同的坐标点。





我们将1/(d+1)表示为欧几里得相似度近似值。距离越大相似度约小,距离越小相似度约大。



------------------------------------------------------------------------------------------------------------------------------



例如:计算用户1与其它用户之间的用户相似度



用户1与用户2的用户相似度:



用户1与用户3的用户相似度:



通过相似度大小可知用户1与用户2更为相似。

2.2基于余弦角度的相似度计算

(1)欧几里得相似度是以目标绝对距离做为衡量的标准,而余弦相似度是以目标差异的大小做为衡量标准。



(2)欧几里得相似度注重目标之间的差异,与目标在空间中的位置直接相关。而余弦相似度是不同目标在空间中的夹角,更加表现在前进趋势上的差异。

一般来说欧几里得相似度用来表现不同目标的绝对差异性。余弦相似度更多的是对目标从方向趋势上区分,对特定坐标数字不敏感。

如:在判定(1,1)和(3,3)这两个点的相似度时,不选择余弦相似度,这是因为这两个点的夹角为0,空间上没有方向变化。





(4)余弦相似度计算公式:



事实上余弦相似度就是用余弦值代表相似度,该公式也是推出两向量点积的公式。







(5)基于余弦相似度的用户相似度计算

就是计算电影评分的余弦值,用该值表示用户相似度。

计算余弦相似度是根据公式进行计算的。













结果:









交替最小二乘法(ALS)

交替最小二乘法是统计分析中最常用的逼近计算的一种算法,其交替计算结果使得最终结果尽可能地逼近真实结果。

3.1最小二乘法(LS)

LS算法是ALS算法的基础:

LS算法是一种数学优化技术,也是一种机器学习常用的算法。它通过最小误差的平方()和寻找数据的最佳函数(f(x))匹配。







利用最小二乘法可以简便地求取未知的数据(利用所寻找到的f(x)来获取未知数据)。并使得这些求得的数据与实际数据之间误差平方和为最小。

(注:最小二乘法就是通过已知数据获取拟合函数,然后再由该拟合函数获取未知数据。同时要求未知数据与实际数据之间满足设定的最小误差的平方())

3.2交替最小二乘法

交替最小二乘法事实上是用来弥补(预测)评分矩阵的空缺数据的。评分矩阵的行列是由物品和用户组成,而矩阵元素就是用户对该商品的评分。事实上一个用户不可能对所有商品进行评分,因此造成评分矩阵为稀疏矩阵。通过交替最小二乘法,将原评分矩阵分成两个小矩阵即:





其中n表示用户个数,m表示商品个数。表示用户特征,表示物品特征。





这两个最小矩阵事实上就是将一个用户或物品按其属性进行拆分,根据属性的特点进行推送。







基于交替最小二乘法的推荐算法本质是基于用户的推荐,事例代码如下:

数据:



第一列数据为用户编号,第二列数据为商品编号,第三列数据为用户给该商品的评分。从对商品的评分上可以看出用户2与用户3、4相似。这就说明基于用户的推荐的程序会将用户3或用户4的相关产品推荐给用户2。

基于交替最小二乘法程序

importorg.apache.spark._importorg.apache.spark.mllib.recommendation.{ALS,Rating}objectPP{defmain(args:Array[String]){valconf=newSparkConf().setMaster("local").setAppName("CollaborativeFilter")//设置环境变量valsc=newSparkContext(conf)//实例化环境valdata=sc.textFile("d:/test/ss.txt")//设置数据集valratings=data.map(_.split("")match{//处理数据caseArray(user,item,rate)=>//将数据集转化Rating(user.toInt,item.toInt,rate.toDouble)//将数据集转化为专用Rating})valrank=10//设置隐藏因子valnumIterations=10//设置迭代次数valmodel=ALS.train(ratings,rank,numIterations,0.01)//进行模型训练varrs=model.recommendProducts(2,2)//为用户2推荐2个商品rs.foreach(println)//打印结果}}



注:其中Rating(user.toInt,item.toInt,rate.toDouble)代表的是一种格式

0.01表示的是ALS中正则参数







Train方法





recommendProducts方法





























献花(0)
+1
(本文系实习生101首藏)