概述

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节点。如下所示:

交替最小二乘法

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

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

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

聊聊基于Alink库的推荐系统的更多相关文章

  1. 【论文笔记】基于图机构的推荐系统:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba

    论文:https://arxiv.org/abs/1803.02349    题外话: 阿里和香港理工联合发布的这篇文章,整体来说,还挺有意思的. 刚开始随便翻翻看看结构图的时候,会觉得:这也能发文章 ...

  2. 基于Spark的电影推荐系统(推荐系统~1)

    第四部分-推荐系统-项目介绍 行业背景: 快速:Apache Spark以内存计算为核心 通用 :一站式解决各个问题,ADHOC SQL查询,流计算,数据挖掘,图计算 完整的生态圈 只要掌握Spark ...

  3. WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...

  4. 基于Mahout的电影推荐系统

    基于Mahout的电影推荐系统 1.Mahout 简介 Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域 ...

  5. 基于 libpcap库的sniffer程序

    基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...

  6. 基于Platinum库的DMS实现(android)

    接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 ...

  7. 基于jsmpeg库下使用ffmpeg创建视频流连接websocket中继器传输视频并播放

    这个功能的基本工作是这样的: 1.使用node运行jsmpeg库下的websocket-relay.js文件,这个文件的作用是创建一个websocket视频传输中继器 2.运行ffmpeg,将输出发送 ...

  8. STM32F1固件库文件讲解与基于固件库新建MDK工程模板

    操作系统:win10 1.文件目录 (在cmd下用"cd 文件夹" 进入到要显示的文件夹,如cd d:\en.stsw-stm32054,然后输入tree 回车就会出现上图的目录结 ...

  9. 基于pytorch的电影推荐系统

    本文介绍一个基于pytorch的电影推荐系统. 代码移植自https://github.com/chengstone/movie_recommender. 原作者用了tf1.0实现了这个基于movie ...

  10. 【GMT43智能液晶模块】基于HAL库的SDRAM和LCD驱动例程(MDK工程&CubeMX工程)

    说明: 1.该工程基于HAL库实现动态存储器SDRAM驱动以及液晶控制器LCD驱动. 2.工程通过STM32CubeMX(Version 4.22.0)配置生成,可直接打开进行配置. 3.KEIL M ...

随机推荐

  1. linux awk文本

    目录 一.awk概念 二.awk的工作过程 三.awk字符 四.内置变量 五.getline  六.awk的精准筛选 七.例子演示 八.实验演示 一.awk概念 1.概念:awk 是一个功能强大的编辑 ...

  2. jenkins中的坑_CreateProcess error=1392

    环境:windows11,jdk1.8,jenkins_2.346.war 起因 最近在使用jenkins部署项目的时候,填写仓库的url地址时,发现填完后报500这个错误,于是我打开jenkins的 ...

  3. std::aligned_alloc

    定义于头文件 <cstdlib> (c++) void * aligned_alloc ( std::size_t alignment, std::size_t size); (c++17 ...

  4. 【HMS Core】Health Kit查询历史数据查询数据和返回数据不一致

    [问题描述] 查询一个月运动记录,只能查询到最早5月26的数据,但是华为健康app里的数据最早为5月8日,为什么会查询不到? [解决方案] 1.需要检查是否申请了历史数据权限,查询数据时,出于对用户的 ...

  5. 一站式数据可观测性平台 Datavines 正式开源啦

    Datavines是一站式开源数据可观测性平台,提供元数据管理.数据概览报告.数据质量管理,数据分布查询.数据趋势洞察等核心能力,致力于帮助用户全面地了解和掌管数据,让您做到心中有数,目前作为 Dat ...

  6. W1R3S-1项目实战

    前言 您受聘在W1R3S.inc单个服务器上进行渗透测试,并报告所有发现.他们要求您获得root访问权限并找到标志(位于/root目录中). 难以获得低特权外壳:初级/中级 获得特权升级的难度:初级/ ...

  7. 【后端面经-Java】AQS详解

    目录 1. AQS是什么? 2. AQS核心思想 2.1 基本框架 2.1.1 资源state 2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析 3.1 acquire(int) 3.1 ...

  8. Unity中的PostProcessBuild:深入解析与实用案例

    Unity中的PostProcessBuild:深入解析与实用案例 在Unity游戏开发中,我们经常需要在构建完成后对生成的应用程序进行一些额外的处理.这时,我们可以使用Unity提供的PostPro ...

  9. Day02_Java_作业

    A:选择题 1. 若有定义:int a,b; a=a+10;则执行上述语句后,a的值是(d). A. 10 B. 11 C. 0 D. 编译产生错误 2. 以下选项中变量均已正确定义,合法的赋值语句是 ...

  10. Java开发大型互联网-架构师必须掌握的分布式技术

    Java开发大型互联网-架构师必须掌握的分布式技术 摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务.作为架构师,要能够应对这样的挑战,就必须 ...