zoukankan      html  css  js  c++  java
  • 推荐系统

    一、简介

    说到推荐系统,我们肯定是要问它是为什么而存在的,即存在的意义是什么。

    随着当今技术的飞速发展,数据量也与日俱增,人们越来越感觉在海量数据面前束手无策。正是为了解决信息过载(Information overload)的问题,人们提出了推荐系统(与搜索引擎对应,人们习惯叫推荐系统为推荐引擎)。当我们提到推荐引擎的时候,经常联想到的技术也便是搜索引擎。不必惊讶,因为这两者都是为了解决信息过载而提出的两种不同的技术,一个问题,两个出发点,我更喜欢称它们两者为兄弟,亲近而形象。

    兄弟二人有共同的目标,即解决信息过载问题,但具体的做法因人而异。

    搜索引擎更倾向于人们有明确的目的,可以将人们对于信息的寻求转换为精确的关键字,然后交给搜索引擎最后返回给用户一系列列表,用户可以对这些返回结果进行反馈,并且是对于用户有主动意识的,但它会有马太效应的问题,即会造成越流行的东西随着搜索过程的迭代会越流行,使得那些越不流行的东西石沉大海。

    而推荐引擎更倾向于人们没有明确的目的,或者说他们的目的是模糊的,通俗来讲,用户连自己都不知道他想要什么,这时候正是推荐引擎的用户之地,推荐系统通过用户的历史行为或者用户的兴趣偏好或者用户的人口统计学特征来送给推荐算法,然后推荐系统运用推荐算法来产生用户可能感兴趣的项目列表,同时用户对于搜索引擎是被动的。其中长尾理论(人们只关注曝光率高的项目,而忽略曝光率低的项目)可以很好的解释推荐系统的存在,试验表明位于长尾位置的曝光率低的项目产生的利润不低于只销售曝光率高的项目的利润。推荐系统正好可以给所有项目提供曝光的机会,以此来挖掘长尾项目的潜在利润。

    如果说搜索引擎体现着马太效应的话,那么长尾理论则阐述了推荐系统所发挥的价值。

    二、所属领域

    推荐系统是多个领域的交叉研究方向,所以会涉及机器学习以及数据挖掘方面的技巧(推荐系统==》数据挖掘/机器学习==》人工智能)。下图是主流研究方向的结构图。

     

    会议介绍:在这里主要整理一下上图所涉及到的研究方向相关的会议。

    RS(Recommender System):RecSys

    IR (Information Retrieval): SIGIR

    DM(Data Mining): SIGKDD,ICDM, SDM

    ML (Machine Learning): ICML, NIPS

    CV (Computer Vision): ICCV, CVPR, ECCV

    MM (MultiMedia): ACM MM

    DB (Database): CIKM, WIDM

    AI (Artificial Intelligence): IJCAI, AAAI

    三、推荐系统分类

    说到推荐系统的分类,我还是想从简单的方式开始,对于一些新颖的推荐系统方法,之后再介绍。根据推荐算法所用数据的不同分为基于内容的推荐、协同过滤的推荐以及混合的推荐。

    1.基于内容的推荐

    顾名思义,它是利用项目的内在品质或者固有属性来进行推荐,比如音乐的流派、类型,电影的风格、类别等,不需要构建UI矩阵。它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。

    以前一直觉得基于内容的推荐算法最简单,没有啥技术含量,直接基于项目的相似度来通过最近邻获取与目标项目最相似的项目列表,然后把用户没有行为记录并且评分高的项目推荐给特定用户。但后来看Andrew NG的机器学习课程中有一节对于推荐系统的介绍,他是通过机器学习的思想来通过训练来拟合用户的特征属性。首先我们需要一个效用函数来评价特定用户c对于特定项目s的评分:

    至于如何根据项目的内容属性来学习到跟项目一样维度的用户属性,这就涉及到另一公式:

    2.基于协同过滤的推荐

    顾名思义,它是通过集体智慧的力量来进行工作,过滤掉那些用户不感兴趣的项目。协同过滤是基于这样的假设:为特定用户找到他真正感兴趣的内容的好方法是首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用户。

    它一般采用最近邻技术,利用用户的历史喜好信息计算用户之间的距离,然后利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度,系统从而根据这一喜好程度来对目标用户进行推荐,通常需要用到UI矩阵的信息。协同过滤推荐又可以根据是否运用机器学习的思想进一步划分为基于内存的协同过滤推荐(Memory-based CF)和基于模型的协同过滤推荐(Model-based CF)。

    1)基于内存的协同过滤推荐

    其中基于内存的推荐系统(Memory-based CF)主要是通过启发式的方法来进行推荐,主要步骤一个是相似性函数的选择,如何选择合适的相似性函数来更好的度量两个项目或者用户的相似性是关键;另一个主要步骤是如何进行推荐,最简单的推荐方法是基于大多数的推荐策略,即推荐那些大多数人产生过行为而目标用户未产生过行为的项目。

    根据用户维度和项目维度的不同而分为Item-based CFUser-based CF

    Item-based CF:

    ①首先需要构建UI矩阵;

    ②根据UI矩阵来计算列(项目维度)的相似度;

    ③选择特定项目最相似的k个项目构成推荐列表;

    ④推荐给特定用户列表中还没有发生过行为的项目。

    User-based CF:

    ①首先需要构建UI矩阵;

    ②根据UI矩阵来计算行(用户维度)的相似度;

    ③选择特定用户最相似的k个用户;

    ④推荐给特定用户列表中还没有发生过行为而在相似用户列表中产生过行为的高频项目。

    2)基于模型的协同过滤推荐

    基于模型的推荐系统(Model-based CF)主要是运用机器学习的思想来进行推荐,说到机器学习思想那真是不胜枚举。记得小邬老师提过,目前机器学习主要是研究以下几种方式:

    ① 损失函数+正则项(Loss Function);

    通过对不同的任务来建立不同的损失函数加正则项来解决问题。比如著名的Lasso Regression、Ridge Regression以及Hinge Regression等。

    ② 神经网络+层(Neural Network);

    通过对不同的任务来设计不同的网络结构来解决问题。比如RNN、CNN以及GAN等。

    ③ 图模型+圈(Graph Model);

    通过运用图的知识来解决不同的实际问题。比如马尔科夫模型等。

    回到机器学习方法在推荐系统的应用上来,主要的方法为分类算法,回归算法、聚类算法、矩阵分解算法、神经网络算法、图模型算法以及隐语义模型等,在这主要介绍基于矩阵分解的推荐系统算法,以后有时间再慢慢补充吧。

    3.基于混合的推荐

    基于混合的推荐,顾名思义,是对以上算法的融合,像淘宝既有基于内容的推荐也有协同过滤的推荐。具体怎么融合还是要结合具体的应用场景,包括是对特征的融合还是对算法层面的融合。其中说到算法的融合,想到了机器学习模型常用的三种模型融合方法:Bagging、Boosting和Stacking。

    Bagging(装袋)方法:该方法通过重采样技术生成若干个不同的子训练集,然后在每个训练集上训练一个分类器,然后采用投票的方式取大多数的结果为模型的最终结果。模型更像是发挥民主作用的人民代表大会制度,还是大部分人说了算的。

    Boosting(强化提升)方法:每个训练样例都有权重,每次训练新分类器的时候都着重训练那些再上一次分类过程中分错的样例,权重会随着迭代次数的变化而变化。模型更像是有了记忆能力,加大力度惩罚那些在上一轮不乖的样例而使得他们越来越听话。

    Stacking(堆叠)方法:每个分类器首先做一遍决策,然后将分类器们的决策送到更高一层的模型中,把他们当做特征再进行一次训练。每个单独分类器的输出会作为更高层分类器的输入,更高层分类器可以判断如何更好的合并这些来自低层的输出。模型更像是神经网络中的轴突,低层的输出作为高层的输入。

    【具体思路】 给定一个train数据集和一个test数据集,我们的任务是分类。①首先需要确定基模型,在这选择KNN,DecisionTree和SVM三个;②其次是要把train数据集分成5折的交叉验证,4份用来训练,1份用来交叉验证;③选择一个基模型KNN,然后在train数据集上做交叉验证,每次用4N/5来训练,N/5来测试,共测试5次,这样就会得到整个train数据集上的预测;同样用每次训练好的模型来预测test,那么可以得到5个对于test的预测,然后取平均作为结果;⑤重复步骤3、4,这样会得到对于train的3列新的特征表达(每一列是一个基模型的预测结果),同理也会得到测试集的3列新的特征表达;⑥将新的3列train特征作为第二层模型(在这我们用LR)的输入,再次进行训练;⑦用test上3列新的特征作为输入,送入训练好的模型来预测结果。

    有几个基模型,就会对整个train数据集生成几列新的特征表达。同样,也会对test有几列新的特征表达。

    参考自:

    https://zhuanlan.zhihu.com/p/27502172

  • 相关阅读:
    用C#一次匹配HTML代码中A的链接和文字的方法
    去黑头的7个必胜秘方
    用C#写外挂或辅助工具必须要的WindowsAPI
    用C#把HTML内容转为UBB的方法
    Windows Server 2008 Standard, Enterprise, and Datacenter with Service Pack 2
    xmpp协议分析
    查看Win7的真实版本号方法
    什么是游戏NP?如何在NP下读写游戏内存及如何进入NP进程
    C#正则表达式扫盲 保证 10分钟入门 30分钟精通[绝对不可错过的文章]
    可扩展消息出席协议(XMPP):核心 RFC 3920
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/12468176.html
Copyright © 2011-2022 走看看