协同过滤算法
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方法
|
|