首页 > 其他分享 >聊聊基于Alink库的推荐系统

聊聊基于Alink库的推荐系统

时间:2023-09-29 12:55:06浏览次数:37  
标签:基于 FILE Alink 推荐 聊聊 物品 new DATA COL

概述

Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面:

  1. 算法选择

推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。

  1. 推荐方式

输入信息可以有多种选择,输入结果也有多种情况。

  • 同时输入一个用户信息和一个物品信息,计算用户对此物品的评分。
  • 输入用户的信息,可以推荐适合此用户的相关物品,也可以计算与其相似的用户。
  • 输入物品的信息,推荐给可能喜欢该物品的用户,也可以计算与其相似的物品。
  1. 使用方法

在应用推荐引擎时,可能是在离线任务中进行批量推荐,也可能是在实时任务中对流式数据进行推荐,还可以通过使用Alink Java SDK将推荐引擎嵌入用户的应用系统。

推荐算法

基于物品的协同过滤

基于物品的协同过滤算法(Item-based Collaborative Filtering),Alink提供了相关的组件。模型训练为离线批式训练,对应组件为ItemCfTrainBatchOp,得到ItemCf模型。基于此模型可以进行多种推荐,但不是每种推荐方式使用该ItemCf算法都可以得到较好的效果。Alink只提供了适合该算法的推荐方式:评分预测(ItemCfRate)、根据用户推荐物品(ItemCfItemsPerUser)、计算相似物品(ItemCfSimilarItems)。考虑到每种推荐需要支持多种使用方式,每种方法都提供了3种组件——批式推荐(RecommBatchOp)、流式推荐(RecommStreamOp)和Pipeline节点。如下所示:
418328041.jpeg

交替最小二乘法

基本思路为交替固定用户特征向量和物品特征向量的值,每次求解一个最小二乘问题,直到满足求解条件。根据用户-物品矩阵中的值额含义是评分值还是行为次数、观看/收听时长,分别选用显示反馈算法与隐式反馈算法。两种计算方式得到ALS模型格式是一样的,后面可以选用五种推荐方式,并且每种方法都提供了3种组件——批式推荐、流式推荐、Pipeline节点。如下所示:
-1238822384.jpeg

关于最小二乘法可以参考 交替最小二乘法

Alink组件支持

Alink在推荐组件方面提供的组件是比较多的。详细说明如下
现支持的算法如下:

  • 基于物品的协同过滤(ItemCf)
  • 基于用户的协同过滤(UseCf)
  • ALS显式反馈算法(Als)
  • ALS隐式反馈算法(AlsImplicit)
  • FM算法

推荐方法如下:

  • 评分预测(Rate)
  • 根据物品推荐用户(UserPerItem)
  • 根据用户推荐物品(ItemsPerUser)
  • 计算相似物品(SimilarItems)
  • 计算相似用户(SimilarUsers)

使用方法如下:

  • 批式推荐
  • 流式推荐
  • Pipeline节点

Alink实现推荐系统

实现概览

基于物品的协同过滤推荐实现概览

static TsvSourceBatchOp getSourceRatings() {
    return new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);
}


/**
 * 基于ItemCf算法做推荐
 * 1.基于ItemCfTrainBatchOp算子做协同过滤模型的训练,并将训练好的模型保存
 * 2.基于ItemCfItemsPerUserRecommender算子的推荐过程;包括推荐、查找物品名称、选择列并排序
 * */
static void c_5() throws Exception {

    if (!new File(DATA_DIR + ITEMCF_MODEL_FILE).exists()) {

        getSourceRatings()
            .link(
                new ItemCfTrainBatchOp()
                    .setUserCol(USER_COL)
                    .setItemCol(ITEM_COL)
                    .setRateCol(RATING_COL)
            )
            .link(
                new AkSinkBatchOp()
                    .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
            );
        BatchOperator.execute();

    }

    MemSourceBatchOp test_data = new MemSourceBatchOp(new Long[]{1L}, "user_id");

    new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .transform(test_data)
        .print();

    LocalPredictor recomm_predictor = new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setK(20)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .collectLocalPredictor("user_id long");

    System.out.println(recomm_predictor.getOutputSchema());

    LocalPredictor kv_predictor = new Lookup()
        .setSelectedCols(ITEM_COL)
        .setOutputCols("item_name")
        .setModelData(getSourceItems())
        .setMapKeyCols("item_id")
        .setMapValueCols("title")
        .collectLocalPredictor("item_id long");

    System.out.println(kv_predictor.getOutputSchema());

    MTable recommResult = (MTable) recomm_predictor.map(Row.of(1L)).getField(1);

    System.out.println(recommResult);


    new Lookup()
        .setSelectedCols(ITEM_COL)
        .setOutputCols("item_name")
        .setModelData(getSourceItems())
        .setMapKeyCols("item_id")
        .setMapValueCols("title")
        .transform(
            getSourceRatings().filter("user_id=1 AND rating>4")
        )
        .select("item_name")
        .orderBy("item_name", 1000)
        .lazyPrint(-1);

    LocalPredictor recomm_predictor_2 = new ItemCfItemsPerUserRecommender()
        .setUserCol(USER_COL)
        .setRecommCol(RECOMM_COL)
        .setK(20)
        .setExcludeKnown(true)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ITEMCF_MODEL_FILE)
        )
        .collectLocalPredictor("user_id long");

    recommResult = (MTable) recomm_predictor_2.map(Row.of(1L)).getField(1);

    System.out.println(recommResult);

}

ALS推荐实现概览

/**
 * 基于ALS算法做推荐
 * 1.基于AlsTrainBatchOp算子做协同过滤模型的训练,并将训练好的模型保存
 * 2.基于AlsRateRecommender算子的推荐过程;包括推荐、查找物品名称、选择列并排序
 * */
static void c_4() throws Exception {

    TsvSourceBatchOp train_set = new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_TRAIN_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);

    TsvSourceBatchOp test_set = new TsvSourceBatchOp()
        .setFilePath(DATA_DIR + RATING_TEST_FILE)
        .setSchemaStr(RATING_SCHEMA_STRING);
    train_set.lazyPrint(10);

    if (!new File(DATA_DIR + ALS_MODEL_FILE).exists()) {

        train_set
            .link(
                new AlsTrainBatchOp()
                    .setUserCol(USER_COL)
                    .setItemCol(ITEM_COL)
                    .setRateCol(RATING_COL)
                    .setLambda(0.1)
                    .setRank(10)
                    .setNumIter(10)
            )
            .link(
                new AkSinkBatchOp()
                    .setFilePath(DATA_DIR + ALS_MODEL_FILE)
            );
        BatchOperator.execute();

    }

    new PipelineModel
        (
            new AlsRateRecommender()
                .setUserCol(USER_COL)
                .setItemCol(ITEM_COL)
                .setRecommCol(RECOMM_COL)
                .setModelData(
                    new AkSourceBatchOp()
                        .setFilePath(DATA_DIR + ALS_MODEL_FILE)
                ),
            new Lookup()
                .setSelectedCols(ITEM_COL)
                .setOutputCols("item_name")
                .setModelData(getSourceItems())
                .setMapKeyCols("item_id")
                .setMapValueCols("title")
        )
        .transform(
            test_set.filter("user_id=1")
        )
        .select("user_id, rating, recomm, item_name")
        .orderBy("rating, recomm", 1000)
        .lazyPrint(-1);

    BatchOperator.execute();

    new AlsRateRecommender()
        .setUserCol(USER_COL)
        .setItemCol(ITEM_COL)
        .setRecommCol(RECOMM_COL)
        .setModelData(
            new AkSourceBatchOp()
                .setFilePath(DATA_DIR + ALS_MODEL_FILE)
        )
        .transform(test_set)
        .link(
            new EvalRegressionBatchOp()
                .setLabelCol(RATING_COL)
                .setPredictionCol(RECOMM_COL)
                .lazyPrintMetrics()
        );
    BatchOperator.execute();

}

算子函数

AlsTrainBatchOp
AlsRateRecommender

ItemCfTrainBatchOp
ItemCfItemsPerUserRecommender

标签:基于,FILE,Alink,推荐,聊聊,物品,new,DATA,COL
From: https://www.cnblogs.com/zhiyong-ITNote/p/17736917.html

相关文章

  • 基于ssm的人口结构预测网站系统设计教程
    一、系统描述系统采用JSP+MySQL的模式构建,使用了比较典型的SSM技术框架,以Web网页的形式与用户进行交互,实现了包括注册与登录模块、资讯信息模块、论坛交流模块、人口数量模块、人口结构预测模块、人口结构走势模块等功能。通过人口预测,为相关生育政策与动向作参考。系统功能完整,源......
  • m基于16QAM调制的音频信号同步接收器matlab仿真,包括gardner符号同步,载波同步以及CMA
    1.算法仿真效果matlab2022a仿真结果如下:锁定过程的星座图变化情况:定时收敛曲线:载波同步收敛曲线:2.算法涉及理论知识概要基于16QAM(QuadratureAmplitudeModulation)调制的音频信号同步接收器是一个复杂但高效的通信系统。该系统主要涉及三个关键部分:Gardner符号同步、载波......
  • m基于16QAM调制的音频信号同步接收器matlab仿真,包括gardner符号同步,载波同步以及CMA
    1.算法仿真效果matlab2022a仿真结果如下: 锁定过程的星座图变化情况:    定时收敛曲线:   载波同步收敛曲线:   2.算法涉及理论知识概要         基于16QAM(QuadratureAmplitudeModulation)调制的音频信号同步接收器是一个复杂但高效的通信......
  • 基于vue和element-ui的搜索下拉滚动条组件
    ......
  • 聊聊基于Alink库的决策树模型算法实现
    示例代码及相关内容来源于《Alink权威指南(Java版)》概述决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。特征......
  • 【闲暇一写】基于TCP协议写的FTP管理工具
    这是一个FTP(文件传输协议)管理工具,能够支持文件上传下载以及操作服务端的文件。该工具由客户端和服务端组成。客户端与服务端通过Socket连接实现通信,客户端发送命令,服务端解析并执行相应的操作。部分代码已省略,下面是服务端和客户端代码的详细解释。GitHub:https://github.com/......
  • 基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案
    一、方案背景近年来,随着居民体育运动意识的增强,体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时,可能发生受伤意外,甚至牵扯责任赔偿纠纷问题。同时,物品丢失、人力巡逻成本问题突出,体育场馆在给居民提供运动场地的同时,还需特别关注场馆内人员的人身和财产安全以及运动器械......
  • 基于AIOps实现智慧园区极简IT运维
    随着物联网、云平台、大数据、人工智能等技术的发展,并逐步投入到智慧园区的建设,传统园区数字化转型加快。园区的形式包括产业园区、教育园区、制造业园区、科研园区、社区等等,园区形态不断演进和发展,园区网承载的对象和业务也越来越多。业务种类爆炸性增长,业务变更愈加频繁,网络运......
  • 89基于java的在线调查问卷系统设计与实现(含配套lun文,可参考做毕设)
    本章节给大家带来一个基于java在线调查问卷系统设计与实现,可适用于基于java在线校园调查问卷,基于java校园问卷调查系统,java问卷调查系统,校园在线问卷调查,校园在线调查问卷系统设计,调查问卷管理系统,基于Javaweb实现在线调查问卷系统,网上调查问卷系统,网上问卷调查系统等等;项目背......
  • 基于三菱Q系列cc-Link的立体仓库控制系统
    系统说明:    方案选择:  工艺流程:  触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了   本文章为原创作品,转载请注明出处,否则将会追究法律责任。 ......