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

第二章:推荐系统介绍

一些概念介绍

寻找你喜欢的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.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

编译过程:

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.0
Created-By: heda
Main-Class: RecommenderIntro
Class-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利用上面三个对象计算对某个用户的推荐

你可能感兴趣的:(mahout in action推荐系统阅读笔记(1))