zoukankan      html  css  js  c++  java
  • 【Machine Learning】Mahout基于协同过滤(CF)的用户推荐

    一、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
  • 相关阅读:
    javascript基础全等号运算符
    javascript 使用ScriptX实现打印
    跨服务器与本地服务器不同数据库的SQL操作语句
    ASP.NET网络上实现单点登录
    FGMap API 帮助文档
    基于ArcEngine写的GoogleMap地图切割程序
    基于SuperMap Objects写的GoogleMap地图切割程序(三)
    使用SuperSocket开发联网斗地主(四):出牌
    JAVA创建对象方法
    Mysql 外键约束
  • 原文地址:https://www.cnblogs.com/yangxiao99/p/4753420.html
Copyright © 2011-2022 走看看