mahout 记录

article/2025/10/9 21:43:37

mahout 记录

mahout记录

输入

mahout 是以偏好(preference)的形式来表达的,一个偏好包含一个用户ID、一个物品ID、还有一个用户对物品偏爱程度的数值

  • 简单示意图:

DataModel 实现存储并为计算提供其所需的所有偏好、用户和物品数据。

UserSimilarity实现给出两个用户之间的相似度,可从多种可能度量或计算中选用一种来作为依据。
UserNeighborhood 实现明确了与给定用户最相似的一组用户。最后, Recommender 实现合并
所有这些组件为用户推荐物品。

DataModel

在Mahout中使用 DataModel 这种抽象机制对推荐程序的输入数据进行封装,而 DataModel
的实现为各类推荐算法提供了对数据的高效访问。

MySQLJDBCDataModel

mahout 提供了多种DataModel的实现,这里只说一种MySQL数据库实现的数据源读取

  • 默认情况下,这个实现假设所有的偏好数据位于一个名为 taste_preferences 的表中,其中用户ID的列为 user_id ,物品ID的列为 item_id ,偏好值的列为 preference ,还可以包含Java long型的timestamp字段
user_iditem_idpreference
BIGINT NOT NULL INDEXBIGINT NOT NULL INDEXFLOAT NOT NULL
PRIMARY KEYPRIMARY KEY

想要自定义实现其他的DataModel,可以继承DataModel来实现相关方法,例如改成spring集成的数据源管理

public interface DataModel extends Refreshable, Serializable {LongPrimitiveIterator getUserIDs() throws TasteException;PreferenceArray getPreferencesFromUser(long var1) throws TasteException;FastIDSet getItemIDsFromUser(long var1) throws TasteException;LongPrimitiveIterator getItemIDs() throws TasteException;PreferenceArray getPreferencesForItem(long var1) throws TasteException;Float getPreferenceValue(long var1, long var3) throws TasteException;Long getPreferenceTime(long var1, long var3) throws TasteException;int getNumItems() throws TasteException;int getNumUsers() throws TasteException;int getNumUsersWithPreferenceFor(long var1) throws TasteException;int getNumUsersWithPreferenceFor(long var1, long var3) throws TasteException;void setPreference(long var1, long var3, float var5) throws TasteException;void removePreference(long var1, long var3) throws TasteException;boolean hasPreferenceValues();float getMaxPreference();float getMinPreference();
}

PreferenceArray 是偏好聚合的接口,具有类似数组的API

FastByIDMap 和 FastIDSet

  • 与 HashMap 类似, FastByIDMap 是基于散列的。但它在处理散列冲突时使用的是线性探测(linear probing),而非分离链接(separate chaining)。这样便不必为每个条目(entry)都增加一个额外的 Map.Entry 对象; Object 对内存的消耗是惊人的
  • 在Mahout推荐程序中键(key)和成员(member)通常采用原始类型 long ,而非 Object 。使用 long 型的键可以节约内存并提升性能
  • Set 实现的内部没有使用 Map
  • FastByIDMap 可以作为高速缓存,因为它有一个最大空间的概念;超过这个大小时,若要新加入条目则会把不常用的移走

无偏好数据

当只表述关联,不含关联程度时,输入的偏好没有值

GenericBooleanPrefDataModel构建DataModelBuilder

RecommenderEvaluator evaluator =new AverageAbsoluteDifferenceRecommenderEvaluator();RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {public Recommender buildRecommender(DataModel model)throws TasteException {UserSimilarity similarity =new PearsonCorrelationSimilarity(model);UserNeighborhood neighborhood =new NearestNUserNeighborhood(10, similarity, model);returnnew GenericUserBasedRecommender(model, neighborhood, similarity);}};DataModelBuilder modelBuilder = new DataModelBuilder() {public DataModel buildDataModel(FastByIDMap<PreferenceArray> trainingData) {return new GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(trainingData));}};double score = evaluator.evaluate(recommenderBuilder, modelBuilder, model, 0.9, 1.0);System.out.println(score);

进行推荐

各个推荐组合可以定制,通常包含如下组件:

  • 数据模型,由 DataModel 实现
  • 用户间的相似性度量,由 UserSimilarity 实现
  • 用户邻域的定义,由 UserNeighborhood 实现
  • 推荐引擎,由一个 Recommender 实现

基于用户

算法

for every item i that u has no preference for yetfor every other user v that has a preference for icompute a similarity s between u and vincorporate v's preference for i, weighted by s, into a running average
return the top items, ranked by weighted average

相似性度量

mahout提供了多种相似性度量的实现

  • PearsonCorrelationSimilarity 基于皮尔逊相关系数的相似度 用来反映两个变量线性相关程度的统计量 范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。

    1、 不考虑重叠的数量;2、 如果只有一项重叠,无法计算相似性(计算过程被除数有n-1);3、 如果重叠的值都相等,也无法计算相似性(标准差为0,做除数)。

  • EuclideanDistanceSimilarity 基于欧氏距离定义相似度 利用欧式距离d定义的相似度s,s=1 / (1+d)。范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。

    同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响,同样地,Mahout通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

  • UncenteredCosineSimilarity 采用余弦相似性度量 多维空间两点与所设定的点形成夹角的余弦值。范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

    在数学表达中,如果对两个项的属性进行了数据中心化,计算出来的余弦相似度和皮尔森相似度是一样的,在mahout中,实现了数据中心化的过程, 所以皮尔森相似度值也是数据中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity类作为计算非中心化数据的余弦相似度。

  • TanimotoCoefficientSimilarity 忽略偏好值基于谷本系数计算相似度 又名广义Jaccard系数,是对Jaccard系数的扩展,范围:[0,1],完全重叠时为1,无重叠项时为0,越接近1说明越相似。

  • LogLikelihoodSimilarity 基于对数似然比更好地计算相似度 重叠的个数,不重叠的个数,都没有的个数

Weighting.WEIGHTED 进行similarity加权拓展

基于物品

算法

for every item i that u has no preference for yetfor every item j that u has a preference forcompute a similarity s between i and jadd u's preference for j, weighted by s, to a running average
return the top items, ranked by weighted average

Slope-one 推荐算法

两个物品之间存在某种线性关系,eg:Y=mX+b,所以此算法需要有预处理的步骤

for every item ifor every other item jfor every user u expressing preference for both i and jadd the difference in u's preference for i and j to an average

这基础上:

for every item i the user u expresses no preference forfor every item j that user u expresses a preference forfind the average preference difference between j and iadd this diff to u's preference value for jadd this to a running average
return the top items, ranked by these averages

slope-one是有代价的:内存消耗, MySQLJDBCDiffStorage 可以预先计算差异值并在数据库中更新它们。它们需要和JDBC支持的 DataModel 实现(比如MySQLJDBCDataModel )结合起来使用

利用 IDRescorer 修改推荐结果

调用如下方法实现

recommend(long userID, int howMany, IDRescorer rescorer)

DBCDiffStorage 可以预先计算差异值并在数据库中更新它们。它们需要和JDBC支持的 DataModel 实现(比如MySQLJDBCDataModel )结合起来使用

利用 IDRescorer 修改推荐结果

调用如下方法实现

recommend(long userID, int howMany, IDRescorer rescorer)

参考:
《mahout in action》
Mahout构建图书推荐系统


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

相关文章

Apache Mahout初体验

1、Mahout是什么&#xff1f; Mahout是一个算法库,集成了很多算法。 Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09;旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能…

java调用集群mahout_Mahout--用Maven构建Mahout项目(mahoutDemo)

前言 基于Hadoop的项目,不管是MapReduce开发,还是Mahout的开发都是在一个复杂的编程环境中开发。Java的环境问题,是困扰着每个程序员的噩梦。Java程序员,不仅要会写Java程序,还要会调linux,会配hadoop,启动hadoop,还要会自己运维。所以,新手想玩起Hadoop真不是件简单的…

使用Mahout搭建推荐系统之入门篇-Mahout实战

原始地址&#xff1a;http://my.oschina.net/Cfreedom/blog/201828 用意&#xff1a; 结合上篇博客&#xff0c;写写代码熟悉一下Mahout。很多地方想法都比较粗糙&#xff0c;亟待指正。 代码放在了&#xff1a; https://github.com/xiaoqiangkx/qingRS 一、基本内容 1. 加载…

Mahout初探

mahout官网,执行下面命令,详细安装过程可参考Mahout介绍、安装与应用案例 tar -xzvf apache-mahout-distribution-0.13.0.tar.gzln -s apache-mahout-distribution-0.13.0 mahout 修改profile环境变量 export MAHOUT_HOME/home/hadoop/application/mahout export MAHOUT_CONF…

mahout java api_Mahout推荐算法API详解

前言 用Mahout来构建推荐系统&#xff0c;是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法&#xff0c;并实现了并行化&#xff0c;提供非常简单的API接口&#xff1b;困难是因为我们不了解算法细节&#xff0c;很难去根据业务的场景进行算法配置和调…

mahout LDA

什么是Mahout&#xff1f; ” Apache Mahout™ project’s goal is to build a scalable machine learning library ” 我来拓展一下&#xff1a;(1) Mahout 是Apache旗下的开源项目&#xff0c;集成了大量的机器学习算法。(2) 大部分算法&#xff0c;可以运行在Hadoop上&…

Mahout

1、Mahout是什么 Mahout是一个算法库,集成了很多算法。Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09;旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Ma…

mahout 详解

前言 用Mahout来构建推荐系统&#xff0c;是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法&#xff0c;并实现了并行化&#xff0c;提供非常简单的API接口&#xff1b;困难是因为我们不了解算法细节&#xff0c;很难去根据业务的场景进行算法配置和调…

基于Mahout实现协同过滤推荐算法的电影推荐系统

1 Mahout介绍 Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09; 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编…

Mahout简介

Mahout简介 一、mahout是什么 Apache Mahout是ApacheSoftware Foundation &#xff08;ASF&#xff09;旗下的一个开源项目&#xff0c;提供了一些经典的机器学习的算法&#xff0c;皆在帮助开发人员更加方便快捷地创建智能应用程序。目前已经有了三个公共发型版本&#xff0…

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

Mahout&#xff1a; Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09;旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout项目目前已经有了多个公共发行…

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…