-
mahout推荐算法——协同过滤推荐算法(java代码实现)
2017-06-01 10:12:01要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们...什么是协同过滤
协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。
协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。当然其中有一个核心的问题:
- 如何确定一个用户是不是和你有相似的品位?
- 如何将邻居们的喜好组织成一个排序的目录?
协同过滤相对于集体智慧而言,它从一定程度上保留了个体的特征,就是你的品位偏好,所以它更多可以作为个性化推荐的算法思想。可以想象,这种推荐策略在 Web 2.0 的长尾中是很重要的,将大众流行的东西推荐给长尾中的人怎么可能得到好的效果,这也回到推荐系统的一个核心问题:了解你的用户,然后才能给出更好的推荐。
协同过滤的步骤是:
创建数据模型 —> 用户相似度算法—>用户近邻算法 —>推荐算法。
基于用户的协同过滤算法在Mahout库中已经模块化了,通过4个模块进行统一的方法调用。首先,创建数据模型(DataModel),然后定义用户的相似度算法(UserSimilarity),接下来定义用户近邻算法(UserNeighborhood ),最后调用推荐算法(Recommender)完成计算过程。而基于物品的协同过滤算法(ItemCF)过程也是类似的,去掉第三步计算用户的近邻算法就行了。计算推荐
经过前期的计算已经得到了相邻用户和相邻物品,下面介绍如何基于这些信息为用户进行推荐。基于协同过滤的推荐算法可以分为基于用户的 CF 和基于物品的 CF,下面我们深入介绍这两种方法的计算方法
基于用户的 CF(User CF)
基于用户的 CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到 K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。图 2 给出了一个例子,对于用户 A,根据用户的历史偏好,这里只计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D 推荐给用户 A。
图 2.基于用户的 CF 的基本原理
基于物品的 CF(Item CF)
基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。图 3 给出了一个例子,对于物品 A,根据所有用户的历史偏好,喜欢物品 A 的用户都喜欢物品 C,得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A,那么可以推断出用户 C 可能也喜欢物品 C。
图 3.基于物品的 CF 的基本原理
Java代码:
UserCF:
package com.pt; import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; import org.apache.mahout.cf.taste.impl.model.file.*; import org.apache.mahout.cf.taste.impl.neighborhood.*; import org.apache.mahout.cf.taste.impl.recommender.*; import org.apache.mahout.cf.taste.impl.similarity.*; import org.apache.mahout.cf.taste.model.*; import org.apache.mahout.cf.taste.recommender.*; import org.apache.mahout.cf.taste.similarity.*; import java.io.*; import java.util.*; public class UserCF { final static int NEIGHBORHOOD_NUM = 2;//临近的用户个数 final static int RECOMMENDER_NUM = 3;//推荐物品的最大个数 public static void main(String[] args) throws IOException, TasteException { String file = "src/data/testCF.csv"; DataModel model = new FileDataModel(new File(file));//数据模型 UserSimilarity user = new EuclideanDistanceSimilarity(model);//用户相识度算法 NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model); //用户近邻算法 Recommender r = new GenericUserBasedRecommender(model, neighbor, user);//用户推荐算法 LongPrimitiveIterator iter = model.getUserIDs();///得到用户ID while (iter.hasNext()) { long uid = iter.nextLong(); List<RecommendedItem> list = r.recommend(uid, RECOMMENDER_NUM); System.out.printf("uid:%s", uid); for (RecommendedItem ritem : list) { System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue()); } System.out.println(); } } }
ItemCF:
package com.pt; import java.io.File; import java.io.IOException; import java.util.List; import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender; import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.recommender.RecommendedItem; import org.apache.mahout.cf.taste.recommender.Recommender; import org.apache.mahout.cf.taste.similarity.ItemSimilarity; public class ItemCF { final static int RECOMMENDER_NUM = 3;//推荐物品的最大个数 public static void main(String[] args) throws IOException, TasteException { String file = "src/data/testCF.csv"; DataModel model = new FileDataModel(new File(file));//数据模型 ItemSimilarity item=new EuclideanDistanceSimilarity(model);//用户相识度算法 Recommender r=new GenericItemBasedRecommender(model,item);//物品推荐算法 LongPrimitiveIterator iter =model.getUserIDs(); while(iter.hasNext()){ long uid=iter.nextLong(); List<RecommendedItem> list = r.recommend(uid, 1); System.out.printf("uid:%s",uid); for (RecommendedItem ritem : list) { System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue()); } System.out.println(); } } }
数据集:
第一列:userid;第二列:itemid;第三列评分。
1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 3,107,5.0 4,101,5.0 4,103,3.0 4,104,4.5 4,106,4.0 5,101,4.0 5,102,3.0 5,103,2.0 5,104,4.0 5,105,3.5 5,106,4.0
-
一段C#的http访问的代码,请帮忙解释下
2012-08-21 15:42:34需要写http post request访问服务器,但是官网给的api是C#写的,可惜我不懂C#(主要问题是没做过java的http request),一半的代码都差不多用java实现了,但是核心部分的http request却看不懂,请哪位懂C#和java的人... -
java面试宝典
2013-02-28 16:04:01108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是什么? 25 114、alert怎样换行? 25 115、什么... -
java 面试题 总结
2009-09-16 08:45:34finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep()... -
常用设计模式及 Java程序设计(含java源码)
2010-01-15 11:33:38至于哪一种方法最好,并无定论。 设计的许多对象来源于现实世界的分析模型。但是,设计结果所得到的类通常在现实世界中并 不存在,有些是像数组之类的低层类,而另一些则层次较高。设计中的抽象对于产生灵活的设计... -
Java面试宝典2020修订版V1.0.1.doc
2020-05-21 19:24:4812、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 60 13、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep... -
Java并发编程(学习笔记).xmind
2020-06-19 15:54:23如果系统由于过载而需要拒绝一个任务,那么应该选择哪一个(Which)任务?另外,如何(How)通知应用程序有任务被拒绝? 在执行一个任务之前或之后,应该进行什么(What)动作? 使用Exector框架 ... -
Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码
2013-02-04 12:49:33Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习... -
iPhone开发秘籍(第2版)--源代码
2012-12-11 13:51:22该资料是《iPhone开发秘籍:第2版》的源代码 对应的书籍资料见: iPhone开发秘籍:第2版(iphone开发必备佳作,在第一版的基础上进行了全面修订和大量扩充) 基本信息 原书名: The iPhone Developer's Cookbook: ... -
mybatis新手求助:getSqlSession();提示初始化错误,麻烦哪位好心的大哥帮我看看,感激不尽
2020-07-11 09:19:05这一步提示java.lang.ExceptionInInitializerError,求好心的大哥帮我看看怎么回事,整了好久也弄不好,感激不尽,下面是我的代码: mybatis-config.xml: ``` <!DOCTYPE configuration PUBLIC "-//mybatis... -
关于.NET异常处理的思考总结
2021-01-20 07:53:23年关将至,对于大部分程序员来说,...因为对于实现一个功能来说,实现功能的核心代码是一样的,可能只是在写法上优化而已,但是在实现某一个操作上使用的类来说,这一点是绝大多数时候是一样的。这样看来,我们在实际开 -
详谈.NET的异常处理
2021-01-02 20:05:57年关将至,对于大部分程序员来说,...因为对于实现一个功能来说,实现功能的核心代码是一样的,可能只是在写法上优化而已,但是在实现某一个操作上使用的类来说,这一点是绝大多数时候是一样的。这样看来,我们在实际开 -
互联网公司创始团队与世界500强通讯外派应该选择哪个?
2013-10-09 08:40:51[size=large][b]说下我现在的情况,毕业一年半,JAVA开发,是一个互联网公司的创始团队核心成员,但是现在对项目的发展不看好,管理非常混乱,代码什么的管理更加混乱,开发时只注重功能实现,不重视代码质量,现在... -
新版Android开发教程.rar
2010-12-14 15:49:11� 由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少,但由于 Android 是一款完全 开 源的移动计算平台,相信第三方应用会很快的丰富起来。 � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的... -
推荐 JAVA核心知识点整理(283页,超级详细)+ 技术电子书(30+本,高清带目录)已经共享出来了,速速下载。 QuickStart 1️⃣ JavaMap项目可以干什么?戳这里 2️⃣ 作者是谁? 戳这里 如果文章内容有误欢迎...
-
关于JVM执行引擎的理解
2020-08-22 14:27:08执行引擎是Java虚拟机核心的组成部分之一。 执行引擎的作用: 由于代码经过前端编译器后生成字节码文件,JVM将装在字节码文件到内部,JVM中只有自己的执行引擎才"解析"对应的指令集,然后为翻译成机器指令(解释器...一、执行引擎
介绍:
- 执行引擎是Java虚拟机核心的组成部分之一。
- 执行引擎的作用:
- 由于代码经过前端编译器后生成字节码文件,JVM将装在字节码文件到内部,JVM中只有自己的执行引擎才"解析"对应的指令集,然后为翻译成机器指令(解释器)或者是将翻译成机器指令后再加入缓存(JIT编译器)。
- 执行引擎的工作过程:
- 依赖于PC寄存器,当PC寄存器指向哪条指令时,执行引擎就去操作该指令对应的操作。
- 当在执行的过程中,遇到局部变量表中的对象引用时,会根据引用访问堆中对象的实例以及根据对象头来访问对应位置的数据。
解释器和JIT编译器:
橙色部分由前端编译器来完成,例如平常使用的ide或者javac。
当执行引擎要执行字节码文件的时候有两种选择:一种是使用解释器、另外一种就是使用JIT编译器。
- 解释器:
- 功能:配合PC计数器将字节码文件逐行解释成机器指令后执行。
- 优点:不需要等待,拿到字节码文件即可立即进行解释。
- 缺点:若遇到热点代码时效率低下。
- JIT编译器:
- 功能:将一段代码编译成本地代码,当再次执行到这段代码时,可以从代码缓存中取出,无需再对其逐条解析。
- 优点:遇到热点代码执行效率高。
- 缺点:需要一段时间讲这段代码执行翻译存入缓存。
为什么HotSpot JVM采用解释器与编译器相结合?
若只采用解释器代码执行效率低下,尤其是web项目。若只采用JIT编译器的话会将字节码执行翻译进缓存,而这段时间只能会让用户等待。所以两个相结合时,当JVM启动的时候,解释器可以先发挥作用,而不用等待JIT编译器全部翻译好了再去执行,可以提高程序总的执行效率,当随着时间的推移,JIT会把越来越多的字节码编译成本地代码,效率会逐渐提高。
另一方面是JIT编译器相当于使用解释器为自己的后路:因为JIT编译器在勘测到热点代码这段才会对其执行翻译缓存,若不是热点代码还是使用解释器进行解释的。
我们可以通过参数"-Xint"去设置只采用解释器执行程序,也可以通过参数"-Xcomp"设置只采用编译器去执行,当然如果出现问题解释器还是会介入。最后也就是默认的"-Xmixed"参数设置共同执行程序。
热点探测功能:
- 一个很多次被调用的方法,或者是一个方法体内部循环多次的循环体都可以被称作热点代码,JIT可以将这些代码,由于这些编译方式发生在方法执行的过程中,所以也被称为栈上替换,或者OSR(on stack repalcement)编译。
- Hotsopt JVM目前才用的热点探测方式是基于计数器的热点探测。
- 主要有两种热点探测计时器,分别是:方法调用计数器(统计方法调用的次数)和回边计数器(统计循环体调用的次数)
- 执行流程:当一个方法被调用的时候,会先检查这个方法是否存在JIT编译过的版本,若存在则直接拿本地代码执行,若不存在则将方法调用计数器+1,然后判断方法调用计数器和回边计数器之和有没有到达阈值,若到达了则使用JIT编译器编译成本地代码执行后存入本地代码缓存,若没有达到还是使用解释器进行解释方法执行。在Client模式下这个阈值默认是1500次、而在Server模式下默认是10000次,可以通过参数"-XX:ComplieThreshold"来进行设置阈值。
- 热度衰减:当一段时间内,如果方法调用没有到达阈值,则会将计数器的次数减少一半,我们可以通过参数"-XX:-UseCounterDecay"来设置是否开启热度衰减,也可以通过"-XX:CounterHanlfLifeTime"来设置半衰周期的时间(单位是秒)。
C1与C2编译器:
在Hotspot JVM中内嵌两个编译器,就是C1与C2编译器。
- C1编译器:
- 可以通过参数"-client"设置在Client模式下使用。
- 特点:对字节码进行简单和可靠的优化,耗时短。
- 优化方式:主要有方法内联、去虚拟化、冗余消除。
- 方法内联:将引用的函数代码编译到引用点里,减少栈帧的生产,减少参数传递以及跳转过程。
- 去虚拟化:对唯一的实现类进行内联,与方法内联类似。
- 冗余消除:在运行期间把一些不会执行的代码折叠掉。
- C2编译器:
- 可以通过参数"-server"设置在Server模式下使用。
- 特点:对字节码进行耗时较长的优化、以及激进优化,使得代码执行效率更高。
- 优化方式:依赖于逃逸分析。
- 标量替换:用标量值替换聚合对象的属性值。
- 栈上分配:对于未逃逸的对象分配在栈上。
- 同步消除:消除不必要的同步操作,通常指synchronized。
分层编译策略:
- 程序解释执行可以触发C1编译,将字节码编译成机器码,可以进行简单的优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化。
- 在Java 7后,一旦指定是server模式下默认开启分层编译策略,就是C1和C2会共同协作执行编译任务。
扩展:
- 在JDK 10后,Hotspot又加入了新的即时编译器:Graal编译器
- 目前还是测试阶段,但效果与C2编译器持平。
- 在JDK 9 后引入了AOT编译器(静态提前编译器):
- 在运行前,将字节码转化为机器码的编译器。
- 好处是减少Java运用在刚开始的时候运行慢的问题,坏处是并不能达成一次编译到处运行的功能,而且降低了链接过程的动态性。
-
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 1.1 SpringAOP AOP称为面向切面编程,也是面试当中经常会被问到的一环,其实Spring AOP的底层原理...
-
千方百计笔试题大全
2011-11-30 21:58:33108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是什么? 25 114、alert怎样换行? 25 115、什么... -
外文翻译 stus MVC
2010-05-28 15:02:31This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control change in your Web project and promote ... -
C#高级编程(第9版):C# 5.0 & .NET 4.5.1.[美]Christian Nagel(带详细书签) PDF 下载 高清 完整版
2017-12-26 14:02:25现在可以在非UI线程中填充集合,功能区控件现在是架构的一部分,通过事件的弱引用也更容易实现,数据验证可以用INotifyDataErrorInfo接口异步完成;实时绘图功能可以方便地动态排序、分组修改了的数据。 ASP.NET ... -
Spring面试题
2015-05-06 07:19:39在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。 在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们... -
c#学习笔记.txt
2008-12-15 14:01:21readonly声明一个字段,该字段只能赋值为该声明的一部分或者在同一类的构造函数中。 sealed指定类不能被继承。 static声明属于类型本身而不是属于特定对象的成员。 unsafe声明不安全的上下文。 virtual在派生类中... -
C#微软培训教材(高清PDF)
2009-07-30 08:51:17第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11... -
C#微软培训资料
2014-01-22 14:10:17第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11... -
Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--详细书签版
2013-02-04 12:43:52Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习... -
windows 程序设计
2011-07-24 21:16:30Windows程序不要求每个应用程序都自行开发这些驱动程序,因为这种支持是Windows的一部分。 动态链接 Windows运作机制的核心是一个称作「动态链接」的概念。Windows提供了应用程序丰富的可呼叫函数,大多数用于实... -
Oracle Database 9i10g11g编程艺术:深入数据库体系结构(第2版)--详细书签版
2013-02-03 11:42:53本书是一本关于oracle database 9i、10g 和11g 数据库体系结构的权威图书,涵盖了所有重要的oracle 体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,分区和并行,以及... -
【716-Week 02】由一般化到特殊化演变的树
2020-11-25 07:54:19数据结构和算法没有哪一个是完美的,只有最合适的,我们要分析实际场景。 <ul><li>一个特殊化的完全二叉树:堆</li></ul> 完全二叉树是一个平衡树,所以高度最大是 O(logn),所以堆... -
世界上流经国家最多的河流是哪一条? 世界上最长的河流是什么? 汉城是哪个国家的首都? 3、机构团体名 如: BMW是哪个汽车公司制造的? 长城信用卡是哪家银行发行的? 美国历史上第一所高等学府是哪个学校?...
-
bind,call.apply 的区别?
-
PPT大神之路高清教程
-
python最简单的字符串转字典(str 2 dict)
-
计算机视觉-IOU怎么计算?
-
MySQL 索引
-
redis
-
springcloud项目创建笔记8 之《feign客户端》
-
IET_LaTeX模板.zip
-
Seafile-seahub功能简析
-
不用露脸在家就能做,新手小白零基础也能做,自媒体一天赚200
-
Serial_Assistant_by_PyQt5-master.zip
-
PHP - Laravel 设置 cookie
-
xxljob源码分析
-
Revisiting Stereo Depth Estimation From a Sequence-to-Sequence Perspective with Transformers
-
vue项目中封装好的各种请求
-
【 APP商城 v1.0.3】免费开源商城系统+支持优惠劵团购秒杀等等多种营销活动.zip
-
ImageWatch2017.vsix
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
内核替换
-
Python函数库深度详解(1)