协同过滤算法介绍及算法实现forthlss

●根据你喜欢的物品给你推荐相似物品

●根据以上条件综合推荐

因此可以得出常用的协同过滤算法分为两种,基于用户的协同过滤算法(user-basedcollaboratIvefiltering),以及基于物品的协同过滤算法(item-basedcollaborativefiltering)。特点可以概括为“人以类聚,物以群分”,并据此进行预测和推荐。

二、协同过滤算法的关键问题

实现协同过滤算法,可以概括为几个关键步骤:

1:根据历史数据收集用户偏好

2:找到相似的用户(基于用户)或物品(基于物品)

三、基于用户的协同过滤算法描述

基于用户的协同过滤算法的实现主要需要解决两个问题,一是如何找到和你有相似爱好的人,也就是要计算数据的相似度:

计算相似度需要根据数据特点的不同选择不同的相似度计算方法,有几个常用的计算方法:

(1)杰卡德相似系数(Jaccardsimilaritycoefficient)

其实就是集合的交集除并集

(2)夹角余弦(Cosine)

在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦:

找到与目标用户最相邻的K个用户

所谓反查表,就是比如你喜欢的商品有A、B、C,那就分别以ABC为行名,列出喜欢这些商品的人都有哪些,其他的人就必定与你没有什么相似度了,从这些人里计算相似度,找到K个人

通过这K个人推荐商品

我们假设找到的人的喜好程度如下

那么对于产品ABCD,推荐度可以计算为:

●A:1*0.25=0.25

●B:1*0.25=0.25

●C:1*0.8=0.8

●D:1*0.25+1*0.8=1.05

很明显,我们首先会推荐D商品,其次是C商品,再后是其余商品

当然我们也可以采用其他的推荐度计算方法,但是我们一定会使用得到的相似度0.25和0.80,也即一定是进行加权的计算。

算法总结

这就是基于用户的协同推荐算法,总结步骤为

1.计算其他用户的相似度,可以使用反查表除掉一部分用户

2.根据相似度找到与你嘴相似的K个用户

3.在这些邻居喜欢的物品中,根据与你的相似度算出每一件物品的推荐度

4.根据相似度推荐物品

算法存在的问题

四、算法实现

先整理网上的资料,自己动手实践后再进行编辑

我们使用的是集成在CDH集群上的spark-on-yarn方式,使用python写算法,这是在集群上运行程序的方式以及一些问题解决

测试1——我们自己测试的基于Python的协同过滤算法实践

主要实现由读取Hive中的数据并进行算法处理(python+spark+hive)

第一步:建立Hive的连接,并读取Hive中的数据(sql方法)

第二步:划分训练集和测试集(0.8,0.2)

第三步:利用ALS函数,设置参数,并通过训练集训练得到模型

第四步:利用测试集对训练好的模型进行测试

第五步:最后将编好的.py文件上传至服务器

第六步:使用./spark-submit–masteryarn/program/wsh/readTpch1.py提交至spark进行处理。

代码:

测试2——这是网上别人的代码用来跑了一下

使用默认的ALS.train()方法,即显性反馈(默认implicitPrefs为false)来构建推荐模型并根据模型对评分预测的均方根误差来对模型进行评估。

导入需要的包

frompyspark.ml.evaluationimportRegressionEvaluatorfrompyspark.ml.recommendationimportALSfrompyspark.sqlimportRow

根据数据结构创建读取示范

创建一个函数,返回即[Int,Int,Float,Long]的对象

deff(x):rel={}rel['userId']=int(x[0])rel['movieId']=int(x[1])rel['rating']=float(x[2])rel['timestamp']=float(x[3])returnrel

读取数据

ratings=sc.textFile("hdfs://10.77.20.23:8020/text/ml-1m/ml-1m/ratings.txt").map(lambdaline:line.split('::')).map(lambdap:Row(**f(p))).toDF()

然后把数据打印出来:

构建模型

training,test=ratings.randomSplit([0.8,0.2])

使用ALS来建立推荐模型,这里我们构建了两个模型,一个是显性反馈,一个是隐性反馈

alsExplicit=ALS(maxIter=5,regParam=0.01,userCol="userId",itemCol="movieId",ratingCol="rating")alsImplicit=ALS(maxIter=5,regParam=0.01,implicitPrefs=True,userCol="userId",itemCol="movieId",ratingCol="rating")

接下来,把推荐模型放在训练数据上训练:

modelExplicit=alsExplicit.fit(training)modelImplicit=alsImplicit.fit(training)模型预测

使用训练好的推荐模型对测试集中的用户商品进行预测评分,得到预测评分的数据集

predictionsExplicit=modelExplicit.transform(test)predictionsImplicit=modelImplicit.transform(test)

THE END
1.推荐算法——基于物品的协同过滤算法标签: 算法 收藏 基于用户的协同过滤算法在用户增长的时候,相似度计算的计算会越来越困难。基于物品的算法给用户推荐他们之前喜欢的物品相似的物品。 算法步骤 计算物品之间的相似度 根据物品的相似度和用户的历史行为给用户生成推荐列表 相似度公式如下: wij=|N(i)∩N(j)||N(i)||N(j)|...https://www.imooc.com/article/27099
2.基于狄利克雷DirichletProcesses聚类的协同过滤推荐算法代码实现...基于狄利克雷DirichletProcesses聚类的协同过滤推荐算法代码实现(输出聚类计算过程,分布图展示) 聚类(Clustering)就是将数据对象分组成为多个类或者簇 (Cluster),它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大。所以,在很多应用中,一个簇中的数据对象可以被作为一个整体来对待,从而减...https://www.jianshu.com/p/e8c5293d9a82
3.基于协同过滤算法的电影推荐系统的设计与实现.docx基于协同过滤算法的电影推荐系统的设计与实现摘 要在本文中,我们设计了一个基于用户行为模型的系统,旨在增加电影的数量,计算用户之间的相似度,并实现可以对电影进行信息爬取,向用户推荐相似电影的功能。该系统在基于用户的协作过滤算法中使用欧几里得公式来计算用户之间的相似度,通过该方式可以得到用户之间的相似度,以...https://max.book118.com/html/2022/0610/6104050043004155.shtm
1.推荐系统前深度学习时代推荐算法(1):协同过滤(CF)协同过滤推荐算法分类: 基于用户的协同过滤推荐 基于物品的协同过滤推荐 以上两者分类的的依据是它们如何计算相似度和依据相似度做推荐的部分。(听到这你可能还有点懵,先别急~,继续往后面看) 基本思想: 基于用户的协同过滤推荐:通过计算用户相似度,找到与目标用户行为相似的其他用户,推荐相似用户正反馈交...https://blog.csdn.net/qq_58872188/article/details/143798469
2.Java使用协同过滤算法的代码示例java在Java中实现协同过滤算法通常需要一些步骤,包括加载用户-项目评分数据、计算相似度、生成推荐等,以下是一个简化的基于用户的协同过滤算法的代码示例,感兴趣的小伙伴跟着小编一起来看看吧在Java中实现协同过滤算法通常需要一些步骤,包括加载用户-项目评分数据、计算相似度、生成推荐等。以下是一个简化的基于用户的协同过滤...https://www.jb51.net/program/3228978bz.htm
3.算法推荐算法协同过滤腾讯云开发者社区2 协同过滤算法如何预测? 什么是协同过滤 协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户...https://cloud.tencent.com/developer/article/1170685
4.协同过滤java代码实现协同过滤推荐算法代码图User CF算法的工作过程 基于用户的协同过滤,简称User CF,思想其实比较简单,首先是根据目标用户对物品的偏好找到兴趣相近的用户作为相邻用户,然后将相邻用户的喜爱的作品推荐给目标用户;即当一个用户A需要个性化推荐的时候,我们可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的,而用户A没有听说过的...https://blog.51cto.com/u_16213697/9925001