精华内容
下载资源
问答
  • 2018-10-17 20:42:58

    文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

    相关文章:

    1. 协同过滤推荐算法和基于内容推荐算法的区别?
    2. 推荐算法的分类
    3. 推荐算法中LFM模型

    1.基于内容推荐推荐算法      

    基于内容的推荐只考虑了对象本身性质,将对象按照标签形成集合,如果你消费集合中的一个则向你推荐集合中其他的对象;根据物品或内容的元数据,发现物品或内容的相关性,然后基于用户以前的的喜好记录推送给用户相似的物品,它不能进行实时的进行推送;

    2.协同过滤推荐算法

          协同过滤算法又分为三种:基于用户的协同过滤算法,基于商品的协同过滤算法,基于模型的协同过滤算法

    协同过滤的推荐算法:充分利用集体智慧,即大量的人群的行为和数据收集的答案,以帮助我们对整个人群得到统计意义上的结论,推荐的个性化程度高,基于以下两点:

    1)兴趣相近的用户可能会对同样的东西感兴趣;

    2)用户可能偏爱与自己购买的东西相类似的商品;

    也就是说考虑进去了用户的历史习惯,对象客观上不一定相似,但是人的行为有可能主观上是相似的,就可以产生推荐了。

    更多相关内容
  • 推荐算法(一)—— 基于内容的推荐算法 1 基于内容的推荐算法 基于内容的推荐系统本质是对内容进行分析,建立特征;基于用户对何种特征的内容感兴趣以及分析一个内容具备什么特征来进行推荐。 1.1 基于内容的...

    推荐算法(一)——  基于内容的推荐算法

     

    1 基于内容的推荐算法

    基于内容的推荐系统本质是对内容进行分析,建立特征;基于用户对何种特征的内容感兴趣以及分析一个内容具备什么特征来进行推荐。

    1.1 基于内容的推荐算法流程

    (1)特征(内容)提取:提取每个待推荐物品的特征(内容属性),例如分类标签;

    (2)用户偏好计算:利用用户过去的显示评分或者隐式操作记录,计算用户不同特征(内容属性)上的偏好分数。计算偏好分数的方法,可以直接使用统计特征,即计算用户在不同标签下的分数。

    比如,用户A对某些科幻类的书籍评分是4.0,4.2,4.4,爱情类书籍评分为3.0,2.8,3.2,则用户A在科幻下的分数为4.2(平均值),爱情下的分数为3.0。若对于时间敏感的标签特征,可以加入时间因子。计算公式:{\color{Magenta} {\color{Magenta} }}{\color{Blue} 4.0*\alpha ^{diff1}+4.2*\alpha ^{diff1}+4.4*\alpha ^{diff3}}{\color{Magenta} },其中a为小于1的值,diff为评分距今的时间间隔,间隔越长,评分的贡献越低。

    (3)内容召回:将待推荐物品的特征与用户偏好得分匹配,取出用户最优可能喜欢的物品池,比如(2)中用户A,若待推荐物品有一些科幻书籍和一些爱情类书籍,用户A的物品池里面应该科幻书籍的物品池。

    (4)物品排序:按用户偏好召回的物品池,可能一次性挑选出很多内容,这时候可以进一步进行排序。例如用户A给某三本科幻书籍的评分很高,但是其它用户对其中两本科幻类书籍的评分较低,另一本略高,则按照排序,把别的用户评价略高的书籍推荐给A。

     

    基于内容推荐方法的优点:

    1.不用考虑冷启动问题,因为物品的内容特征不依赖于用户数据;

    2.能为具有特殊兴趣爱好的用户进行推荐;

    3.原理简单,易于定位问题。

     

     

    1.2 基于内容推荐的特征提取

    真实推荐系统中的待推荐的物品会有一些可以描述它的特征。这些特征可以分为两种:结构化特征和非结构化特征。

    (1)结构化特征就是特征的取值在某个区间范围内,应且可以按照定长的格式来表示 。比如书籍的标签分为五类:爱情、科幻、剧情、恐怖、推理,那么某本书X的结构化特征可以用一个5位的二进制表示;

    (2)非结构化特征往往无法按固定格式表示,最常见的非结构化数据就是文章。例如有N个待推荐的文章集合D={d1,d2,d3,…dn},所有文章出现的词的集合为T={t1,t2,t3,…tm},最终每篇文章可以用一个向量来表示,比如第j篇文章可以表示为dj={w1j,w2j,..wnj},其中w1j表示第一个词t1j在第j篇文章中的权重,权值越大表示越重要。而计算该权值有两种方式:

    a.基础统计法:若t1在第j篇文章出现过,则w1j=1,否则等于0,也可以将出现的次数作为w1j的值;

    b.词频统计法:这里引入词频-逆文档频率(TF-IDF)的概念,计算公式为:

    TF-IDF(tk,dj)=TF(tk,dj)*log(n/nk),其中TF(tk,dj)是第k个词在第j篇文章出现的次数,nk为出现了第k个词的文章的数量,n指有n篇文章。

    最终第k个词在文章j中的权重由下面的公式获得:

    从而实现得分的python的代码如下:

    def CosSimilarComute(U_k, W_t):
    	if(len(U_k) != len(W_t) ):
    		assert("user vector size not equals item vector")
    	if(len(U_k)==0):
    		assert("user vector size equal to 0")
    	i = 0
    	Score1 = 0
    	Score2 = 0
    	Score3 = 0
    	while (i < len(U_k)):
    		Score1 = Score1 + U_k[i]*W_t[i]
    		Score2 = Score2 + U_k[i]*U_k[i]
    		Score3 = Score3 + W_t[i]*W_t[i]
    		i = i + 1
    	if(Score3==0 or Score2==0):
    		assert("user or item vector equal to 0")
    	return Score1*1.0/(math.sqrt(Score2)*math.sqrt(Score3))

    而用户对文章的内容偏好,就是采用取平均值的方式,比如用户A喜欢1、3、7篇文章,则用户A的偏好向量为:UA=(dk1+dk3+dk7)/3=(u1k,u2k,u3k…unk)。那么用户k在文章t上的得分可以用余弦公式计算:

    代码:

    def cosSim(U_k, W_t):
    	num = float(U_k.T*W_t)
    	denom = linalg.norm(U_k)*linalg.norm(W_t)
    	return 0.5+0.5*(num/denom)

    下篇《推荐算法(二)——  基于协同的推荐算法》,敬请期待。

     

     

     

    展开全文
  • 基于内容的推荐算法

    万次阅读 多人点赞 2019-06-26 09:00:00
    点击上方“大数据与人工智能”,“星标或置顶公众号”第一时间获取好内容作者丨gongyouliu这是作者的第12篇文章,约1.3万字,阅读需70分钟左右作者在上篇文章《推荐...

    640?wx_fmt=png

     

    作者丨gongyouliu

    公众号 | 数据与智能

    这是作者的第12篇文章,1.3万字,阅读需70分钟左右

     

    作者在上篇文章推荐系统产品与算法概述中对推荐算法做了比较全面的概述,本篇开始我们来详细讲解各类推荐算法。这篇文章我们主要关注的是基于内容的推荐算法,它也是非常通用的一类推荐算法,在工业界有大量的应用案例。

     

    本文会从什么是基于内容的推荐算法、算法基本原理、应用场景、基于内容的推荐算法的优缺点、算法落地需要关注的点等5个方面来讲解。

     

    希望读者读完可以掌握常用的基于内容的推荐算法的实现原理,并且可以基于本文的思路快速将基于内容的推荐算法落地到真实业务场景中。

     

     

    01

    什么是基于内容的推荐算法

     

    首先我们给基于内容的推荐算法下一个定义,让读者有初步的印象,后面更容易理解我们讲的基于内容的推荐算法。

     

    所谓基于内容的推荐算法(Content-Based Recommendations)是基于标的物相关信息、用户相关信息及用户对标的物的操作行为来构建推荐算法模型,为用户提供推荐服务。这里的标的物相关信息可以是对标的物文字描述的metadata信息、标签、用户评论、人工标注的信息等。用户相关信息是指人口统计学信息(如年龄、性别、偏好、地域、收入等等)。用户对标的物的操作行为可以是评论、收藏、点赞、观看、浏览、点击、加购物车、购买等。基于内容的推荐算法一般只依赖于用户自身的行为为用户提供推荐,不涉及到其他用户的行为。

     

    广义的标的物相关信息不限于文本信息,图片、语音、视频等都可以作为内容推荐的信息来源,只不过这类信息处理成本较大,不光是算法难度大、处理的时间及存储成本也相对更高。

     

    基于内容的推荐算法算是最早应用于工程实践的推荐算法,有大量的应用案例,如今日头条的推荐有很大比例是基于内容的推荐算法。

     

     

    02

    基于内容的推荐算法实现原理

     

    基于内容的推荐算法的基本原理是根据用户的历史行为,获得用户的兴趣偏好,为用户推荐跟他的兴趣偏好相似的标的物,读者可以直观上从下图理解基于内容的推荐算法。

     

    640?wx_fmt=png

    图1:基于内容的推荐算法示意图

     

    从上图也可以看出,要做基于内容的个性化推荐,一般需要三个步骤,它们分别是:基于用户信息及用户操作行为构建用户特征表示、基于标的物信息构建标的物特征表示、基于用户及标的物特征表示为用户推荐标的物,具体参考图2:

     

    640?wx_fmt=png

    图2:基于内容的个性化推荐的三个核心步骤

     

    本节我们先简单介绍一下怎么基于上图的步骤1、步骤2为用户做推荐(即步骤3中给用户做推荐的核心思想),然后分别对这三个步骤加以说明,介绍每个步骤都有哪些方法和策略可供选择。

     

    1.  基于用户和标的物特征为用户推荐的核心思想

     

    有了用户特征和标的物特征,我们怎么给用户做推荐呢?我认为主要的推荐思路有如下三个:

     

    (1)基于用户历史行为记录做推荐

     

    我们需要事先计算标的物之间的相似性,然后将用户历史记录中的标的物的相似标的物推荐给用户。

     

    不管标的物包含哪类信息,一般的思路是将标的物特征转化为向量化表示,有了向量化表示,我们就可以通过cosine余弦相似度计算两个标的物之间的相似度了。

     

    (2)用户和标的物特征都用显式的标签表示,利用该表示做推荐

     

    标的物用标签来表示,那么反过来,每个标签就可以关联一组标的物,那么根据用户的标签表示,用户的兴趣标签就可以关联到一组标的物,这组通过标签关联到的标的物,就可以作为给用户的推荐候选集。这类方法就是所谓的倒排索引法,是搜索业务通用的解决方案。

     

    (3)用户和标的物嵌入到同一个向量空间,基于向量相似做推荐

     

    当用户和标的物嵌入到同一个向量空间中后,我们就可以计算用户和标的物之间的相似度,然后按照标的物跟用户的相似度,为用户推荐相似度高的标的物。还可以基于用户向量表示计算用户相似度,将相似用户喜欢的标的物推荐给该用户,这时标的物嵌入是不必要的。

     

    讲清楚了基于内容的推荐的核心思想,那么下面我们分别讲解怎么表示用户特征、怎么表示标的物特征以及怎么为用户做推荐。

     

    2.  构建用户特征表示

     

    用户的特征表示可以基于用户对标的物的操作行为(如点击、购买、收藏、播放等)构建用户对标的物的偏好画像,也可以基于用户自身的人口统计学特征来表达。有了用户特征表示,我们就可以基于用户特征为用户推荐与他特征匹配的标的物。构建用户特征的方法主要有如下5种:

     

    (1)用户行为记录作为显示特征

     

    记录用户过去一段时间对标的物的偏好。拿视频行业来说,如果用户过去一段时间看了A、B、C三个视频,同时可以根据每个视频用户观看时长占视频总时长的比例给用户的行为打分,这时用户的兴趣偏好就可以记录为640?wx_fmt=png,其中S1、S2、S3分别是用户对视频A、B、C的评分。

     

    该方案直接将用户历史操作过的标的物作为用户的特征表示,在推荐时可以将与用户操作过的标的物相似的标的物推荐给用户。

     

    (2)显式的标签特征

     

    如果标的物是有标签来描述的,那么这些标签可以用来表征标的物。用户的兴趣画像也可以基于用户对标的物的行为来打上对应的标签。拿视频推荐来举例,如果用户过去看了科幻和恐怖两类电影,那么恐怖、科幻就是用户的偏好标签了。

     

    每个标的物的标签可以是包含权重的,而用户对标的物的操作行为也是有权重的,从而用户的兴趣标签是有权重的。

     

    在具体推荐时,可以将用户的兴趣标签关联到的标的物(具备该标签的标的物)推荐给用户。

     

    (3)向量式的兴趣特征

     

    可以基于标的物的信息将标的物嵌入到向量空间中,利用向量来表示标的物,我们会在后面讲解嵌入的算法实现方案。有了标的物的向量化表示,用户的兴趣向量就可以用他操作过的标的物的向量的平均向量来表示了。

     

    这里表示用户兴趣向量有很多种策略,可以基于用户对操作过的标的物的评分以及时间加权来获取用户的加权偏好向量,而不是直接取平均。另外,我们也可以根据用户操作过的标的物之间的相似度,为用户构建多个兴趣向量(比如对标的物聚类,用户在某一类上操作过的标的物的向量均值作为用户在这个类别上的兴趣向量),从而更好地表达用户多方位的兴趣偏好。

     

    有了用户的兴趣向量及标的物的兴趣向量,可以基于向量相似性计算用户对标的物的偏好度,再基于偏好度大小来为用户推荐标的物。

     

    (4)通过交互方式获取用户兴趣标签

     

    很多APP在用户第一次注册时让用户选择自己的兴趣标签,一旦用户勾选了自己的兴趣标签,那么这些兴趣标签就是系统为用户提供推荐的原材料。具体推荐策略与上面的(3)一样。

     

    (5)用户的人口统计学特征

     

    用户在登陆、注册时提供的关于自身相关的信息、通过运营活动用户填写的信息、通过用户行为利用算法推断得出的结论,如年龄、性别、地域、收入、爱好、居住地、工作地点等是非常重要的信息。基于这些关于用户维度的信息,我们可以将用户特征用向量化表示出来,向量的维度就是可获取的用户特征数。

     

    有了用户特征向量就可以计算用户相似度,将相似用户喜欢的标的物推荐给该用户。

     

    3.  构建标的物特征表示

     

    标的物的特征,一般可以利用显式的标签来表示,也可以利用隐式的向量(当然one-hot编码也是向量表示,但是不是隐式的)来刻画,向量的每个维度就是一个隐式的特征项。前面提到某些推荐算法需要计算标的物之间的相似度,下面我们在讲标的物的各种特征表示时,也简单介绍一下标的物之间的相似度计算方法。顺便说一下,标的物关联标的物的推荐范式也需要知道标的物之间的相似度。下面我们从4个方面来详细讲解怎么构建标的物的特征表示。

     

    (1)标的物包含标签信息

     

    最简单的方式是将将标签按照某种序排列,每个标签看成一个维度,那么每个标的物就可以表示成一个N维的向量了(N是标签的个数),如果标的物包含某个标签,向量在相应标签的分量上的值为1,否则为0,即所谓的one-hot编码。有可能N非常大(如视频行业,N可能是几万、甚至几十万上百万),这时向量是稀疏向量(一般标的物只有少量的几个或者几十个标签),我们可以采用稀疏向量的表示来优化向量存储和计算,提升效率。有了标的物基于标签的向量化表示,很容易基于cosine余弦计算相似度了。

     

    实际上标签不是这么简单的,有很多业务标签是分级的,比如电商(如淘宝),有多级的标签(见下面图3),标签的层级关系形成一颗树状结构,这时该怎么向量化呢?最简单的方案是只考虑叶子节点的标签(也是最低层级的标签),基于叶子节点标签构建向量表示。更复杂的方法,可以基于层级结构构建标签表示及计算标的物相似度。

     

     

    640?wx_fmt=png

    图3:标签的层级表示关系

     

    标签可以是通过算法获取的,比如通过NLP技术从文本信息中提取关键词作为标签。对于图片/视频,它们的描述信息(标题等)可以提取标签,另外可以通过目标检测的方法从图片/视频中提取相关对象构建标签。

     

    标签可以是用户打的,很多产品在用户与标的物交互时可以为标的物打标签,这些标签就是标的物的一种刻画。标签也可是人工标注的,像Netflix在做推荐时,请了上万个专家对视频从上千个维度来打标签,让标签具备非常高的质量。基于这么精细优质的标签做推荐,效果一定不错。很多行业的标的物来源于第三方提供商,他们在入驻平台时会被要求按照某些规范填写相关标签信息(比如典型的如电商)。

     

    (2)标的物具备结构化的信息

     

    有些行业标的物是具备结构化信息的,如视频行业,一般会有媒资库,媒资库中针对每个节目会有标题、演职员、导演、标签、评分、地域等维度数据,这类数据一般存在关系型数据库中。这类数据,我们可以将一个字段(也是一个特征)作为向量的一个维度,这时向量化表示每个维度的值不一定是数值,但是形式还是向量化的形式,即所谓的向量空间模型(Vector Space Model,简称VSM)。这时我们可以通过如下的方式计算两个标的物之间的相似度。

    假设两个标的物的向量表示分别为:

     

         640?wx_fmt=png

     

        640?wx_fmt=png

     

    这时这两个标的物的相似性可以表示为:

     

        640?wx_fmt=png

     

    其中代表的是向量的两个分量之间的相似度。可以采用Jacard相似度等各种方法计算两个分量之间的相似度。上面公式中还可以针对不同的分量采用不同的权重策略,见下面公式,其中是第t个分量(特征)的权重,具体权重的数值可以根据对业务的理解来人工设置,或者利用机器学习算法来训练学习得到。

     

         640?wx_fmt=png

     

    (3)包含文本信息的标的物的特征表示

     

    像今日头条和手机百度APP这类新闻资讯或者搜索类APP,标的物就是一篇篇的文章(其中会包含图片或者视频),文本信息是最重要的信息形式,构建标的物之间的相似性有很多种方法。下面对常用的方法做一些讲解说明。

     

    a. 利用TF-IDF将文本信息转化为特征向量

     

    TF-IDF通过将所有文档(即标的物)分词,获得所有不同词的集合(假设有M个词),那么就可以为每个文档构建一个M维(每个词就是一个维度)的向量,而该向量中某个词所在维度的值可以通过统计每个词在文档中的重要性来衡量,这个重要性的度量就是TF-IDF。下面我们来详细说明TF-IDF是怎么计算的。

     

    TF即某个词在某篇文档中出现的频次,用于衡量这个词在文档中的重要性,出现次数越多的词重要性越大,当然我们会提前将“的”、“地”、“啊”等停用词去掉,这些词对构建向量是没有任何实际价值的,甚至是有害的。TF具体计算公式如下,tk 是第k个词,dj 是第j个文档,下式中分子是 tk 在中出现的次数,分母是 dj 中词的总个数。 

     

           640?wx_fmt=png

     

    IDF代表的是某个词在所有文档中的“区分度”,如果某个词只在少量几个文档中出现,那么它包含的价值就是巨大的(所谓物以稀为贵),如果某个词在很多文档中出现,那么它就不能很好地衡量(区分出)这个文档。下面是IDF的计算公式,其中N是所有文档的个数,是包含词的文档个数,这个公式刚好跟前面的描述是一致的:稀有的词区分度大。

     

           640?wx_fmt=png

    有了上面对TF和IDF的定义,实际的TF-IDF就是上面两个量的乘积: 

           640?wx_fmt=png

     

    有了基于TF-IDF计算的标的物的向量表示,我们就很容易计算两个标的物之间的相似度了(cosine余弦相似度)。

     

    b. 利用LDA算法构建文章(标的物)的主题

     

    LDA算法是一类文档主题生成模型,包含词、主题、文档三层结构,是一个三层的贝叶斯概率模型。对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):

     

    [1] 对每一篇文档,从主题分布中抽取一个主题;

    [2] 从上述被抽到的主题所对应的单词分布中抽取一个单词;

    [3] 重复上述过程直至遍历文档中的每一个单词。

     

    我们通过对所有文档进行LDA训练,就可以构建每篇文档的主题分布,从而构建一个基于主题的向量(每个主题就是向量的一个分量,而值就是该主题的概率值),这样我们就可以利用该向量来计算两篇文档的相似度了。主题模型可以理解为一个降维过程,将文档的词向量表示降维成主题的向量表示(主题的个数是远远小于词的个数的,所以是降维)。想详细了解LDA的读者可以看参考文献1、2。

     

    c. 利用doc2vec算法构建文本相似度

     

    doc2vec或者叫做 paragraph2vec, sentence embeddings,是一种非监督式算法,可以获得 句子、段落、文章的稠密向量表达,它是 word2vec 的拓展,2014年被Google的两位大牛提出,并大量用于文本分类和情感分析中。通过doc2vec学出句子、段落、文章的向量表示,可以通过计算向量之间距离来表达句子、段落、文章之间的相似性。

     

    这里我们简单描述一下doc2vec的核心思想。doc2vec受word2vec启发,由它推广而来,我们先来简单解释一下word2vec的思路。

     

    word2vec通过学习一个唯一的向量表示每个词,每个词向量作为矩阵W中的一列(W是所有词的词向量构成的矩阵),矩阵列可以通过词汇表为每个词做索引,排在索引第一位的放到矩阵W的第一列,如此类推。将学习问题转化为通过上下文词序列中前几个词来预测下一个词。具体的模型框架如下图:

     

    640?wx_fmt=png

    图4:word2vec算法框架

    (图片来源于参考文献5)

     

    简单来说,给定一个待训练的词序列,词向量模型通过极大化平均对数概率

     

     

             640?wx_fmt=png

     

    将预测任务通过softmax变换看成一个多分类问题

     

     

           640?wx_fmt=png

     

    上式中是词i的归一化的对数概率,具体用下式来计算,其中U、b是参数,h是通过词向量的拼接或者平均来构建的 

           640?wx_fmt=png

     

    word2vec算法随机初始化词向量,通过随机梯度下降法来训练神经网络模型,最终得到每个词的向量表示。

     

    doc2vec类似地,每个段落/文档表示为向量,作为矩阵D的一列,每个词也表示为一个向量,作为矩阵W中的一列。将学习问题转化为通过上下文词序列中前几个词和段落/文档来预测下一个词。将段落/文档和词向量通过拼接或者平均来预测句子的下一个词(下图是通过“the”、“cat”、“sat”及段落id来预测下一个词“on”)。在训练的时候我们固定上下文的长度,用滑动窗口的方法产生训练集。段落向量/句向量在上下文中共享。

     

    640?wx_fmt=png

    图5:doc2vec模型结构

    (图片来源于参考文献5)

     

    对算法原理感兴趣的读者可以看看参考文献3、4、5。工程实现上有很多开源框架有word2vec或者doc2vec的实现,比如gensim中就有很好的实现,作者公司就用gensim来做word2vec嵌入用于相似视频的推荐业务中,效果非常不错,读者可以参考https://radimrehurek.com/gensim/models/doc2vec.html。

     

    (4)图片、音频、或者视频信息

     

    如果标的物包含的是图片、音频或者视频信息,处理起来会更加复杂。一种方法是利用它们的文本信息(标题、评论、描述信息、利用图像技术提取的字幕等文本信息等等,对于音频,可以通过语音识别转化为文本)采用上面(3)的技术方案获得向量化表示。对于图像或者视频,也可以利用openCV中的PSNR和SSIM算法来表示视频特征,也可以计算视频之间的相似度。另外一种可行的方法是采用图像、音频处理技术直接从图像、视频、音频中提取特征进行向量化表示,从而容易计算出相似度。总之,图片、图像、音频都可以转化为NLP问题或者图像处理问题(见下面图6),通过图像处理和NLP获得对应的特征表示,从而最终计算出相似度,这里不详细讲解。

     

    640?wx_fmt=png

    图6:视频/图片问题都可以转化为

    NLP或图像处理问题

     

    4.  为用户做个性化推荐

     

    有了上面用户和标的物的特征表示,剩下就是基于此为用户做个性化推荐了,一般有5种方法和策略,下面我们来一一讲解。这里的推荐就是完全个性化范式的推荐,为每个用户生成不一样的推荐结果。

     

    (1)采用跟基于物品的协同过滤类似的方式推荐

     

    该方法采用基于用户行为记录的显式特征表示用户特征,通过将用户操作过的标的物最相似的标的物推荐给用户,算法原理跟基于物品的协同过滤类似,计算公式甚至是一样的,但是这里计算标的物相似度是基于标的物的自身信息来计算的,而基于物品的协同过滤是基于用户对标的物的行为矩阵来计算的。

     

    用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中U是所有用户操作过的标的物的列表,是用户u对标的物的喜好度,是标的物与s的相似度。 

     

       640?wx_fmt=png

     

    有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。

     

    除了采用上面的公式外,我们在推荐时也可以稍作变化,采用最近邻方法(K-NearestNeighbor, KNN)。对于用户操作/喜欢过的每个标的物,通过kNN找到最相似的k个标的物。  

     

           640?wx_fmt=png

     

    其中是给用户u的推荐,是标的物最近邻(最相似)的k个标的物。

     

    (2)采用跟基于用户协同过滤类似的方法计算推荐

     

    如果我们获得了用户的人口统计学向量表示或者基于用户历史操作行为获得了用户的向量化表示,那么我们可以采用跟基于用户的协同过滤方法相似的方法来为用户提供个性化推荐,具体思路如下:

     

    我们可以将与该用户最相似的用户喜欢的标的物推荐给该用户,算法原理跟基于用户的协同过滤类似,计算公式甚至是一样的。但是这里计算用户相似度是基于用户的人口统计学特征向量表示来计算的(计算用户向量cosine余弦相似度)或者是基于用户历史行为嵌入获得的特征向量来计算的,而基于用户的协同过滤是基于用户对标的物的行为矩阵来计算用户之间的相似度。

     

    用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中U是与该用户最相似的用户集合,是用户对标的物s的喜好度,是用户与用户u的相似度。

      

           640?wx_fmt=png

     

    有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。

     

    与前面一样我们也可以采用最近邻方法(K-NearestNeighbor, KNN)。通过kNN找到最相似的k个用户,将这些用户操作/喜欢过的每个标的物推荐给用户。

     

      

           640?wx_fmt=png

     

    其中是给用户u的推荐,是用户相似的k个用户。是用户操作/喜欢过的标的物的集合。

     

     

    (3)基于标的物聚类的推荐

     

    有了标的物的向量表示,我们可以用kmeans等聚类算法将标的物聚类,有了标的物的聚类,推荐就好办了。从用户历史行为中的标的物所在的类别挑选用户没有操作行为的标的物推荐给用户,这种推荐方式是非常直观自然的。电视猫的个性化推荐就采用了类似的思路。具体计算公式如下,其中是给用户u的推荐,H是用户的历史操作行为集合,Cluster(s)是标的物s所在的聚类。 

     

       640?wx_fmt=png

     

    (4)基于向量相似的推荐

     

    不管是前面提到的用户的显示的兴趣特征(利用标签来衡量用户兴趣)或者是向量式的兴趣特征(将用户的兴趣投影到向量空间),我们都可以获得用户兴趣的向量表示。

     

    如果我们获得了用户的向量表示和标的物的向量表示,那么我们就可以通过向量的cosine余弦相似度计算用户与标的物之间的相似度。一样地,有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。

     

    基于向量的相似的推荐,需要计算用户向量与每个标的物向量的相似性。如果标的物数量较多,整个计算过程还是相当耗时的。同样地,计算标的物最相似的K个标的物,也会涉及到与每个其他的标的物计算相似度,也是非常耗时的。整个计算过程的时间复杂度是,其中N是标的物的总个数。

     

    上述复杂的计算过程可以利用Spark等分布式计算平台来加速计算。对于T+1级(每天更新一次推荐结果)的推荐服务,利用Spark事先计算好,将推荐结果存储起来供前端业务调用是可以的。

     

    另外一种可行的策略是利用高效的向量检索库,在极短时间(一般几毫秒或者几十毫秒)内为用户索引出topN最相似的标的物。目前FaceBook开源的FAISS库(https://github.com/facebookresearch/faiss)就是一个高效的向量搜索与聚类库,可以在毫秒级响应查询及聚类需求,因此可以用于个性化的实时推荐。目前国内有很多公司将该库用到了推荐业务上。

     

    FAISS库适合稠密向量的检索和聚类,所以对于利用LDA、Doc2vector算法构建向量表示的方案是实用的,因为这些方法构建的是稠密向量。而对于TF-IDF及基于标签构建的向量化表示,就不适用了,这两类方法构建的都是稀疏的高维向量。

     

    (5)基于标签的反向倒排索引做推荐

     

    该方法在《推荐系统产品与算法概述》这篇文章中也简单做了介绍,这里再简单说一下,并且给出具体的计算公式。基于标的物的标签和用户的历史兴趣,我们可以构建出用户基于标签兴趣的画像及标签与标的物的倒排索引查询表(熟悉搜索的同学应该不难理解)。基于该反向索引表及用户的兴趣画像,我们就可以为用户做个性化推荐了。该类算法其实就是基于标签的召回算法。

     

    具体推荐过程是这样的(见下面图7):从用户画像中获取用户的兴趣标签,基于用户的兴趣标签从倒排索引表中获取该标签对应的标的物,这样就可以从用户关联到标的物了。其中用户的每个兴趣标签及标签关联到的标的物都是有权重的。

     

    640?wx_fmt=png

    图7:基于倒排索引的电影推荐

     

    假设用户的兴趣标签及对应的标签权重如下,其中是标签,是用户对标签的偏好权重。

     

     

           640?wx_fmt=png

     

    假设标签关联的标的物分别为

     

     640?wx_fmt=png 640?wx_fmt=png

    ......

     

    640?wx_fmt=png

     

    其中、分别是标的物及对应的权重,那么  

           640?wx_fmt=png

        

    上式中U是用户对标的物的偏好集合,我们这里将标的物看成向量空间的基,所以有上面的公式。不同的标签可以关联到相同的标的物(因为不同的标的物可以有相同的标签),上式中最后一个等号右边需要合并同类项,将相同基前面的系数相加。合并同类项后,标的物(基)前面的数值就是用户对该标的物的偏好程度了,我们对这些偏好程度降序排列,就可以为用户做topN推荐了。

     

    到此我们介绍完了基于内容的推荐算法的核心原理,那么这些算法是怎么应用到真实的产品中的呢?有哪些可行的推荐产品形态?这就是下节的主要内容。

     

     

    03

    基于内容的推荐算法应用场景

     

    基于内容的推荐是最古老的一类推荐算法,在整个推荐系统发展史上具有举足轻重的地位。虽然它的效果可能没有协同过滤及新一代推荐算法好,但是它们还是非常有应用价值的,甚至是必不可少的。基于内容的推荐算法主要用在如下几类场景。

     

    1.  完全个性化推荐

     

    就是基于内容特征来为每个用户生成不同的推荐结果,我们常说的推荐系统就是指这类推荐形态。上面一节第四部分已经完整地讲解了怎么为用户做个性化推荐,这里不再赘述。

     

    2.  标的物关联标的物推荐

     

    标的物关联标的物的推荐也是工业界最常用的推荐形态,大量用于真实产品中。

     

    上一节第三部分讲了很多怎么构建标的物之间相似度的方法,其实这些方法可以直接用来做标的物关联标的物的推荐,只要我们将与某个标的物最相似的topN的标的物作为关联推荐即可。

     

    3.  配合其他推荐算法

     

    由于基于内容的推荐算法在精准度上不如协同过滤等算法,但是可以更好的适应冷启动,所以在实际业务中基于内容的推荐算法会配合其他算法一起服务于用户,最常用的方法是采用级联的方式,先给用户协同过滤的推荐结果,如果该用户行为少没有协同过滤推荐结果,就为该用户推荐基于内容的推荐算法产生的推荐结果。

     

    4.  主题推荐

     

    如果我们有标的物的标签信息,并且基于标签系统构建了一套推荐算法,那么我们就可以将用户喜欢的标签采用主题的方式推荐给用户,每个主题就是用户的一个兴趣标签。通过一些列主题的罗列展示,让用户从中筛选自己感兴趣的内容(见下面图8)。Netflix的首页大量采用基于主题的推荐模式。主题推荐的好处是可以将用户所有的兴趣点按照兴趣偏好大小先后展示出来,可解释性强,并且让用户有更多维度的自由选择空间。

     

    当然,在真实产品中可以采用比下面图8这种简单标签直接展示更好的方式。具体来说,我们可以为每个标签通过人工编辑生成一句更有表达空间的话(如武侠标签,可以采用“江湖风云再起,各大门派齐聚论剑”这样更有深度的表述),具体前端展示时映射到人工填充的话而不是直接展示原来的标签。 

           640?wx_fmt=png

    图8:电视猫主题推荐(红色圈圈中就是基于标签的用户兴趣)

     

    5.  给用户推荐标签

     

    另外一种可行的推荐策略是不直接给用户推荐标的物,而是给用户推荐标签,用户通过关注推荐的标签,自动获取具备该标签的标的物。除了可以通过推荐的标签关联到标的物获得直接推荐标的物类似的效果外,间接地通过用户对推荐的标签的选择、关注进一步获得了用户的兴趣偏好,这是一种可行的推荐产品实现方案。

     

     

    04

    基于内容的推荐算法的优势与缺点

     

    基于内容的推荐算法算是一类比较直观易懂的算法,目前在工业级推荐系统中有大量的使用场景,在本节我们对基于内容的推荐算法的优缺点加以说明,方便读者在实践中选择取舍,构建适合业务场景的内容推荐系统。

     

    1.  优点

     

    基于上面的介绍,基于内容的推荐算法是非常直观的,具体来说,它有如下6个优点。

     

    (1)可以很好的识别用户的口味

     

    该算法完全基于用户的历史兴趣来为用户推荐,推荐的标的物也是跟用户历史兴趣相似的,所以推荐的内容一定是符合用户的口味的。

     

    (2)非常直观易懂,可解释性强

     

    基于内容的推荐算法基于用户的兴趣为用户推荐跟他兴趣相似的标的物,原理简单,容易理解。同时,由于是基于用户历史兴趣推荐跟兴趣相似的标的物,用户也非常容易接受和认可。

     

    (3)可以更加容易的解决冷启动

     

    只要用户有一个操作行为,就可以基于内容为用户做推荐,不依赖其他用户行为。同时对于新入库的标的物,只要它具备metadata信息等标的物相关信息,就可以利用基于内容的推荐算法将它分发出去。因此,对于强依赖于UGC内容的产品(如抖音、快手等),基于内容的推荐可以更好地对标的物提供方进行流量扶持。

     

    (4)算法实现相对简单

     

    基于内容的推荐可以基于标签维度做推荐,也可以将标的物嵌入向量空间中,利用相似度做推荐,不管哪种方式,算法实现较简单,有现成的开源的算法库供开发者使用,非常容易落地到真实的业务场景中。

     

    (5)对于小众领域也能有比较好的推荐效果

     

    对于冷门小众的标的物,用户行为少,协同过滤等方法很难将这类内容分发出去,而基于内容的算法受到这种情况的影响相对较小。

     

    (6)非常适合标的物快速增长的有时效性要求的产品

     

    对于标的物增长很快的产品,如今日头条等新闻资讯类APP,基本每天都有几十万甚至更多的标的物入库,另外标的物时效性也很强。新标的物一般用户行为少,协同过滤等算法很难将这些大量实时产生的新标的物推荐出去,这时就可以采用基于内容的推荐算法更好地分发这些内容。

     

    2. 缺点

     

    虽然基于内容的推荐实现相对容易,解释性强,但是基于内容的推荐算法存在一些不足,导致它的效果及应用范围受到一定限制。主要的问题有如下4个:

     

    (1)推荐范围狭窄,新颖性不强

     

    由于该类算法只依赖于单个用户的行为为用户做推荐,推荐的结果会聚集在用户过去感兴趣的标的物类别上,如果用户不主动关注其他类型的标的物,很难为用户推荐多样性的结果,也无法挖掘用户深层次的潜在兴趣。特别是对于新用户,只有少量的行为,为用户推荐的标的物较单一。

     

    (2)需要知道相关的内容信息且处理起来较难

     

    内容信息主要是文本、视频、音频,处理起来费力,相对难度较大,依赖领域知识。同时这些信息更容易有更大概率含有噪音,增加了处理难度。另外,对内容理解的全面性、完整性及准确性会影响推荐的效果。

     

    (3)较难将长尾标的物分发出去

     

    基于内容的推荐需要用户对标的物有操作行为,长尾标的物一般操作行为非常少,只有很少用户操作,甚至没有用户操作。由于基于内容的推荐只利用单个用户行为做推荐,所以更难将它分发给更多的用户。

     

    (4)推荐精准度不太高

     

    基于工业界的实践经验,相比协同过滤算法,基于内容的推荐算法精准度要差一些。

     

     

    05

    算法落地需要关注的重要问题

     

    基于内容的推荐算法虽然容易理解,实现起来相对简单,但在落地到真实业务场景中,有很多问题需要思考解决。下面这些问题是在落地基于内容推荐算法时必须思考的,这里将他们列举出来,并提供一些简单的建议,希望可以帮到读者。

     

    1.  内容来源的获取

     

    对于基于内容的推荐来说,有完整的、高质量的内容信息是可以构建精准的推荐算法的基础,那我们有哪些方法可以获取内容来源呢?下面这些策略是主要获取内容(包括标的物内容和用户相关内容)来源的手段。

     

    (1)标的物“自身携带”的信息

     

    标的物在上架时,第三方会准备相关的内容信息,如天猫上的商品在上架时会补充很多必要的信息。对于视频来说,各类metadata信息也是视频入库时需要填充的信息。我们要做的是增加对新标的物入库的监控和审核,及时发现信息不全的情况并做适当处理。

     

    (2)通过爬虫获取标的物相关信息

     

    通过爬虫爬取的信息可以作为标的物信息的补充,特别是补充上面(1)不全的信息。有了更完整的信息就可以获得更好的特征表示。

     

    (3)通过人工标注数据

     

    往往人工标注的数据价值密度高,通过人工精准的标注可以大大提升算法推荐的精准度。但是人工标注成本太大。

     

    (4)通过运营活动或者产品交互让用户填的内容

     

    通过抽奖活动让用户填写家庭组成、兴趣偏好等,在用户开始注册时让用户填写兴趣偏好特征,这些都是获取内容的手段。

     

    (5)通过收集用户行为直接获得或者预测推断出的内容

     

    通过请求用户GPS位置知道用户的活动轨迹,用户购物时填写收货地址,用户绑定的身份证和银行卡等,通过用户操作行为预测出用户的兴趣偏好,这些方法都可以获得部分用户数据。

     

    (6)通过与第三方合作或者产品矩阵之间补充信息

     

    目前中国有大数据交易市场,通过正规的数据交易或者跟其他公司合作,在不侵犯用户隐私的情况下,通过交换数据可以有效填补自己产品上缺失的数据。

     

    如果公司有多个产品,新产品可以借助老产品的巨大用户基数,将新产品的用户与老产品用户关联起来(id-maping或者账号打通),这样老产品上丰富的用户行为信息可以赋能给新产品。

     

    2.  怎么利用负反馈

     

    用户对标的物的操作行为不一定代表正向反馈,有可能是负向的。比如点开一个视频,看了不到几秒就退出来了,明显表明用户不喜欢。有很多产品会在用户交互中直接提供负向反馈能力,这样可以收集到更多负向反馈。下面是今日头条和百度APP推荐的文章,右下角有一个小叉叉(见下面图9中红色圈圈),点击后展示上面的白色交互区域,读者可以勾选几类不同的负向反馈机制。

     

    640?wx_fmt=png

     图9:负向反馈的交互形式:利用用户负向反馈来优化产品体验

     

     

    负向反馈代表用户强烈的不满,因此如果推荐算法可以很好的利用这些负向反馈就能够大大提升推荐系统的精准度和满意度。基于内容的推荐算法整合负向反馈的方式有如下几种:

     

    (1) 将负向反馈整合到算法模型中

    在构建算法模型中整合负向反馈,跟正向反馈一起学习,从而更自然地整合负向反馈信息。

     

    (2) 采用事后过滤的方式

    先给用户生成推荐列表,再从该推荐列表中过滤掉与负向反馈关联的或者相似的标的物。

     

    (3) 采用事前处理的方式

    从待推荐的候选集中先将与负向反馈相关联或者相似的标的物剔除掉,然后再进行相关算法的推荐。

     

    3.  兴趣随时间变化

     

    用户的兴趣不是一成不变的,一般用户的兴趣是随着时间变化的,那怎么在算法中整合用户的兴趣变化呢?可行的策略是对用户的兴趣根据时间衰减,最近的行为给予最大的权重。还可以分别给用户建立短期兴趣特征和长期兴趣特征,在推荐时既考虑短期兴趣又考虑长期兴趣,最终推荐列表中整合两部分的推荐结果。

     

    对于新闻资讯等这类时效性强的产品,能够整合用户的实时兴趣变化可以大大提升用户体验,这也是现在信息流类推荐产品大行其道的原因。

     

    4.  数据清洗

     

    基于内容的推荐算法依赖于标的物相关的描述信息,这些信息更多的是以文本的形式存在,这就涉及到自然语言处理了,文本中可能会存在很多歧义、符号、脏数据,我们需要事先对数据进行很好的处理,才能让后续的推荐算法产生好的效果。

     

    5.  加速计算与节省资源

     

    在实际推荐算法落地时,我们会事先为每个标的物计算N(=50)个最相似的标的物,事先将计算好的标的物存起来,减少时间和空间成本,方便后续更好地做推荐。同时也可以利用各种分布式计算平台和快速查询平台(如Spark、FAISS库等)加速计算过程。另外,算法开发过程中尽量做到模块化,对业务做抽象封装,这可以大大提升开发效率,并且可能会节省很多资源。

     

    6.  怎么解决基于内容的推荐越推越窄的问题

     

    前面提到基于内容的推荐存在越推越窄的缺点,那怎么避免或者减弱这种影响呢?当然用协同过滤等其他算法是一个有效的方法。另外,我们可以给用户做兴趣探索,为用户推荐兴趣之外的特征关联的标的物,通过用户的反馈来拓展用户兴趣空间,这类方法就是强化学习中的EE方法。如果我们构造了标的物的知识图谱系统,我们就可以通过图谱拓展标的物更远的联系,通过长线的相关性来做推荐,同样可以有效解决越推越窄的问题。

     

    7.  工程落地技术选型

     

    本篇文章主要讲的是基于内容的推荐系统的算法实现原理,具体工程实践时,需要考虑到数据处理、模型训练、分布式计算等技术,当前很多开源方案可以使用,常用的如Spark mllib,scikit-learn,Tensorflow,pytorch,gensim等,这些工具都封装了很多数据处理、特征提取、机器学习算法,我们可以基于第二节的算法思路来落地实现。

     

    8.  业务的安全性

     

    除了技术外,在推荐产品落地中还需要考虑推荐的标的物的安全性,避免推荐反动、色情、标题党、低俗内容,这些就需要基于NLP或者CV技术对文本或者视频进行分析过滤。如果是UGC平台型的产品,还需要考虑怎么激励优质内容创作者,让好的内容得到更多的分发机会,同时对产生劣质内容的创作者采取一定的惩罚措施,比如限制发文频率、禁止一段时间的发文权限等。

     

      写在最后  

     

    本文作者基于自己的实践经验总结了常用的基于内容的推荐算法及落地场景,并对基于内容的推荐算法的优缺点及实践过程中需要关注的问题进行了分析讨论。基于内容的推荐算法一般用于推荐召回阶段,通过内容特征来为用户选择可能喜欢的内容。

     

    作者会在下两篇讲解内容推荐算法的具体案例,让大家更好地理解掌握内容推荐算法。欢迎大家持续关注!

     

     

    -END-

     

     

    参考文献

    1. Latent Dirichlet Allocation

    2. LightLDA- Big Topic Models onModest Computer Clusters

    3. Efficient Estimation of WordRepresentations in Vector Space

    4. Distributed Representations ofWords and Phrases and their Compositionality

    5. Distributed Representations ofSentences and Documents

     

     

    相关内容推荐

    1. 推荐系统产品与算法概述

    2. 构建可解释的推荐系统
    3. 从零开始入门推荐算法工程师

     

     

    展开全文
  • 文章目录1 算法的研究内容2 算法设计的两个例子2.1 调度问题2.2 算法设计的步骤2.3 投资问题3 总结 在学习算法涉及与分析的内容之前,先了解一下算法所涉及的几个大块的内容,方便以后学习。 1 算法的研究内容 算法...


    在学习算法涉及与分析的内容之前,先了解一下算法所涉及的几个大块的内容,方便以后学习。

    1 算法的研究内容

    • 算法的研究内容主要包括三点:
    1. 计算复杂性理论
    2. 问题复杂度概念
    3. 算法设计与分析

    其中我们主要学习的内容是算法的设计与分析。

    在学习算法的过程中,还需要学习相关的概念:

    1. 算法的伪码表示
    2. 算法及其时间复杂度的定义
    3. 几类重要函数的性质
    4. 有关函数渐进的届的定理
    5. 时间复杂度函数的表示:函数渐进的界

    以上五点会在后面的文章中逐一学习。

    2 算法设计的两个例子

    2.1 调度问题

    • 问题:有n项任务,每项任务加工时间已知,从 0时刻开始陆续安排到一台机器上加工,每个任务的完成时间是从 0 时刻到任务加工截止的时间。
    • 求:总完成时间 最短的安排方案(所有任务完成时间之和)。

    实例:
    任务集 S = {1, 2, 3, 4, 5},
    加工时间: t1=3, t2=8, t3=5, t4=10, t5=15

    • 贪心法的解:

    算法:按加工时间(3,8,5,10,15) 从小到大安排

    解:加工产品的顺序:1, 3, 2, 4, 5 。

    https://raw.githubusercontent.com/Lyy0217/CSLN-Pic/master/01-%E7%AE%97%E6%B3%95%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%88%86%E6%9E%90pic/1560500922461.png

    总的完成时间为:

    t = 3+(3+5)+(3+5+8)+(3+5+8+10)+(3+5+8+10+15)
    = 3×5 + 5×4 + 8×3 + 10×2 + 15
    = 94

    (注意规律)

    针对上面的加工调度问题,在数学中有一整套建模的流程来求解。

    问题建模:

    1. 输入:任务集:S={1,2,3,…,n},第j项任务加工时间:tj ∈ \in Z+ , j=1,2…,n
    2. 输出:调度I,S的排列为:i1,i2,…,in
    3. 目标函数:I的完成时间。t(I)= ∑ k = 1 N ( n − k + 1 ) t i k \sum_{k=1}^N (n-k+1)t_{i_{k}} k=1N(nk+1)tik
    4. 解 I* :使得t(I*)达到最小,即:t(I *)=min{t(I) | I为S的排列}

    对于上述调度问题的贪心算法,对于所有输入实例都得到最优解,可以给出如下的证明过程:

    证明:假设调度f的第i,j项任务相邻且有逆序,即ti > tj ,交换任务i和j得到调度g,

    在算法的设计过程中,各种各样的算法设计都需要有严格的证明验证所有实例都可以通过该算法达到最终的解。上面解决调度问题的时候,是凭直觉来使用贪心算法,但是直觉往往不正确。如下面的例子。

    反例:

    有4 件物品要装入背包, 物品重量和价值如下:

    标号1234
    重量 wi3452
    价值 vi7992

    背包重量限制是 6,问如何选择物品,使得不超重的情况下装入背包的物品价值达到最大?

    直觉的解法是贪心算法:单位重量价值大的优先,总重量不超过6.

    按照 V   i   W   i   \frac{V~i~}{W~i~} W i V i  从大到小排序,1,2,3,4

    7 3 \frac{7}{3} 37 > 9 4 \frac{9}{4} 49> 9 5 \frac{9}{5} 59 > 2 2 \frac{2}{2} 22

    • 贪心法的解: { 1, 4 },重量 5,价值为 9
    • 更好的解: { 2, 4 },重量 6,价值 11

    2.2 算法设计的步骤

    所以在进行一个算法的设计时,需要以下几个步骤:

    1. 问题建模
    2. 选择什么算法,如何描述这个算法?
    3. 这个算法是否对所有实例都得到最优解?如何证明?
    4. 如果不是,能否找到反例

    每一个算法的设计,都需要遵循上述四个规则。

    2.3 投资问题

    • 问题:m元钱,投资n个项目,效益函数fi (x),表示第i个项目投资x元钱的效益,i=1,2,…,n。
    • 求:如何分配,每个项目的钱数,使得总效益最大。

    实例:5 万元,投资给 4 个项目,效益函数:

    xf1(x)f2(x)f3(x)f4(x)
    00000
    1110220
    21251021
    313103022
    414153223
    515204024

    首先对这个问题进行数学建模:

    • 输入:n,m,fi (x),i=1,2,…,n,x = 1,2, …, m 。
    • 解:n维向量<x1, x2, … , xn >,xi 是第i个项目的钱数,使得下述条件满足:

    目标函数:max ∑ i = 1 n f i ( x ) \sum_{i=1}^n f_i (x) i=1nfi(x)

    约束条件: ∑ i = 1 n x i = m \sum_{i=1}^n x_i =m i=1nxi=m ,xi ∈ \in n;

    上述就是一个数学的建模过程,最终的算法设计就是针对上述数学模型进行求解域优化。

    在我们学习算法设计之前,先给出这道题的一个蛮力算法:

    1. 对所有满足下述条件的向量<x1,x2,…,xn>

      x1+ x2 + … + xn = m ; xi 为非负整数, i = 1, 2 , …, n 。

    2. 计算相应的效益:

      f1(x1) + f2(x2) + … + fn(xn)

    从中确认效益最大的向量。

    实例计算:

    https://raw.githubusercontent.com/Lyy0217/CSLN-Pic/master/01-%E7%AE%97%E6%B3%95%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%88%86%E6%9E%90pic/1561486060934.png

    解: s=<1,0,3,1>,
    最大效益: 11+30+20 = 61

    以上就是使用蛮力算法得出的额结果,结果肯定是对的,但是效率肯定不高。

    • 蛮力算法的效率:

    方程 x1 + x2 + … + xn = m 的非负整数解
    < x1, x2, …, xn > 的个数估计:

    可行解表示成 0-1 序列: m 个1,n-1个 0

    https://raw.githubusercontent.com/Lyy0217/CSLN-Pic/master/01-%E7%AE%97%E6%B3%95%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%88%86%E6%9E%90pic/04.png

    例如:n=4,m=7。可行解的一个为:<1, 2, 3, 1> ⇔ 序列 1 0 1 1 0 1 1 1 0 1

    该解得序列的个数是输入规模的指数函数:

    C(m+n-1,m)

    = ( m + n − 1 ) ! m ! ( n − 1 ) ! \frac{(m+n-1)!}{m! (n-1)!} m!(n1)!(m+n1)!

    = Ω ((1+ε )m+n-1)

    指数级是一个很大的数量级!!!有没有更好的算法? 在后面的学习中,会学习到更好的算法。

    3 总结

    问题求解的关键:

    1. 建模:对输入参数和解给出形式化或者半形式化的描述
    2. 设计算法:采用什么算法设计技术?以及它的正确性:是否对所有实例都得到正确的解?
    3. 分析算法:效率
    展开全文
  • 协同算法总结

    千次阅读 2018-08-27 14:02:06
    推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究。推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个... 1)基于内容的推荐:这...
  • 算法导论中文版

    2016-10-26 10:13:58
    附录B 集合等离散数学内容  B.1 集合  B.2 关系  B.3 函数  B.4 图  B.5 树  B.5.1 自由树  B.5.2 有根树和有序树  B.5.3 二叉树和位置树  思考题  附录注记 附录C 计数与概率  C.1 计数  C....
  • 基于内容推荐算法实现原理

    千次阅读 2020-04-30 22:00:36
    本文会从什么是基于内容的推荐算法算法基本原理、应用场景、基于内容的推荐算法的优缺点、算法落地需要关注的点等5个方面来讲解。 1、什么是基于内容的推荐算法 所谓基于内容的推荐算法(Content-Based ...
  • 文本相似度算法总结

    万次阅读 多人点赞 2019-06-04 20:12:06
    文本匹配算法主要用于搜索引擎,问答系统等,是为了找到与目标文本最相关的文本。例如信息检索可以归结成查询项和文档的匹配,问答系统可以归结为问题和候选答案的匹配,对话系统可以归结为对话和回复的匹配。 一...
  • 文本比较算法--Needleman/Wunsch算法

    万次阅读 2016-09-03 16:05:31
    计算LCS(A,B)的算法有很多,下面介绍的Needleman/Wunsch算法是其中的一种。和LD算法类似,Needleman/Wunsch算法用的都是动态规划的思想。 三、举例说明: 举例说明:A=GGATCGA,B=GAATTCAGTTA,计算...
  • 基于协同过滤算法内容推荐算法实现电影推荐系统 本电影推荐系统算法是基于人人相似的协同过滤算法和基于内容的推荐算法相结合的混合推荐算法 混合推荐算法大致流程: 首先对数据集使用人人相似的协同过滤算法, 计算...
  • 数据结构KMP算法配图详解(超详细)

    万次阅读 多人点赞 2020-02-18 22:02:42
    KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂...
  • “无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看... 基于内容的信息推荐方法的理论依据主要来自于信息检索和信息过滤,所谓的基于内容的推荐方法...
  • 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图...
  • 协同过滤推荐算法java实现

    千次下载 热门讨论 2014-05-14 20:55:30
    本资源是推荐系统中最基本且最精但的协同过滤推荐算法实现,包括数据集,以及算法的评价指标MAE的计算,数据集采用MovieLens中两个数据集进行测试,需要别的数据集可以根据自己需要添加,只需修改Base.java文件中的...
  • 今日头条、抖音推荐算法原理全文详解作者Ste Davies(转载自“腾讯媒体研究院”)在如今的世界中,算法已经成为了我们日常生活的核心。当你进行网络搜索,滚动浏览社交媒体上的信息,或者...
  • 基于内容的推荐算法是不是还要计算相似度什么的啊?求大神解答,最好有源代码。
  • 算法分析与设计|主要内容整理

    千次阅读 多人点赞 2020-06-16 19:51:46
    今天算法课程的考试结束了,对这一周以来的复习内容进行下整理~ 相对本科的算法学习,老师让我们从今日份考试中感受到算法分析与设计的重要,而不只是再停留在会做做题的阶段。 上一周的复习很充实,看算法与看...
  • 算法设计技巧与分析

    热门讨论 2016-04-26 21:49:18
    , 《算法设计技巧与分析》结构简明,内容丰富,适合于作为计算机学科及相关学科算法课程的教材和参考书,尤其适宜于学过数据结构和离散数学课程之后的算法课程教材。同时也可作为从事算法研究的一本好的入门书。
  • 路径规划算法

    万次阅读 多人点赞 2021-11-14 10:20:44
    文章目录前言一、传统路径规划算法1.Dijkstra算法2.A*算法3.D*算法4.人工势场法二、基于采样路径规划算法1.PRM算法2.RRT算法三、智能仿生算法1.神经网络算法2.蚁群算法3.遗传算法 前言 随着机器人技术、智能控制...
  • 基于内容推荐算法详解(比较全面的文章)

    万次阅读 多人点赞 2018-03-22 17:43:01
    但是,工业界真正使用的系统一般都不会只有CF推荐算法,Content-based Recommendations (CB) 基本也会是其中的一部分。 CB应该算是最早被使用的推荐方法吧,它根据用户过去喜欢的产品(本文统称为 ite...
  • 人工智能算法:遗传算法

    万次阅读 多人点赞 2021-01-21 19:33:15
    遗传算法是一种特殊的演化算法,但是在描述遗传算法的文献中,其定义各不相同。本书将遗传算法定义为一种可以用交叉和突变算子优化固定长度向量的演化算法。计分函数可以区分优劣方案,以优化该固定长度的向量。这个...
  • 优化算法综述

    千次阅读 2021-06-30 21:21:03
    依据 分类 具体算法 分类名 全局优化 遗传算法(GA)、帝国竞争算法(ICA)、 粒子群优化(PSO) 局部优化 模拟退火(SA)、贪婪算法(Greedy)、 邻域搜索(NS) 是否精确算法 精确算法 ...
  • 英雄算法联盟 | 31天让你的算法与众不同

    万次阅读 多人点赞 2022-04-29 19:39:44
    英雄算法联盟
  • 目前推荐系统研宄的主要趋势是从单一的、独立的推荐系统算法逐渐向组合多种推荐算法形成混合式的综合推荐算法方向发展,越来越多的结合用户标签数据、社交网络数据、上下文信息、地理位置信息。群体推荐也成为一个...
  • 学习笔记 | 算法导论学习笔记1

    千次阅读 2022-03-13 15:15:12
    算法导论》打卡1,主要内容:插入排序,分治法,归并排序 第一部分 基础知识 第一章 算法在计算中的作用 1.1 算法 算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或者值的集合...
  • PoS算法

    万次阅读 2021-09-13 18:02:32
    提示:以下是本篇文章正文内容,下面案例可供参考 一、PoS——权益证明 PoS 是什么 ⚫ PoS(Proof of Stake)译为权益证明,是一种在公链中的共识算法,可作为 PoW 算 法的一种替换 ⚫ 基于权益证明的数字货币中,...
  • 全面揭秘快手与抖音的内容推荐算法

    万次阅读 多人点赞 2019-04-17 22:02:48
    快抖的视频内容分为推荐(发现)、附近(同城)和关注三个模块,这里主要说明推荐模块的算法机制。 视频与用户画像的匹配程度 热度(赞、评论、转发等) 发布时间 根据用户数据和内容标签计算两者的匹配程度,是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,352,374
精华内容 540,949
关键字:

内容算法

友情链接: musicdoa.rar