文档章节

Mahout In Aciton

开拓者-2017
 开拓者-2017
发布于 2014/07/07 13:35
字数 1801
阅读 113
收藏 1

Mahout In Aciotn 

        

        本篇文章,理论为主,在理解本篇文章的基础上,可查看下一篇文章,即操作部分。(注,内容来自Mahout In Action和作者本人理解)

         作者:Jack Zhang  来自开拓者部落 ,qq群:248087140,欢迎加入我们!

         本文欢迎转载,转载请注明出处 http://my.oschina.net/dataRunner/blog/287907


一、Mahout

a)Mahout是开源的机器学习软件库。它所实现的算法归属于机器学习或群体智慧这个广泛的领域。而现阶段的Mahout,主要关注与推荐引擎(协同过滤)、聚类和分类。

b)Mahout是可扩展的。Mahout系统中,机器学习实现是用java来写的,部分建立于Hadoop Mapreduce分布式计算之上

c)Mahout是一个Java类库,不提供用户接口,只为开发者提供一个可改可用的工具框架

1、Mahout的演变

Ø2008年Mahout作为lucene的子项目出现

Ø脱离lucene成为独立的子项目

Ø吸纳开源的协同过滤项目Taste

Ø顶级Apache项目,发布全新的驱象人徽标

 

Mahout早期3个明确的核心主题:推荐引擎(协同过滤)、聚类、分类。当然这些不是Mahout的全部。

 

2、Mahout的机器学习主题

a)推荐引擎

推测用户的品味和爱好,找到其可能感兴趣的物品,向其推荐。

1、亚马逊书籍和其他商品

2、Netfix推荐DVD,以及其1000000$的奖励

3、Libimseti 约会网站

4、Facebook等社交网络推荐朋友

b)聚类

i.聚类技术将大量的事务放在一起,试图发现其层次结构和顺序。以揭示一些有用的模式 或让数据集更易于理解

1.Google News使用聚类技术通过标题将新闻分组,未显示所有文章的原始列表

2.Clusty搜索引擎将其查询结果分组

3.根据收入、居住地和购买习惯,将消费者分为多段

c)分类由系统推导出分类的规则

i.用途

1.雅虎邮箱判定垃圾邮件

2.Picasa照片管理应用判断照片中是否包含了人脸

3.iTunes Genius特性使用分类来处理歌曲,为用户生成可能的播放列表

4.筛选异常的行为或模式,来检测可疑的网络活动或欺骗行为

5.筛选异常的行为或模式,或欺骗行为

6.察觉某个用户的消息是否存在失望或满意情绪

3、利用Mahou和Hadoop处理大规模数据

a)相关程序的安装

i.Java和IDE

ii.Maven

iii.Mahout

iv.Hadoop

 

二、推荐系统

1、运行第一个推荐引擎

a)创建输入

i.输入:基础数据

ii.偏好:数据以偏好形式表达。一个偏好包含一个用户ID、一个物品ID、偏好值。偏好值可任意设定,例如1~5,但需注意更大的值代表更强的正向偏好,1表示最不喜欢,5表示至爱

iii.输入文件数据


用户ID,物品ID,偏好值
1,101,5.0
1,102,3.0
1,103,2.5
 
2,101,2.0
2,102,3.0
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

1.数据分析

1和5的喜好相似

1和5的喜好看起来相似:他们都最喜欢101,102次之,103再次之

1和4的喜好基本相似

1和4都喜欢101、103(但4对102的偏好不明)

1和2的喜好基本对立

1最喜欢101,而2最对101的偏好值最低(似乎对其不感兴趣),1似乎对103不感兴趣,但2却最喜欢。

1和3的喜好迥异

仅仅同时喜欢101

 

总结:分析纬度1、喜好顺序2喜好值,综合

b)创建一个推荐引擎

i.Mahout相关API

1.DataModel

a)FileDataModel

2.UserSimilarity

a)PersonCorrelationSimilarity

3.Recommender

a)GenericUserBasedRecommender

4.RecommendedItem

ii.推荐程序代码

class RecommenderIntro {
    final static int NEIGHBORHOOD_NUM = 2;
    final static int USER_ID = 1;
    final static int RECOMMEND_NUM = 1;
    public static void main(String[] args) throws IOException, TasteException {
           /**构建文件对象*/
           DataModel model = new FileDataModel(new File("intro.csv"));
          
           /**用户相识度*/
           UserSimilarity user = new PearsonCorrelationSimilarity(model);
           /**近邻*/
           UserNeighborhood neighborhood  = 
                       new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
           /**生成推荐器*/
           Recommender recommender = 
                           new GenericUserBasedRecommender(model, neighborhood, user);
          
           /**进行推荐*/
           List<RecommendedItem> recommendations = 
                           recommender.recommend(USER_ID, RECOMMEND_NUM);
           for(RecommendedItem recommendation:recommendations){
                  System.out.println(recommendation);
           }
    }
}

iii.组件之间的关系图示

c)分析输出

2、评估一个推荐程序

a)训练数据与评分

i.为了知道一个推荐结果是否趋于合理,我们需要知道一个推荐结果和真实喜好的差距

ii.做法是,提取一小段真实数据,作为测试数据来仿真,测试数据不会被导入被评估的推荐引擎,相反,推荐引擎需要为这块缺失的测试数据估计出偏好值,然后估计结果用于与真实值进行对比

 

我们精简一下语言,获取评分的步骤如下

1、获取真实值。提取一小段真实数据(说明:a、作为真实值,b、不会被导入被评估的推进引擎)

2、获取估计值。推荐引擎为1中未被导入推荐系统的数据估计出偏好值,

3、估计结果和真实值对比

4、计算评分

 

计算评分的方法

1、计算差值

2、计算平均差值或者均方根

 

b)运行RecommenderEvaluatour

class Test{
       public void test() throws IOException, TasteException{
              RandomUtils.useTestSeed();
              DataModel model = new FileDataModel(new File("intro.csv"));
              RecommenderEvaluator evaluator = 
                          new AverageAbsoluteDifferenceRecommenderEvaluator();
             
              /***RecommenderEvaluator
              * 1、将数据分为训练集和测试集
              * 2、构建一个新训练的DataModel与Recommender用于测试
              * 3、并将估计的偏好值与实际测试数据惊醒比较
              */
              RecommenderBuilder builder = new RecommenderBuilder(){
                     public Recommender buildRecommender(DataModel dataModel) 
                                     throws TasteException {
                            UserSimilarity similarity = 
                                    new PearsonCorrelationSimilarity(dataModel);
                            UserNeighborhood neighborhood = 
                                    new NearestNUserNeighborhood(2, similarity, dataModel);
                            return new GenericUserBasedRecommender
                                    (dataModel, neighborhood, similarity);
                     }
              };
              double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);
              System.out.println(score);
       }
}

 

c)评估结果

3、评估查准率与查全率      

通过估计偏好值来生成推荐结果

给出一个从优到劣的推荐列表,不必包含估计的偏好值

有几个好的推荐结果

从3的角度来看,可以使用查准率和查全率来评估推荐程序

查准率:命中数/展示出的全部数

查全率:命中数/相关的总数

a)运行RecommenderIRStatsEvaluator

/***
 * 计算查准率和查全率
 * @author baby
 *
 */
class Test2{
       public void test() throws IOException, TasteException{
              RandomUtils.useTestSeed();
              DataModel model = new FileDataModel(new File("intro.csv"));
              RecommenderIRStatsEvaluator evaluator = 
                          new GenericRecommenderIRStatsEvaluator();
              RecommenderBuilder builder = new RecommenderBuilder(){
                     public Recommender buildRecommender(DataModel dataModel) 
                                 throws TasteException {
                            UserSimilarity similarity = 
                                new PearsonCorrelationSimilarity(dataModel);
                            UserNeighborhood neighborhood = 
                                new NearestNUserNeighborhood(2, similarity, dataModel);
                            return new GenericUserBasedRecommender
                                (dataModel, neighborhood, similarity);
                     }
              };
                /**
                   * @param recommenderBuilder  object that can build a {@link org.apache.mahout.cf.taste.recommender.Recommender} to test
                   * @param dataModelBuilder {@link DataModelBuilder} to use, or if null, a default {@link DataModel} implementation will be used
                   * @param dataModel dataset to test on
                   * @param rescorer  if any, to use when computing recommendations
                   * @param at  as in, "precision at 5". The number of recommendations to consider when evaluating precision,  etc.
                   *          "precision at 5":推荐5个结果的查准率
                   * @param relevanceThreshold items whose preference value is at least this value are considered "relevant" for the purposes of computations
                */
              IRStatistics stats = evaluator.evaluate(
                            builder, //用于构建用于测试的推荐器(Recommender)的对象
                            null,    
                            //DataModelBuilder的实现类,如果是null,会使用默认的(GenericDataModel)
                            model,   //出入文件
                            null,    //可以是任何数字,计算偏好的时候使用
                            2,       //
                            GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 
                            1.0);
             
              System.out.println(stats.getPrecision());
              System.out.println(stats.getRecall());
       }
}


---待续


 

© 著作权归作者所有

上一篇: Shell
开拓者-2017
粉丝 38
博文 151
码字总数 301625
作品 0
大兴
程序员
私信 提问
Apache Mahout 0.8 发布,机器学习库

Apache Mahout 0.8 发布了,Apache Mahout 是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的机器学习算法,供开发人员在 Apache 在许可下免费使...

oschina
2013/07/26
2.9K
1
Apache Mahout 0.11.1 发布,机器学习库

Apache Mahout PMC 发布了 Mahout 0.11.1 版本,现已提供下载: http://www.apache.org/dist/mahout/0.11.1/ Mahout 0.11.0 扩展了与 Spark 版本的兼容性,引入了一些新特性和 bug 修复。 Ma...

oschina
2015/11/08
1K
0
Apache Mahout 0.10.1 发布

Apache Mahout 0.10.1 发布,此版本是 Mahout 0.10.0 版本的修复版本,修复了一些 bugs,升级 Spark 到 Spark 1.2.2 版本,现已提供下载:http://www.apache.org/dist/mahout/0.10.1/。 值得...

oschina
2015/06/01
1K
1
Mahout之Taste Webapp实战

Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚...

一枚Sir
2014/06/23
154
0
Mahout 0.10.0 发布,机器学习库

Mahout 0.10.0 发布,此版本主要更新信息如下: MAHOUT-1630: Incorrect SparseColumnMatrix.numSlices() causes IndexException in toString() (Oleg Nitz, smarthi) MAHOUT-1665: Update h......

oschina
2015/04/10
3.1K
10

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
8分钟前
1
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板 2、为该模板创建监控项 3、创建触发器 4、在zabbix-agent端操作 在/etc/zabbix/zabbix_agentd.d新建customize.confw文件 内容如下 UserParameter=mysql.replicat...

abowu
9分钟前
1
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
15分钟前
1
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
16分钟前
1
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部