前言
最近太忙了,很久没有更新文章了。最近一段时间也在看一些书,关于大数据的推荐系统领域,根据自己的所见所想对整个推荐系统做了一个简单的流程图并进行了简单的分析,并对所用到的算法进行了一个简单的调用说明。(其中太多的细节没有说明,只介绍了整体流程)
数据流程
如果关于大数据相关知识相对比较薄弱的同学,我们可以简单假设一个场景,就是上述流程图就是关于一个在线服装店,其中收集数据就包括了用户的点评,分享,打分等信息。其中准备数据阶段可以采用点击流技术来分析处理数据,这里不做过多的赘述。紧接着对数据进一步进行处理,其中包括降噪和归一等操作(降噪就是去除爬虫,错误,归一就是将数据的设置为同意的标准值,比如不同的币种来结算,我们可以将其同意转成美元或者黄金的操作)。
对数据进行过降噪和归一后我们可以简单理解为数据已经经过处理,可以直接用来进行数据分析等操作了。结果的数据结构如下:
pid | 服装id | 时间戳(这里我们可以忽略,其中::为数据分隔符)
1::527::5::978824195
1::2340::3::978300103
1::48::5::978824351
1::1097::4::978301953
数据集下载地址:https://grouplens.org/datasets/movielens/
数据结构我们清楚了,这里我们再次明确我们的任务就是进行推荐操作
其实作为大数据行业的研发工程师,很少能够有能力或者有精力去写一些推荐算法,所以作为数据工程师主要是调用推荐算法,推荐算法主要分为第一代和第二代两种协同过滤算法。
第一代:基于用户的协同过滤算法,比如算用户与用户之间的相似度
然后截取最近邻域(按照邻居个数、按照邻居的距离),用户A的相似用户的偏好物品的结果集,是用来推荐的。推荐的结果集与用户A已经购买过的进行去重
第二代:基于物品的协同过滤算法, 算物品与物品之间的相似度,然后截取最近邻域(按照邻居个数、按照邻居的距离) 。拿着用户已经购买的商品,去找每个商品相似度最高的商品列表。
这里说的协同算法我们指的是mahout推荐算法:
Mahout是一个算法库,集成了很多算法。
Apache Mahout 是 Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。
Mahout项目目前已经有了多个公共发行版本。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。
通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到Hadoop集群。
Mahout 的创始人 Grant Ingersoll 介绍了机器学习的基本概念,并演示了如何使用 Mahout 来实现文档集群、提出建议和组织内容。
关于mahout推荐算法其实并不需要数据研发工程师具体了解其具体的执行流程,因为我们算法工程师已经将其封装成比较完善的api了,我们可以可以根据需要来调用。举个例子来说我们这里准备将已经过滤的数据来对一些用户进行商品推荐,我们可以调用mahout接口来实现对指定用户推荐指定数量商品(衣服)的功能。
mahout入门使用介绍
先看一段代码:
//准备数据 这里是商品评分数据
File file = new File("D:\\ml-1m\\ml-1m\\ratings.dat");
//将数据加载到内存中
DataModel dataModel = new GroupLensDataModel(file);
//计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。,这里用的是皮尔逊算法
ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);
//构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐
GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
//给用户ID等于1001的用户推荐10个与2410相似的商品
List<RecommendedItem> recommendedItemList = recommender.recommendedBecause(1001, 2410, 10);
//打印推荐的结果
System.out.println("使用基于物品的协同过滤算法");
System.out.println("根据用户5当前浏览的商品2410,推荐10个相似的商品");
for (RecommendedItem recommendedItem : recommendedItemList) {
System.out.println(recommendedItem);
}
long start = System.currentTimeMillis();
recommendedItemList = recommender.recommendedBecause(1001, 2411, 10);
//打印推荐的结果
System.out.println("使用基于物品的协同过滤算法");
System.out.println("根据用户1001当前浏览的商品2411,推荐10个相似的商品");
for (RecommendedItem recommendedItem : recommendedItemList) {
System.out.println(recommendedItem);
}
System.out.println("耗时:"+(System.currentTimeMillis() -start)+"毫秒");
}
打印结果:
使用基于物品的协同过滤算法
根据用户5当前浏览的商品2410,推荐10个相似的商品
RecommendedItem[item:1669, value:8.0]
RecommendedItem[item:3855, value:7.9308305]
RecommendedItem[item:1879, value:7.5]
RecommendedItem[item:3796, value:7.464102]
RecommendedItem[item:3677, value:7.2215104]
RecommendedItem[item:2966, value:6.752034]
RecommendedItem[item:2624, value:6.669245]
RecommendedItem[item:3192, value:6.6366343]
RecommendedItem[item:3055, value:6.5772333]
RecommendedItem[item:2297, value:6.50903]
使用基于物品的协同过滤算法
根据用户1001当前浏览的商品2411,推荐10个相似的商品
RecommendedItem[item:3823, value:9.330127]
RecommendedItem[item:3855, value:8.0]
RecommendedItem[item:1669, value:7.7755194]
RecommendedItem[item:1879, value:7.5]
RecommendedItem[item:3796, value:7.464102]
RecommendedItem[item:3514, value:6.80736]
RecommendedItem[item:3298, value:6.352809]
RecommendedItem[item:3677, value:6.2376842]
RecommendedItem[item:1704, value:6.215929]
RecommendedItem[item:3183, value:6.1904764]
耗时:7毫秒
mahout代码介绍
通过代码行数可以发现,短短十来行代码就可以实现一套基于协同过滤算法实现的推荐系统。简单分析一下代码其实首先获取文件对象,然后构建Model,紧接着是构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐。关于协同过滤算法的核心主要有四个对象:
1.相似度
UserSimilarity 和 ItemSimilarity 相似度实现有以下几种:
CityBlockSimilarity :基于Manhattan距离相似度
EuclideanDistanceSimilarity :基于欧几里德距离计算相似度
LogLikelihoodSimilarity :基于对数似然比的相似度
PearsonCorrelationSimilarity :基于皮尔逊相关系数计算相似度
SpearmanCorrelationSimilarity :基于皮尔斯曼相关系数相似度
TanimotoCoefficientSimilarity :基于谷本系数计算相似度
UncenteredCosineSimilarity :计算 Cosine 相似度
2.最近邻域
UserNeighborhood 主要实现有两种:
NearestNUserNeighborhood:对每个用户取固定数量N个最近邻居
ThresholdUserNeighborhood:对每个用户基于一定的限制,取落在相似度限制以内的所有用户为邻居
关于邻域,其实就是把所有原始数据放进到缓存中,然后物品与用户的关系或者用户与物品的关系一一映射,根据邻域值来匹配该物品被用户喜爱的所有物品信息。
3.推荐引擎
Recommender分为以下几种实现:
GenericUserBasedRecommender:基于用户的推荐引擎
GenericBooleanPrefUserBasedRecommender:基于用户的无偏好值推荐引擎
GenericItemBasedRecommender:基于物品的推荐引擎
GenericBooleanPrefItemBasedRecommender:基于物品的无偏好值推荐引擎
4.推荐系统评测
RecommenderEvaluator有以下几种实现:
AverageAbsoluteDifferenceRecommenderEvaluator :计算平均差值
RMSRecommenderEvaluator :计算均方根差
最后
由于本人不是专业研究算法的,所以这里只是给大家一个思路,有兴趣的可以针对性进行研究,主要目的是让大家知道关于如何调用协同过滤算法。如有不足之处,还请多多指教。