NLP搜索推荐🦁

Mahout推荐系统初试

2018-10-29  本文已影响79人  Wumpus

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);
        }
    }
}

运行结果

协同过滤结果
上一篇下一篇

猜你喜欢

热点阅读