一、Mahout推荐算法简介

Mahout算法框架自带的推荐器有下面这些:

l  GenericUserBasedRecommender:基于用户的推荐器,用户数量少时速度快;

l  GenericItemBasedRecommender:基于商品推荐器,商品数量少时速度快,尤其当外部提供了商品相似度数据后效率更好;

l  SlopeOneRecommender:基于slope-one算法的推荐器,在线推荐或更新较快,需要事先大量预处理运算,物品数量少时较好;

l  SVDRecommender:奇异值分解,推荐效果较好,但之前需要大量预处理运算;

l  KnnRecommender:基于k近邻算法(KNN),适合于物品数量较小时;

l  TreeClusteringRecommender:基于聚类的推荐器,在线推荐较快,之前需要大量预处理运算,用户数量较少时效果好;

Mahout最常用的三个推荐器是上述的前三个,本文的实例仅“基于用户的推荐器”做个实验,其实大体原理都差不多。

二、基于协同过滤(CF)模型的用户推荐

Mahout里自带的基本CF模型原理如下:

GenericUserBasedRecommender是基于用户(user-based)的简单推荐器实现类,推荐主要参照传入的DataModel和UserNeighborhood,总体是三个步骤:

(1)从UserNeighborhood获取当前用户Ui最相似的K个用户集合{U1, U2, …Uk};

(2)从这K个用户集合排除Ui的偏好商品,剩下的Item集合为{Item0, Item1, …Itemm};

(3)对Item集合里每个Itemj计算Ui可能偏好程度值pref(Ui, Itemj),并把Item按此数值从高到低排序,前N个item推荐给用户Ui

偏好程度值pref计算公式:

三、数据库结构设计

创建数据库mahoutDB,里面创建表table1,具体表的结构如下所示,里面包含4个特征:userId,itemId, preference, date,分别代表用户ID、商品ID、偏好分数、交易日期。

建好table1之后,表结构如下所示。

往table1里导入事先准备好的数据data.txt,

mysql>LOAD DATA LOCAL INFILE ‘data.txt’ INTO TABLE table1;

导入完成过后数据如下所示。

用户ID为1的记录如下所示。

交易日期为20140825的记录如下所示。

当中有一条记录,比如用户ID=2的选择了商品202,偏好值为3.5。那么之后应根据模型算法,将相似用户找出,并把相似用户的偏好商品(排除userId=2他自己所选商品)推荐给用户2。

import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
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.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.similarity.UserSimilarity; import com.mysql.MysqlDataSource; /**
* mahout基于协同过滤(CF)的推荐
*
*/
public class Mahout {
public static void main(String[] args) throws TasteException { //(1)----连接数据库部分
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");
dataSource.setUser("admin");
dataSource.setPassword("admin");
dataSource.setDatabaseName("mahoutDB");
//(2)----使用MySQLJDBCDataModel数据源读取MySQL里的数据
JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "table1", "userId", "itemId", "preference", "date"); //(3)----数据模型部分
//把MySQLJDBCDataModel对象赋值给DataModel
DataModel model = dataModel;
//用户相似度UserSimilarity:包含相似性度量和邻居参数
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
//相邻用户UserNeighborhood
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
//一旦确定相邻用户,一个普通的user-based推荐器被构建,构建一个GenericUserBasedRecommender推荐器需要数据源DataModel,用户相似性UserSimilarity,相邻用户相似度UserNeighborhood
Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
//向用户1推荐2个商品
List<RecommandedItem> recommendations = recommender.recommend(1, 2);
for(RecommendedItem recommendation : recommendations){
//输出推荐结果
System.out.println(recommendation);
}
}
转自:http://blog.csdn.net/dianacody/article/details/39079015

【Machine Learning】Mahout基于协同过滤(CF)的用户推荐的更多相关文章

  1. 基于协同过滤的个性化Web推荐

    下面这是论文笔记,其实主要是摘抄,这片博士论文很有逻辑性,层层深入,所以笔者保留的比较多. 看到第二章,我发现其实这片文章对我来说更多是科普,科普吧…… 一.论文来源 Personalized Web ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  3. 协同过滤CF算法之入门

    数据规整 首先将评分数据从 ratings.dat 中读出到一个 DataFrame 里: >>> import pandas as pd In [2]: import pandas ...

  4. 推荐系统算法学习(一)——协同过滤(CF) MF FM FFM

    https://blog.csdn.net/qq_23269761/article/details/81355383 1.协同过滤(CF)[基于内存的协同过滤] 优点:简单,可解释 缺点:在稀疏情况下 ...

  5. mahout基于Hadoop的CF代码分析(转)

    来自:http://www.codesky.net/article/201206/171862.html mahout的taste框架是协同过滤算法的实现.它支持DataModel,如文件.数据库.N ...

  6. 协同过滤 CF & ALS 及在Spark上的实现

    使用Spark进行ALS编程的例子可以看:http://www.cnblogs.com/charlesblc/p/6165201.html ALS:alternating least squares ...

  7. 基于物品的协同过滤item-CF 之电影推荐 python

    推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...

  8. 基于mllib的协同过滤实战(电影推荐)

    //加载需要的包 import org.apache.spark.rdd._ import org.apache.spark.mllib.recommendation.{ALS, Rating, Ma ...

  9. MapReduce实现协同过滤中每个用户看过的项目集合

    一.知识准备 hadoop自带的例子在 D:\HADOOP_HOME\hadoop-2.6.4\share\hadoop\mapreduce\sources\hadoop-mapreduce-exam ...

随机推荐

  1. Nginx Rewrite规则记录

    Rewrite 是一种服务器的重写脉冲技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术.它还可以实现限制特定IP访问网站的功能.很多情况下,某个 IP 的访问很容易造成 CPU ...

  2. RedGate 工具SQLMultiScript1.1

    原文:RedGate 工具SQLMultiScript1.1 RedGate 工具SQLMultiScript1.1 SQLMultiScript是一个脚本分发工具,当你写好了一个SQL脚本之后,你需 ...

  3. 将 Android* x86 NDK 供 Eclipse* 而移植 NDK 演示示例应用程序

    目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根.并可集成到整个 Android 应用开发中(构建原生库. ...

  4. IIS的WebGarden、WebFarm和StateServer

    开启IIS的WebGarden.WebFarm和StateServer之旅 前言 公司系统虽然配置有1台NLB后拖4台App Server最后搭一台强劲无比的DB Server,但每天下午4点左右总被 ...

  5. Visual Studio 有哪些好用的插件?

    推荐一批绝大部分都是免费的能较好增强写代码舒适度的. .NET Demon -- (非免费)安装后可以连续编译, 如果不买License的话过期后也还有代码改动后自动保存的上好功能, 安装它之后再也不 ...

  6. unrecognized selector sent to instance 0x10b34e810

    一个错误: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLEr ...

  7. nyoj 117 找到的倒数 【树阵】+【分离】

    这个问题的解决方案是真的很不错!!! 思路:建立一个结构体包括val和id. val就是输入的数,id表示输入的顺序.然后依照val从小到大排序.假设val相等.那么就依照id排序. 假设没有逆序的话 ...

  8. Linux 下开启ssh服务(转)

    二.SSH SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目 ...

  9. 逆向wireshark学习SSL协议算法(转)

    小贴士:SSL协议的定义 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整 ...

  10. android 他们定义对话框

    创建一个布局文件 my_dialog.xml <?xml version="1.0" encoding="utf-8"?> <Relative ...