mahout是 Apache Software Foundation (ASF)开发的一个开源项目,主要包括了一些经典机器学习算法的实现,并且通过对hadoop的支持可以很容易的拓展到云上,对mahout的关注主要是因为它收纳了Taste框架。
一、关于安装
有两种方式可以使用mahout,一种是直接安装:按照JDK->maven->mahout->hadoop的顺序,参照http://www.docin.com/p-239482860.html,这个过程我只完成了一半,因为后来发现mahout可以直接在eclipse里集成,非常简单->(http://www.cnblogs.com/dlts26/archive/2011/09/13/2174889.html)
二、taste实施流程
在《mahout in action》里有这么一张图:
可以看到mahout实现推荐的一个大致流程,首先将数据组织成DataModel格式,在此基础上计算UserSimilarity,并形成UserNeighborhood记录,之后把这些数据塞进现成的recommender接口里就可以得到相应的推荐结果,下面是一个实例
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. 数据格式。大部分网站的数据应该是存在数据库里了,那么mahout所要求的数据model的格式是DataModel,这中间需要经历一个转换,好在已经有现成的MySQLJDBCModel ,但是其默认是通过JNDI方式查找数据源,如果想单独加载数据库运行一个推荐算法,就要通过这种方式
MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setServerName("my_database_host"); dataSource.setUser("my_user"); dataSource.setPassword("my_password"); dataSource.setDatabaseName("my_database_name"); JDBCDataModel dataModel = new MySQLJDBCDataModel( dataSource, "my_prefs_table", "my_user_column", "my_item_column", "my_pref_value_column");
这种连接方式效率很成问题,肯定不能用在生产环境,而我们自己直接实现DataModel接口所要实现的方法又过多(详情可见mahout api ,https://builds.apache.org//job/Mahout-Quality/javadoc/)比如生产用的hibernate或ibatis,如何生成mahout需要的model,要好好考虑一下。
2. 计算效率。mahout是通过DataModel形式对preference记录存储做了优化的,但是具体在应用中的表现,如内存占用率、响应速度还需要进一步考察,这里面涉及到缓存的使用策略。
3. 验证。 要构建一个靠谱的推荐框架,验证这一步肯定是必不可少的。这里就有一个推荐系统一直纠结的问题了:到底什么样的推荐结果是好的,如果根据用户以往的评分记录进行推荐,那么那些没有评分的item就一定代表用户不喜欢么,恐怕未必。所以这里就有一个对“好”的定义的策略问题,这直接影响到推荐系统的效果。
4.冷启动。这也是很纠结的问题了,用户第一次登陆系统,无推荐记录,你推荐给他什么。看了一些相关文章,各系统的解决方案不同,有推荐当前热点的,也有强制用户注册时选择偏好信息的,不一而足,这也是一个需要考虑的问题。