美文网首页NLP搜索推荐🦁
Mahout推荐系统初试

Mahout推荐系统初试

作者: Wumpus | 来源:发表于2018-10-29 10:03 被阅读79次

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

    在 Mahout 实现的机器学习算法

    Mahout 实现的机器学习算法

    Taste简介

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

    Taste 由以下组件组成:

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

    基于Taste的协同过滤推荐系统

    数据准备

    随机模拟一份数据,如图,为mysql中的一个表,uid代表用户id,iid代表物品id,score代表用户打分,也可以直接用二进制文本保存数据:


    MySQL中随机模拟的数据

    引入maven包

    <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>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    

    基于用户的协同过滤代码(还有基于物品,SlopeOne,SVD的推荐器,代码雷同,不贴出来了)

    package com.example;
    
    import java.io.File;
    import java.util.List;
    
    import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
    import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
    import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
    import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
    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.recommender.Recommender;
    import org.apache.mahout.cf.taste.similarity.UserSimilarity;
    
    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    public class TestMahout {
    
        public static void main(String[] args) throws Exception {
    
            MysqlDataSource dataSource = new MysqlDataSource();
            dataSource.setUseSSL(true);
            dataSource.setServerName("your_server_name");
            dataSource.setPort(your_port);
            dataSource.setUser("your_user_name");
            dataSource.setPassword("your_password");
            dataSource.setDatabaseName("your_database_name");
    
            JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "your_table_name", "uid", "iid",
                    "score", "ts");
    
            // 基于文件构建模型
            // DataModel dataModel = new FileDataModel(new File("C:\\Users\\l00382753\\Desktop\\test.txt"));
    
            // 相似度计算(皮尔森相似度)
            UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
    
            // 设置相似用户阈值(或使用NearestNUserNeighborhood)
            UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, dataModel);
    
            // 基于以上数据创建推荐器(这里使用的是基于用户的推荐,还有GenericItemBasedRecommender等推荐器)
            Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
    
            // 给用户推荐物品(这里是给用户4推荐5个物品)
            List<RecommendedItem> recommendItems = recommender.recommend(4, 5);
    
            // 打印结果
            for (RecommendedItem recommendedItem : recommendItems) {
                System.out.println(recommendedItem);
            }
        }
    }
    

    运行结果

    协同过滤结果

    相关文章

      网友评论

        本文标题:Mahout推荐系统初试

        本文链接:https://www.haomeiwen.com/subject/wagvtqtx.html