首页 > 编程知识 正文

协同过滤推荐算法代码,cordic算法详解

时间:2023-05-05 17:46:55 阅读:19866 作者:968

什么是协同过滤算法? 协同过滤推荐(collaborativefilteringrecommendation )。

仅基于用户行为数据而设计的推荐算法通常被称为协作过滤算法。 学术界对协同过滤算法进行了深入的研究,包括基于邻域的方法(neighborhood-based )、隐含语义模型(latent factor model )、基于图的随机行走算法(random walk on gord ) 在这些方法中,最有名、业界应用最广泛的算法是基于邻域的方法。

协同过滤包括字面理解、协同和过滤两个操作。 协同是指利用集体行为做出决策(推荐),生物上有协同进化之说,通过协同作用使集体进化到更好的状态。 对推荐系统来说,由于用户的持续协同作用,最终对用户的推荐越来越准确。 过滤是从可行的决策(推荐)方案(目标)中寻找用户喜欢的方案(目标) )的过滤。

协同进化(coevolution )两个相互作用的物种在进化过程中发展的相互适应的共同进化。 一种在另一种的影响下发生遗传进化的进化类型。 例如,某些植物在食草昆虫的压力下发生遗传变化,而昆虫则因这种变化而发生遗传变化。

协同进化是生物与环境的相互关系,是协同关系,古生物学物种是形态物种,按一定的步骤与交配群体的概念一致。 物种也是生态系统的单位。 隔离成种理论与多区域成种不矛盾。 生态系统与基因的协同作用表现为多方面,生态系统的波动影响基因,生物的相互作用也影响基因。 地球表层由多个圈组成,生物圈与其他各圈关系密切。 “第二生物圈”实验的失败表明,迄今为止人为进行的“生物圈”不能完全替代地球生物圈的作用。

具体而言,协同过滤的思路是通过群体行为找到某种相似性(用户之间的相似性或者目标物之间的相似性),并根据这种相似性进行用户决策和推荐。

现实生活中出现了许多协同过滤的案例和思想,我认为前面提到的生物进化除了是“协同过滤”的作用外,人类喜欢相亲追求“门对”,其实也是协同过滤思想的反射。 门到门对实际上是相亲男女的“相似度”(如果社会整体具备这种传统和风气,而且在实际“案例”的“中”家庭中“夫妻”更加和谐,起到“协同进化”的作用,大家就越来越接受这种方式我个人也觉得“门到门对”有一定道理。

合作过滤利用了两种非常朴素的自然哲学思想。 “集体智慧”和“相似物体具有相似的性质”。 集体智慧在数学上应符合一定的统计学规律,是向平衡稳定状态发展的动态过程,越相似的物体化学和物理组成越一致,自然表现出的外在特性越相似。 这两种思想简单易懂,正因为思想朴素,价值反而非常大。 所以协同过滤算法的原理很简单,但很有效果,而且非常容易实现。

协同过滤有基于用户的协同过滤和基于目标(物品)的协同过滤两种算法。 详细介绍协同过滤的算法原理。

推荐算法种类很多,但目前应用最广泛的是协同过滤算法。

合作过滤简单来说,就是利用一个兴趣相投、有共同经验的群体的偏好推荐用户感兴趣的信息,个人通过合作机制对信息做出相当程度的响应(例如评分)并进行记录,达到过滤的目的,帮助信息的筛选

协同过滤还分为评估(rating )或群体过滤(social filtering ),协同过滤以其优良的速度和顽强性,在全球互联网领域受到热捧。

电子商务推荐系统最有名的电子商务推荐系统属于亚马逊网络书店,顾客选择自己感兴趣的书,就可以看到下面一行

工作方案

亚马逊在“对同一本书感兴趣的读者兴趣接近一定程度”的前提下提供这样的推荐,在亚马逊网络书店也是很受欢迎的服务,各网络书店也跟随类似台湾博客的推荐服务来到网络书店。

另一个著名的例子是脸书广告,系统也是根据个人资料、身边朋友感兴趣的广告等为个人提供广告销售,共同过滤的重要里程碑。 与前两者的Tapestry、GroupLens不同,这里的商务氛围浓厚,同时也给用户带来了巨大的便利。 以上是三个协同过滤发展的重要里程碑,从最初的单一系统中的邮件、文件过滤,到系统间的新闻、电影、音乐过滤,再到横行互联网的电子商务,目的都不外乎

算法的数据结构(数据模型)协同过滤的模型一般是m个项。 m个用户的数据只在部分用户和部分数据之间有得分数据,而其他部分的得分为空。 此时,使用现有的部分稀疏数据预测这些空白项目与数据之间的得分关系,找到最高得分的项目并推荐给用户。

通常,协同过滤的推荐分为三种类型:

第一种是基于用户的协同过滤

第二种是基于项目(item-based)的协同过滤;
第三种是基于模型(model based)的协同过滤。

基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。而基于项目(item-based)的协同过滤和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。

我们可以简单比较下基于用户的协同过滤和基于项目的协同过滤:基于用户的协同过滤需要在线找用户和用户之间的相似度关系,计算复杂度肯定会比基于基于项目的协同过滤高。但是可以帮助用户找到新类别的有惊喜的物品。而基于项目的协同过滤,由于考虑的物品的相似性一段时间不会改变,因此可以很容易的离线计算,准确度一般也可以接受,但是推荐的多样性来说,就很难带给用户惊喜了。一般对于小型的推荐系统来说,基于项目的协同过滤肯定是主流。但是如果是大型的推荐系统来说,则可以考虑基于用户的协同过滤,当然更加可以考虑我们的第三种类型,基于模型的协同过滤。

基于模型(model based)的协同过滤是目前最主流的协同过滤类型了,我们的一大堆机器学习算法也可以在这里找到用武之地。

算法(函数)

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

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

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

(1)杰卡德相似系数(Jaccard similarity coefficient)

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

(2)夹角余弦(Cosine)

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

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

即               

(3)其余方法,例如欧式距离、曼哈顿距离等相似性度量方法可以点此了解

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

我们在寻找有有相同爱好的人的时候,可能会找到许多个,例如几百个人都喜欢A商品,但是这几百个人里,可能还有几十个人与你同时还喜欢B商品,他们的相似度就更高,我们通常设定一个数K,取计算相似度最高的K个人称为最相邻的K个用户,作为推荐的来源群体。

这里存在一个小问题,就是当用户数据量十分巨大的时候,在所有人之中找到K个基友花的时间可能会比较长,而且实际中大部分的用户是和你没有什么关系的,所以在这里需要用到反查表

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

通过这K个人推荐商品

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

ABCD甲(相似度25%)√√√乙(相似度80%)√√

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

●A:1*0.25=0.25

●B:1*0.25=0.25

●C:1*0.8=0.8

●D:10.25+10.8=1.05

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

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

算法总结

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

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

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

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

4.根据相似度推荐物品

Mahout 实践

在现实中广泛使用的推荐系统一般都是基于协同过滤算法的,这类算法通常都需要计算用户与用户或者项目与项目之间的相似度,对于数据量以及数据类型不同的数据源,需要不同的相似度计算方法来提高推荐性能,在mahout提供了大量用于计算相似度的组件,这些组件分别实现了不同的相似度计算方法。下图用于实现相似度计算的组件之间的关系:

图1、项目相似度计算组件

图2、用户相似度计算组件

下面就几个重点相似度计算方法做介绍:

皮尔森相关度

类名:PearsonCorrelationSimilarity

原理:用来反映两个变量线性相关程度的统计量

范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。

说明:1、 不考虑重叠的数量;2、 如果只有一项重叠,无法计算相似性(计算过程被除数有n-1);3、 如果重叠的值都相等,也无法计算相似性(标准差为0,做除数)。

该相似度并不是最好的选择,也不是最坏的选择,只是因为其容易理解,在早期研究中经常被提起。使用Pearson线性相关系数必须假设数据是成对地从正态分布中取得的,并且数据至少在逻辑范畴内必须是等间距的数据。Mahout中,为皮尔森相关计算提供了一个扩展,通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

欧式距离相似度

类名:EuclideanDistanceSimilarity

原理:利用欧式距离d定义的相似度s,s=1 / (1+d)。

范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。

说明:同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响,同样地,Mahout通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

余弦相似度

类名:PearsonCorrelationSimilarity和UncenteredCosineSimilarity

原理:多维空间两点与所设定的点形成夹角的余弦值。

范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

说明:在数学表达中,如果对两个项的属性进行了数据中心化,计算出来的余弦相似度和皮尔森相似度是一样的,在mahout中,实现了数据中心化的过程,所以皮尔森相似度值也是数据中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity类作为计算非中心化数据的余弦相似度。

Spearman秩相关系数

类名:SpearmanCorrelationSimilarity

原理:Spearman秩相关系数通常被认为是排列后的变量之间的Pearson线性相关系数。

范围:{-1.0,1.0},当一致时为1.0,不一致时为-1.0。

说明:计算非常慢,有大量排序。针对推荐系统中的数据集来讲,用Spearman秩相关系数作为相似度量是不合适的。

曼哈顿距离

类名:CityBlockSimilarity

原理:曼哈顿距离的实现,同欧式距离相似,都是用于多维数据空间距离的测度

范围:[0,1],同欧式距离一致,值越小,说明距离值越大,相似度越大。

说明:比欧式距离计算量少,性能相对高。

Tanimoto系数

类名:TanimotoCoefficientSimilarity

原理:又名广义Jaccard系数,是对Jaccard系数的扩展,等式为

范围:[0,1],完全重叠时为1,无重叠项时为0,越接近1说明越相似。

说明:处理无打分的偏好数据。

对数似然相似度

类名:LogLikelihoodSimilarity

原理:重叠的个数,不重叠的个数,都没有的个数

范围:具体可去百度文库中查找论文《Accurate Methods for the Statistics of Surprise and Coincidence》

说明:处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。

推荐算法评测指标 参考资料

https://www.cnblogs.com/chenliyang/p/6548306.html

Kotlin 开发者社区

国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。

越是喧嚣的世界,越需要宁静的思考。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。