推荐系统 Mahout入门之简单使用

article/2025/10/9 22:41:33

Mahout:

Apache Mahout 是 Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout项目目前已经有了多个公共发行版本。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到Hadoop集群。

推荐系统的数学原理:

以最简单的基于协同过滤而言,其数学原理在最简化抽象形式而言就是比较两个对象之间的余弦相似度。其比较值越小说明两者相似度越小(三维空间中两对象非平行或近乎垂直状态,多维空间更为复杂)。下面就常见算法做出介绍。

关联分析:

本例不做介绍。

基于用户:

设存在User1、User2、User3三个用户,Goods A、Goods B、Goods C三个商品。其中User Background表描述了用户之间的信息背景相似度。可以明显看出User1与User2是比较相似的,那么就认为User1喜爱的Goods A同样也应该被User2所喜爱。
在这里插入图片描述

基于产品:

设存在User1、User2、User3三个用户,Goods A、Goods B、Goods C三个商品。其中Goods Background表描述了物品之间的信息背景相似度。可以明显看出Goods A与Goods B是比较相似的,那么就认为喜爱的Goods A的用户同样也喜爱Goods B。
在这里插入图片描述

协同过滤:

协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。基于用户和产品属于协同过滤的算法,NNS与KNN也属于。

系统架构:

在这里插入图片描述

一个标准的IS架构(仅涉及推荐部分)如图所示。当然具体的系统实际上架构是不一样的。尤其是针对海量用户而言对其做出推荐喜好分析是一件特别耗费资源的事,再加上微服务大行其道的今天,单独为IS配备服务器也是常见的。小型的系统可能架构方面没有这么讲究,推荐接口配合用户数据库加上推荐规则和输出接口就构成了一个简单的IS架构。

常见接口/类:

Recommender类:

  • GenericUserBasedRecommender:基于用户的推荐器,用户数量少时速度快;
  • GenericItemBasedRecommender:基于商品推荐器,商品数量少时速度快,尤其当外部提供了商品相似度数据后效率更好;
  • SlopeOneRecommender:基于slope-one算法的推荐器,在线推荐或更新较快,需要事先大量预处理运算,物品数量少时较好;
  • SVDRecommender:奇异值分解,推荐效果较好,但之前需要大量预处理运算;
  • KnnRecommender:基于k近邻算法(KNN),适合于物品数量较小时;
  • TreeClusteringRecommender:基于聚类的推荐器,在线推荐较快,之前需要大量预处理运算,用户数量较少时效果好

Similarity类:

  • CityBlockSimilarity:基于Manhattan距离相似度
  • EuclideanDistanceSimilarity:基于欧几里德距离计算相似度
  • LogLikelihoodSimilarity:基于对数似然比的相似度
  • PearsonCorrelationSimilarity:基于皮尔逊相关系数计算相似度
  • SpearmanCorrelationSimilarity:基于皮尔斯曼相关系数相似度
  • TanimotoCoefficientSimilarity:基于谷本系数计算相似度
  • UncenteredCosineSimilarity:计算 Cosine 相似度

接口:

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

数据格式:

Mahout支持数据库、文本文件、csv文件等格式。

数据库要求格式:

  • 用户ID列需要是BIGINT而且非空
  • 物品ID列需要是BIGINT而且非空
  • 用户喜好值列需要是FLOAT
  • 建议在用户ID和物品ID上建索引

文本文件:

  • 每一行包含一个用户id,物品id,用户喜好
  • 逗号隔开或者Tab隔开

csv格式:

  • 每一行包含一个用户id,物品id,用户喜好
  • 逗号隔开或者Tab隔开

Java示例:

数据源:test.dat(为了方便记事本创建即可)

1,1,1.5
1,2,1.8
1,3,2.0
1,4,4.5
1,5,4.92,1,0.5
2,2,0.2
2,3,3.8
2,4,4.2
2,5,1.23,1,3.5
3,2,4.2
3,3,2.3
3,4,1.2
3,5,1.34,1,1.5
4,2,1.2
4,3,1.6
4,4,1.9
4,5,1,85,1,3.4
5,2,4.5
5,3,2.3
5,4,1.3
5,5,1.26,1,1.5
6,2,2.0
6,3,2.2
6,4,4.2
6,5,4.1

使用步骤:

  1. 创建DataModel模型,可以基于文件File的DataModel,也可基于数据库的JDBCDataModel;
  2. 计算相似度;
  3. 构建推荐器,基于用户或基于内容进行推荐;
  4. 传入基本参数用于计算用户的推荐(如用户id、商品id、待推荐的物品数目范围值)。

代码:

        File file = new File("M:\\test.dat");// 实例化DataModel并将数据传入其内DataModel dataModel = null;try {dataModel = new FileDataModel(file);} catch (IOException e) {e.printStackTrace();}// 计算相似度ItemSimilarity itemSimilarity = null;try {itemSimilarity = new PearsonCorrelationSimilarity(dataModel);} catch (TasteException e) {e.printStackTrace();}// 构建推荐器,使用基于物品的协同过滤推荐GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);List<RecommendedItem> recommendedItemList = null;try {// 计算用户2当前浏览的商品2,推荐2个相似的商品recommendedItemList = recommender.recommendedBecause(2, 2, 2);} catch (TasteException e) {e.printStackTrace();}System.out.println("使用基于物品的协同过滤算法");System.out.println("根据用户2当前浏览的商品2,推荐2个相似的商品");for (RecommendedItem recommendedItem : recommendedItemList) {System.out.println(recommendedItem);}long start = System.currentTimeMillis();try {recommendedItemList = recommender.recommendedBecause(5, 1, 3);} catch (TasteException e) {e.printStackTrace();}System.out.println("使用基于物品的协同过滤算法");System.out.println("根据用户5当前浏览的商品1,推荐3个相似的商品");for (RecommendedItem recommendedItem : recommendedItemList) {System.out.println(recommendedItem);}System.out.println(System.currentTimeMillis() -start);

结果:
在这里插入图片描述

依赖:

<dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-core</artifactId><version>0.9</version>
</dependency><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-integration</artifactId><version>0.9</version>
</dependency><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-math</artifactId><version>0.9</version>
</dependency><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-examples</artifactId><version>0.9</version>
</dependency>

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

相关文章

Mahout介绍和简单应用

Mahout学习&#xff08;主要学习内容是Mahout中推荐部分的ItemCF、UserCF、Hadoop集群部署运行&#xff09; 1.Mahout是什么&#xff1f; Mahout是一个算法库,集成了很多算法。 Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09;旗下的一个开源项目&…

脚手架开发流程

先把原理讲通&#xff0c;方便后续的开发。 后续都拿vue-cli举例 脚手架实现原理 为什么全局安装vue/cli后会添加的命令为vue&#xff1f;全局安装vue/cli时发生了什么&#xff1f;执行vue命令时发生了什么&#xff1f;为什么vue指向一个js文件&#xff0c;我们却可以直接通过…

ns2模拟仿真实验

内容&#xff1a; 编写TCL脚本&#xff0c;搭建如下图所示的一个网络&#xff0c;共6个节点&#xff0c;其中2、3节点用做ftp服务器和客户端&#xff0c;4、5节点用做cbr流量的源和目的&#xff0c;而0、1节点用做转发设备。各节点间的链路属性见图。 模拟时间设为13秒钟&#…

NS2网络仿真环境的搭建和使用

一实验概述: 1学会安装和使用NS2&#xff1b;熟悉NS2的文档结构&#xff1b;掌握NS2的仿真环境、使用界面和操作方法。 2学会安装NS2仿真环境和配置。 3了解NS2的工作原理和程序组成。 4熟悉NS2中的脚本语言Tcl和Otcl 5学习分裂对象模型和TclCL 6NS的时间调度机制学习。 …

NS2的NODE类——node

本文转自&#xff1a;http://hi.baidu.com/wirelesscat/blog/item/67c6db4633f71e016b63e59b.html 同时推荐一个很好的博客&#xff0c;这里有连载的 ns2 仿真问题&#xff0c;感谢大牛&#xff5e;&#xff5e;&#xff5e; 博客地址&#xff1a;http://hi.baidu.com/wirele…

NS2问题解决

问题一&#xff1a; When configured, ns found the right version of tclsh in /usr/bin/tclsh8.6 but it doesnt seem to be there anymore, so ns will fall back on running the first tclsh in your path. The wrong version of tclsh may break the test suites. Reconfi…

NS2简单介绍

NS是一种针对网络技术的源代码公开的、免费的软件模拟平台&#xff0c;研究人员使用它可以很容易的进行网络技术的开发&#xff0c;而且发展到今天&#xff0c;它所包含的模块已经非常丰富&#xff0c;几乎涉及到了网络技术的所有方面。所以&#xff0c;NS成了目前学术界广泛使…

NS2网络仿真

NS2安装与配置TCP/UDP比较仿真静态/动态路由仿真 1.安装与配置 1.1更新系统 sudo apt-get update #更新源列表 sudo apt-get upgrade #更新已经安装的包 sudo apt-get dist-upgrade #更新软件&#xff0c;升级系统 1.2安装ns2需要的几个包 sudo apt-get install build-ess…

ns2安装详细过程与网络仿真

ns2安装详细过程与网络仿真 博客分类&#xff1a; Networks TclLinuxUnixGCCVC 简单的说&#xff0c;NS&#xff0d;2是一个网络模拟器&#xff0c;所以经常被用到网络课的教学中。 NS-2是OpenSource的&#xff0c;最早的版本是在linux/unix下运行的&#xff0c;后来有了wi…

NS2教程

柯老师的NS2新网址 Due to some reasons, my NS2 website is sometimes donw and unavailable for many users. Therefore, I provide another backup website. 1. NS2 http://csie.nqu.edu.tw/smallko/ns2/ns2.htm 2. old_NS2 (backup of NS2 Learning Guide) http://csie.n…

ns2安装和若干问题的解决方法

文章目录 1. 安装与配置2. 安装nam3. 配置环境变量4. 检查是否能够成功运行参考资料 在安装ns2的过程中遇到了很多问题&#xff0c;为了记录这些问题和为同样遇到这些问题的朋友提供思路&#xff0c;写下这篇博文。 安装ns2和nam主要分为如下几个步骤&#xff1a; 安装与配置…

Linux下安装ns2

最近为了项目需要用到NS2软件用于网络仿真实验&#xff0c;从Windows到Linux折腾了我将近一周的时间。在Windows装了卸、卸了装十几遍还是不成功&#xff0c;最后放弃了&#xff0c;回到了Linux系统&#xff0c;又折腾了两天终于安装测试成功&#xff01;&#xff08;安装其实蛮…

企业微信第三方扫码登录

为什么写这个文章 公司后台突然需要扫码登录&#xff0c;网上的企业微信扫码都是基于自建应用的扫码登录&#xff0c;对第三方的扫码并没有多加介绍 概述 企业微信的管理员和成员&#xff0c;可通过单点登录机制&#xff0c;登录到第三方网站。第三方可通过接口&#xff0c;…

微信第三方登录有两种登录方式, 1. 微信开放平台登录 2. 微信公众平台授权登录?

https://www.v2ex.com/amp/t/390333 微信开放平台登录与微信公众平台授权登录区别在哪? 2017-09-13 12:05:41 08:00 xoxo419 微信第三方登录有两种登录方式, 1. 微信开放平台登录 2. 微信公众平台授权登录? 问: 两者区别在哪? 壹号店 http://m.yhd.com 微信第三方登录属…

Android APP微信第三方登录踩坑 - 微信开放平台修改应用包名后微信第三方登录失败

在微信开放平台注册移动应用&#xff0c;才能在APP里实现「微信登录」和「微信支付」。 近期因为业务需要&#xff0c;需要修改应用的包名&#xff0c;因此在微信开发平台重新提交了应用「基本信息」修改申请&#xff0c;顺便吐槽下&#xff0c;现在微信开发平台对应用审核真是…

微信第三方登录redirect_uri 参数错误

微信第三方登录 先说解决方案&#xff1a;redirect_uri 参数错误 在开放平台设置好回调地址&#xff0c;例如地址是 www.niezhiliang.com 那么在生成二维码的时候回调只能写该域名下的地址 在申请二维码页面回调地址(你的redirect_uri) 还必须加上http或者https&#xff0c;…

微信第三方登录接口

随着手机微信的崛起&#xff0c;腾讯发布的微信联登确实很诱惑pc端的伙伴们&#xff0c;现在就说说在pc端用微信扫一扫实现微信第三方登陆的方式。 第一步&#xff1a;获取AppID AppSecret(不做解释&#xff0c;自己去微信公众平台申请) 第二步&#xff1a;生成扫描二维码&…

微信 第三方登录

转自&#xff1a;http://www.cnblogs.com/linjunjie/p/6378166.html#3902595 从http://www.cnblogs.com/v-weiwang/p/5732423.html 申请开发者账号之内的就不累赘了&#xff0c;网上一大堆&#xff1a; 说下需求&#xff0c;一个网页要在三类容器运行&#xff0c;公司app&#…

微信第三方登录

微信第三方登录 步骤&#xff1a; 1.申请你的AppID 请到微信开放平台https://open.weixin.qq.com/注册成为开发者&#xff0c;然后创建应用并提交审核&#xff0c;只有审核通过的应用才能进行开发。 2.下载SDK及API文档 Android Studio环境下&#xff1a; 在build.gradle文件…

流程图了解微信第三方登录

1.首先是&#xff0c;浏览器显示微信登录 2.用户扫描&#xff0c;发送请求到微信服务器&#xff0c;前端也会发送一个请求到自己的后台服务器&#xff0c;后台服务器提供微信服务器获取第三方验证授权地址&#xff0c;携带回调路径 3.微信服务器验证成功&#xff0c;返回code…