mahout in action推荐系统阅读笔记(1)

来源:互联网 发布:百鸟朝凤影评知乎 编辑:程序博客网 时间:2024/04/30 00:13

第二章:推荐系统介绍

一些概念介绍

寻找你喜欢的item,可以通过和你有相同taste的人来寻找(这就是为啥mahout的前身叫taste的原因吧),也可以通过你已经喜欢的item来寻找相似的。前面的推荐叫user-based,后面的推荐叫item-based,它们都属于collaborative filtering--协同过滤。

协同过滤特点:推荐的产生是基于,而且仅仅基于users和items的关系,不需要知道items的属性(这里有一个疑问,怎么知道item之间是相似的呢?难道不需要知道属性就能推出相似?留着这个疑问到后面理解吧!3月28日补充,item之间的相似性不是通过item属性来得知的,而是通过用户对item的选择来获取的,比如用户购买A物品的时候多数时候也会购买B物品,这样当某个用户购买了A物品,就可以推荐B物品给他,这里不涉及物品任何属性,仅仅是他们一起被购买)

和协同过滤不一样,content based的推荐是和item的属性相关的,内容推荐是domain-specific方法,需要确定哪些属性是需要使用的,使用到什么程度,一个domain的不能翻译到另一个domain,比如推荐书的和推荐pizza的就不一样。

mahout实现的是协同过滤,content based的涉及不多

一个小例子

类型:user based

输入:mahout的术语就叫preferences,这个preferences是user是到items的preferences,一个preference如下表示

userid  --  itemid -- preference value

如1,101,5.0代表一个preference,以逗号分隔,preference value越大,代表user对item有更强的正向偏好

userid和itemid通常都是整数

有个疑问,在推荐时候,高和低的preference value对推荐结果都有什么影响,对判断用户是否相似影响多大?这个疑问以后解决,需要看算法和源代码

例子代码

import java.io.File;import java.util.List;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.similarity.UserSimilarity;import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;import org.apache.mahout.cf.taste.recommender.Recommender;import org.apache.mahout.cf.taste.recommender.RecommendedItem;import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;class RecommenderIntro {        public static void main(String[] args) throws Exception {                DataModel model =                        new FileDataModel (new File("intro.csv"));                UserSimilarity similarity =                        new PearsonCorrelationSimilarity (model);                UserNeighborhood neighborhood =                        new NearestNUserNeighborhood (2, similarity, model);                Recommender recommender = new GenericUserBasedRecommender (                                model, neighborhood, similarity);                List<RecommendedItem> recommendations =                        recommender.recommend(1, 1);                for (RecommendedItem recommendation : recommendations) {                        System.out.println(recommendation);                }        }}

数据

1,101,5.01,102,3.01,103,2.52,101,2.02,102,2.52,103,5.02,104,2.03,101,2.53,104,4.03,105,4.53,107,5.04,101,5.04,103,3.04,104,4.54,106,4.05,101,4.05,102,3.05,103,2.05,104,4.05,105,3.55,106,4.0

编译过程:

javac -classpath /opt/workspace/mahout-core-0.5.jar:/opt/workspace/mahout-math-0.5.jar:/opt/workspace/mahout-collections-1.0.jar -d classes/ src/RecommenderIntro.java

jar -cvfm recommendintro.jar MANIFEST.MF -C classes/ .

MANIFEST.MF内容:

Manifest-Version: 1.0Created-By: hedaMain-Class: RecommenderIntroClass-Path: lib/mahout-collections-1.0.jar  lib/mahout-core-0.5.jar  lib/mahout-math-0.5.jar lib/slf4j-api-1.6.4.jar lib/slf4j-jdk14-1.6.4.jar lib/slf4j-nop-1.6.1.jar lib/guava-r09.jar lib/uncommons-maths-1.2.jar

运行命令和结果:

java -jar recommendintro.jar

RecommendedItem[item:104, value:4.257081]

代码初解读

目前的介绍还不足以完全了解代码,不过可以从大面上先了解下

DataModel存储user,item,preference等计算中需要数据,并提供访问接口

UserSimilarity提供如何计算两个user相似的方法

UserNeighborhood提供如何计算用户的相近组

Recommender利用上面三个对象计算对某个用户的推荐

原创粉丝点击