Mahout学习

article/2025/8/18 23:07:47

                                                     Mahout学习

Mahout学习(主要学习内容是Mahout中推荐部分的ItemCF、UserCF、Hadoop集群部署运行

1、Mahout是什么?

  • Mahout是一个算法库,集成了很多算法。
  • Apache Mahout 是 Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。
  • Mahout项目目前已经有了多个公共发行版本。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘
  • 通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到Hadoop集群
  • Mahout 的创始人 Grant Ingersoll 介绍了机器学习的基本概念,并演示了如何使用 Mahout 来实现文档集群、提出建议和组织内容。

2、Mahout是用来干嘛的?

2.1 推荐引擎

服务商或网站会根据你过去的行为为你推荐书籍、电影或文章。

2.2 聚类

Google news使用聚类技术通过标题把新闻文章进行分组,从而按照逻辑线索来显示新闻,而并非给出所有新闻的原始列表。

2.3 分类

雅虎邮箱基于用户以前对正常邮件和垃圾邮件的报告,以及电子邮件自身的特征,来判别到来的消息是否是垃圾邮件。

3、Mahout协同过滤算法

Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎。Taste既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste不仅仅只适用于Java应用程序,它可以作为内部服务器的一个组件以HTTP和Web Service的形式向外界提供推荐的逻辑。Taste的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。

Taste主要包括以下几个接口:

  • DataModel 是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息。Taste 默认提供 JDBCDataModel 和 FileDataModel,分别支持从数据库和文件中读取用户的喜好信息。
  • UserSimilarity 和 ItemSimilarity 。UserSimilarity 用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的“邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。ItemSimilarity 类似的,计算Item之间的相似度。
  • UserNeighborhood 用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的邻居用户的方式产生的。UserNeighborhood 定义了确定邻居用户的方法,具体实现一般是基于 UserSimilarity 计算得到的。
  • Recommender 是推荐引擎的抽象接口,Taste 中的核心组件。程序中,为它提供一个 DataModel,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类 GenericUserBasedRecommender 或者 GenericItemBasedRecommender,分别实现基于用户相似度的推荐引擎或者基于内容的推荐引擎。
  • RecommenderEvaluator :评分器。
  • RecommenderIRStatsEvaluator :搜集推荐性能相关的指标,包括准确率、召回率等等。

 

4、Mahout协同过滤算法编程

1、创建maven项目

2、导入mahout依赖

<dependencies><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout</artifactId><version>0.11.1</version></dependency><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-examples</artifactId><version>0.11.1</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency></dependencies>
 

3、下载电影评分数据

下载地址:http://grouplens.org/datasets/movielens/

数据类别:7.2万用户对1万部电影的百万级评价和10万个标签数据

4、基于用户的推荐

package com.ahu.learnmahout;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;import java.io.File;
import java.util.List;/*** Created by ahu_lichang on 2017/6/23.*/
public class BaseUserRecommender {public static void main(String[] args) throws Exception {//准备数据 这里是电影评分数据File file = new File("E:\\ml-10M100K\\ratings.dat");//将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的DataModel dataModel = new GroupLensDataModel(file);//计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);//计算最近邻域,邻居有两种算法,基于固定数量的邻居和基于相似度的邻居,这里使用基于固定数量的邻居UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(100, similarity, dataModel);//构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于用户的协同过滤推荐Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);//给用户ID等于5的用户推荐10部电影List<RecommendedItem> recommendedItemList = recommender.recommend(5, 10);//打印推荐的结果System.out.println("使用基于用户的协同过滤算法");System.out.println("为用户5推荐10个商品");for (RecommendedItem recommendedItem : recommendedItemList) {System.out.println(recommendedItem);}}
}

运行结果: 

5、基于物品的推荐

package com.ahu.learnmahout;import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;import java.io.File;
import java.util.List;/*** Created by ahu_lichang on 2017/6/24.*/
public class BaseItemRecommender {public static void main(String[] args) throws Exception {//准备数据 这里是电影评分数据File file = new File("E:\\ml-10M100K\\ratings.dat");//将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的DataModel dataModel = new GroupLensDataModel(file);//计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);//构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);//给用户ID等于5的用户推荐10个与2398相似的商品List<RecommendedItem> recommendedItemList = recommender.recommendedBecause(5, 2398, 10);//打印推荐的结果System.out.println("使用基于物品的协同过滤算法");System.out.println("根据用户5当前浏览的商品2398,推荐10个相似的商品");for (RecommendedItem recommendedItem : recommendedItemList) {System.out.println(recommendedItem);}long start = System.currentTimeMillis();recommendedItemList = recommender.recommendedBecause(5, 34, 10);//打印推荐的结果System.out.println("使用基于物品的协同过滤算法");System.out.println("根据用户5当前浏览的商品34,推荐10个相似的商品");for (RecommendedItem recommendedItem : recommendedItemList) {System.out.println(recommendedItem);}System.out.println(System.currentTimeMillis() -start);}
}

运行结果:

6、评估推荐模型

package com.ahu.learnmahout;import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;import java.io.File;/*** Created by ahu_lichang on 2017/6/24.*/
public class MyEvaluator {public static void main(String[] args) throws Exception {//准备数据 这里是电影评分数据File file = new File("E:\\ml-10M100K\\ratings.dat");//将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的DataModel dataModel = new GroupLensDataModel(file);//推荐评估,使用均方根//RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();//推荐评估,使用平均差值RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();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);}};// 用70%的数据用作训练,剩下的30%用来测试double score = evaluator.evaluate(builder, null, dataModel, 0.7, 1.0);//最后得出的评估值越小,说明推荐结果越好System.out.println(score);}
}
 

7、获取推荐的准确率和召回率 

package com.ahu.learnmahout;import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.IRStatistics;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;import java.io.File;/*** Created by ahu_lichang on 2017/6/24.*/
public class MyIRStatistics {public static void main(String[] args) throws Exception {//准备数据 这里是电影评分数据File file = new File("E:\\ml-10M100K\\ratings.dat");//将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的DataModel dataModel = new GroupLensDataModel(file);RecommenderIRStatsEvaluator statsEvaluator = new GenericRecommenderIRStatsEvaluator();RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {public Recommender buildRecommender(DataModel model) throws TasteException {UserSimilarity similarity = new PearsonCorrelationSimilarity(model);UserNeighborhood neighborhood = new NearestNUserNeighborhood(4, similarity, model);return new GenericUserBasedRecommender(model, neighborhood, similarity);}};// 计算推荐4个结果时的查准率和召回率//使用评估器,并设定评估期的参数//4表示"precision and recall at 4"即相当于推荐top4,然后在top-4的推荐上计算准确率和召回率IRStatistics stats = statsEvaluator.evaluate(recommenderBuilder, null, dataModel, null, 4, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);System.out.println(stats.getPrecision());System.out.println(stats.getRecall());}
}

 

5、Mahout运行在Hadoop集群

 1、Hadoop 执行脚本

hadoop jar mahout-examples-0.9-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /sanbox/movie/10M.txt --output /sanbox/movie/r -s SIMILARITY_LOGLIKELIHOOD

参数说明

  • --input(path) : 存储用户偏好数据的目录,该目录下可以包含一个或多个存储用户偏好数据的文本文件;
  • --output(path) : 结算结果的输出目录
  • --numRecommendations (integer) : 为每个用户推荐的item数量,默认为10
  • --usersFile (path) : 指定一个包含了一个或多个存储userID的文件路径,仅为该路径下所有文件包含的userID做推荐计算 (该选项可选)
  • --itemsFile (path) : 指定一个包含了一个或多个存储itemID的文件路径,仅为该路径下所有文件包含的itemID做推荐计算 (该选项可选)
  • --filterFile (path) : 指定一个路径,该路径下的文件包含了[userID,itemID] 值对,userID和itemID用逗号分隔。计算结果将不会为user推荐 [userID,itemID] 值对中包含的item (该选项可选)
  • --booleanData (boolean) : 如果输入数据不包含偏好数值,则将该参数设置为true,默认为false
  • --maxPrefsPerUser (integer) : 在最后计算推荐结果的阶段,针对每一个user使用的偏好数据的最大数量,默认为10
  • --minPrefsPerUser (integer) : 在相似度计算中,忽略所有偏好数据量少于该值的用户,默认为1
  • --maxSimilaritiesPerItem (integer) : 针对每个item的相似度最大值,默认为100
  • --maxPrefsPerUserInItemSimilarity (integer) : 在item相似度计算阶段,针对每个用户考虑的偏好数据最大数量,默认为1000
  • --similarityClassname (classname) : 向量相似度计算类
  • outputPathForSimilarityMatrix :SimilarityMatrix输出目录
  • --randomSeed :随机种子 -- sequencefileOutput :序列文件输出路径
  • --tempDir (path) : 存储临时文件的目录,默认为当前用户的home目录下的temp目录
  • --threshold (double) : 忽略相似度低于该阀值的item对

2、 执行结果

上面命令运行完成之后,会在当前用户的hdfs主目录生成temp目录,该目录可由 --tempDir (path) 参数设置.

 

后期学习补充:

Mahout 是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。

Mahout应用场景:

 

【转载】:https://www.cnblogs.com/ahu-lichang/p/7073836.html

参考:https://blog.csdn.net/m0epNwstYk4/article/details/78801104,mahout和spark的区别。


http://chatgpt.dhexx.cn/article/ewYBPsJQ.shtml

相关文章

metahuman 简介

目录 metahuman 简介 metahuman是什么登陆metahuman人物导出 metahuman 简介 metahuman是什么 是一个像游戏的捏脸软件&#xff0c;是云端的。在开始之前我们需要注册一个epic的账号 epic是一个白嫖游戏的网页&#xff0c;引擎&#xff0c;商城&#xff0c;metahuman都是他们做…

CTFHub | .htaccess

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

C++手敲基于梯度图和像素数量数组的OTSU阈值分割

一、OTSU算法原理 ➢OTSU法&#xff08;最大类间方差法&#xff0c;有时也称之为大津算法&#xff09; ➢ 使用聚类的思想&#xff0c;把图像的灰度数按灰度级分成2个部分&#xff0c; 使得两个部分之间的灰度值差异最大&#xff0c;每个部分之间的灰 度差异最小 ➢ 通过方差…

Otsu图像分割

opencv自带Otsu算法&#xff0c;只需要在分割时将参数选择为“cv2.THRESH_OTSU”即可 #coding:utf-8 import cv2 import numpy as np from matplotlib import pyplot as pltimage cv2.imread(E:/shale10053.bmp) grayimage cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray c…

OpenCV中图像的自适应处理、Otsu方法讲解与实战(附Python源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、自适应处理 很多时候图像色彩是不均衡的&#xff0c;如果只使用一种阈值处理类型&#xff0c;就无法得到清晰有效的结果 下面使用五种常用的阈值处理类型对色彩不均衡的图像进行处理 代码如下 import cv2image cv2.imread(&…

图像分割 - 阈值处理 - 多阈值处理(OTSU)

目录 1. 多阈值处理介绍 2. 代码讲解 3. 完整代码 1. 多阈值处理介绍 之前介绍的都是全局单个阈值对图像的分割。固定阈值法&#xff0c;阈值是人工根据灰度直方图的波谷进行设置的。全局阈值法&#xff0c;根据不停的迭代两个区域间的平均灰度进行分割。OUST最大类间方差法…

otsu算法详细推导、实现及Multi Level OTSU算法实现

otsu算法详细推导、实现及Multi Level OTSU算法实现 微信公众号&#xff1a;幼儿园的学霸 目录 文章目录 otsu算法详细推导、实现及Multi Level OTSU算法实现目录简介推导及实现常规推导算法步骤及实现步骤实现 从概率的角度解释推导实现 扩展-MultiLevel OTSU延伸思考算法评价…

OTSU算法及其改进算法学习

这篇文章还是来自斯坦福课后作业hw2_3&#xff0c;主要是结合一个例子介绍otsu算法【亦称为大律算法&#xff0c;小日本】及其改进算法。 本文将先介绍老外的题目、解题思路及maltab解答&#xff0c;然后分析otsu算法步骤&#xff0c;末了给出opencv实现。 老外的题目&#xff…

Otsu Thresholding

1. Otsu Thresholding Explained Otsu对image中的所有像素都假定为阈值&#xff0c;然后根据此值将image分为前景物体和背景&#xff1b;遍历所有像素值 计算类内方差&#xff0c;最小的类内方差对应的threshold即为最优阈值&#xff1b; 以6阶灰度图像为例 A 6-level greys…

Otsu算法原理及实现

在图像处理中Otsu方法&#xff0c;是以 Nobuyuki otsu 的名字命名的&#xff08;日本人&#xff0c;大津展之&#xff09;&#xff0c;常用于基于图像分割的聚类。该算法的理论依据是&#xff1a;假定图像包含两类像素&#xff08;前景像素和背景像素&#xff09;&#xff0c;直…

10 Otsu 算法

文章目录 前言一、Otsu 是什么&#xff1f;二、算法实验1.使用第三方库2.不使用第三方库 前言 Otsu 是一种利用图像的灰度特征自动计算二值化阈值的方法&#xff0c;常被称为 Otsu 自动阈值法。 使用 Otsu 方法可以避免主观性和繁琐性的阈值选取操作&#xff0c;并能够在一定…

OTSU(最大类间方差法、大津算法)

OTSU是阈值分割中一种常用的算法&#xff0c;它可以根据图像自动生成最佳分割阈值。OTSU的核心思想是类间方差最大化。 import cv2 import numpy as np from matplotlib import pyplot as pltimage cv2.imread("2.bmp") gray cv2.cvtColor(image, cv2.COLOR_BGR2G…

Bootstrap模态框里 再弹模态框

Bootstrap模态框里 再弹模态框 后端代码点击编辑 按钮 将参数赋值隐藏 input 中 , 便于修改 获取对应id修改模态框详情模态框 后端代码 /*** 财务审核使用详情** param request* param id* return*/RequestMapping(params "getUseDatil")ResponseBodypublic JSONAr…

新增模态框

平时我们在VS中也常常会用到模态框&#xff0c;今天我们就来聊聊模态框&#xff0c;但是我要说的是新增模态框&#xff0c;而不是修改模态框喔。在书写模态框代码时&#xff0c;我们还要引用一个插件: 然后就可以进行对代码进行书写了。 我们先说说模态框插件的用法&#xff0c…

html模态框常见问题,模态框无法弹出的问题

问题起因&#xff1a; 昨晚写到了一个模态框&#xff0c;用到了bootstrap和jquery&#xff0c;依赖的js已经复制到项目中&#xff0c;并在Jsp页面上进行了引用&#xff0c;最初的引用如下&#xff1a; 问题描述&#xff1a; 模态框无法正常弹出&#xff0c;使用浏览器查看资源看…

Vue模态框的封装

一、模态框 1、模态框&#xff1a;若对话框不关闭&#xff0c;不能操作其父窗口 2、非模态框&#xff1a;对话框不关闭&#xff0c;可以操作其窗口 二、Vue组件实现模态框的功能 1、模态框是一个子组件 2、显示和隐藏由父组件决定 3、对话框的标题也是由父组件传递的 4、对话框…

Bootstrap之模态框

前言 模态框&#xff08;Modal&#xff09;是覆盖在父窗体上的子窗体。通常&#xff0c;目的是显示来自一个单独的源的内容&#xff0c;可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。 用法 您可以切换模态框&#xff08;Modal&#xff09;插件的隐藏内…

php什么是模态框,bootstrap模态框有什么用

Bootstrap Modals(模态框)是使用定制的Jquery 插件创建的。 它可以用来创建模态窗口丰富用户体验&#xff0c;或者为用户添加实用功能。您可以在 Modals(模态框)中使用 Popover(弹出框)和 Tooltip(工具提示插件)。(推荐学习&#xff1a;Bootstrap视频教程) 将通过一些实例和解释…

弹出模态框

想必大家都知道弹出层的重要性&#xff0c;在很多的地方都能用到这个方法&#xff0c;所以说这种是非常的普遍的实用性&#xff0c;在大家编写过程中也是很常见的模态框以及弹出层&#xff0c;基本也是一个概念。 插件不可缺少 1.多窗口模式 层叠置顶 Esc 关闭 为什么是说多窗…

模态框动态赋值

模态框动态赋值&#xff0c;可以有多种方式&#xff1a;1、每次一个个填充&#xff1b;2、直接针对模态框中的ID赋值。。。 今天说下同事犯的错误&#xff0c;大家引以为鉴&#xff1a; 首先如图&#xff1a; 他在点击详情链接时&#xff0c;是能拿到相关参数的&#xff0c;进…