参考博客:
1,Mahout推荐算法基础。http://blog.csdn.net/ppcat_001/article/details/7736822
2,用Maven构建Mahout项目。http://blog.fens.me/hadoop-mahout-maven-eclipse/
Mahout的推荐引擎已经高度模块化,用户能基于Mahout用极简单的代码构建自己的推荐引擎。这篇博文参考上面两篇博文创建了一个简单的推荐引擎。
开始这个实例之前,有3个背景要交待:
1,实例基于Maven来管理项目。
2,Mahout有基于本机内存和基于hadoop分布式计算两种模式,本实例选择第一种。后面会有基于第二种的实例以及这两种方式的比较。
3,Mahout的推荐引擎按照模块的执行顺序可以分为:数据模型模块,近邻模块,相似度模块,推荐模块。这是本例程序的逻辑结构,也是初学者理解如何基于Mahout推荐引擎构建自己的推荐引擎的思路。
四大模块初识:数据模块,DataModel,类似于javaweb的javabean,就是用来封装数据的。
近邻模块,根据各种基于统计学的数学算法计算各个记录之间的距离,Mahout实现的距离算法可参考:从源代码剖析Mahout推荐引擎
相似度模块:近邻模块算出距离之后,对于某个user或者item,安装某种规则取出top N,如取出3个距离最近的记录,或者10%的最近的记录,这里的3和10%有我们根据经验或者客户要求确定。
推荐模块:将相似度模块的结果安装某种结构封装到对象中,供我们解析调用。
这四个模块都有API,只要按照一定的逻辑顺序,调用相应的API,就可以完成一个推荐程序。Apache mahout 官方不只是提供了API,还推荐了逻辑顺序:按照下图中的1,2,3,4调用API,即可完成一个推荐程序。
5,实践开始。
第一步,准备数据。数据说明:一种是有用户偏好的数据,三列(UserId,ItemId,User-preference),用户id,物品id,用户偏好;另一种是没有用户偏好的数据,只有两列。这里要特别注意的是针对不同的数据创建的数据模型DataModel是不一样的。
第二步,创建数据模型。
对于有用户偏好的数据:DataModel dataModel=new FileDataModel(file);
对于没有用户偏好的数据:DataModel dataModel =new GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(dataModel));
第三步,计算用户相似度。相似度就是通过各种“距离”表现出来,计算相似度就是运用各个距离公式计算距离。对于不同种类的数据要使用不同的距离算法。
对于有用户偏好的数据,或者说必须要有用户偏好的算法如下:
近邻算法分为2种:
- NearestNUserNeighborhood:指定N的个数,比如,选出前10最相似的用户。
- ThresholdUserNeighborhood:指定比例,比如,选择前10%最相似的用户。