推荐算法告诉你如何“投其所好”

Posted 玖富IT饭米粒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐算法告诉你如何“投其所好”相关的知识,希望对你有一定的参考价值。

       最近参与了一些推荐系统模型搭建,对推荐算法做了些调研,在此跟大家分享一下。

       概括地说,推荐系统的目标就是投其所好更具体地说,就是洞察用户的需求和评估用户的偏好,并推荐给用户心仪的产品,从而提升用户的体验,甚至做到比用户更了解用户。

       我们需要做一个针对理财产品的推荐系统。那么,如何将这个应用场景抽象成数学模型呢?数学模型无非就是y=F(x),这里y可以定义为我们要推荐给用户的产品集合,那x可以定义为啥呢?业务积累的历史用户基本信息、交易、浏览行为等数据,我们认为这些都可以作为模型的输入x

       接下来的工作就是如何定义函数关系式F了。F其实就是将x映射成y的一套数学法则,这套法则将告诉我们对于不同特征的用户将推荐不同类型的理财产品。那么我们该如何定义F呢?如果从投其所好的直观理解,很自然的可以想到一点:用户过去买过产品a,我们就可以给TA推荐a或者与a最相似的一些产品。这里问题就来了,如何定义a最相似的一些产品呢?

推荐算法告诉你如何“投其所好”

       一般我们说两个人相像是因为这两个人的相貌有共性,比如这两人的脸蛋都是鹅蛋脸,鼻子都是高鼻梁,嘴形都是樱桃嘴。注意,这里提到的都是脸部特征,而不是身高、体型、胸腹部或臀部特征,这是因为对于人的视觉感受而言,脸部特征是识别不同人的最显著的特征。同样的,我们是不是也可以从用户购买的产品提取一些显著的特征呢?当然是可以的,有人就对电影提取过这些特征:有哪些主要演员,导演是谁,电影是什么主题,电影拍摄于什么年代等。

推荐算法告诉你如何“投其所好”

       特征提取并不是一件容易的事情。先不论这项工作需要凭借一些人的认知与直觉,即便是一个在电影领域的专家也未必能公平的将每一部电影归类为正确的主题,因为很多电影的情节融合了多个主题。还是回到前面提到的两个人是否相像的问题,如果由一个人来判断这两人是否相像未免太武断,为了严谨起见,那么我们可以请多个人来从多个不同的角度评判。比如A判断这两人是否鹅蛋脸,是的话打1分,不是的话打0分。依照同样的打分原则,B判断这两人是否高鼻梁,C判断这两人是否樱桃嘴,D判断这两人是否丹凤眼,E判断这两人是否柳叶眉。这样判断完后并总结每个看官对这两人的判断是否相同,我们得到一下表格。从表格中我们得知,总的判断项目有5项,其中判断相同的有3项,则判断一致的项目占比为3/5=0.6,这个结果我们可以解读为两位美女的相似度为60%

看官

看啥

美女1

美女2

判断是否相同

A

是否鹅蛋脸

1

1

1

B

是否高鼻梁

1

0

0

C

是否樱桃嘴

1

1

1

D

是否丹凤眼

0

1

0

E

是否柳叶眉

1

1

1 

推荐算法告诉你如何“投其所好”

       上面的情况是定义了具体的相貌特征,很多人在欣赏美女是自己也不知道到底是哪里好看,但你让TA在一定的范围内(比如110)给出评分TA是可以评出来的,比如下表所示。这个时候该如何计算两个美女的相似度呢?很简单,如果我们把美女获得的看管AG的评分看作一个向量,那么就可以通过计算向量的之间的余弦值来衡量相似度了。对于用户评分缺失的购买交易场景,可以将评分设置为10,即1代表用户购买过该商品,0代表没有购买过,则相似度仍可依据余弦值来表征。用公式表示就是Wijcos<rui,ruj>,这里ruiruj分别代表物品ij获得的所有用户的评分向量,若数据集中所有用户评分反馈缺失,则向量中的元素只有01,其中0代表用户没有购买过该物品,1则反之。

看官

美女1

美女2

A

8

7

B

9

8

C

10

6

D

7

9

E

8

5

F

6

7

G

8

7

        至此,物品之间的相似度定义工作完成了。那如何根据相似度推荐用户需要的产品呢?很自然的逻辑是根据用户曾经购买过的产品找到其相似度最大并且用户没有买过的产品作推荐。比如下图的示例:用户买过《C++Primer中文版》和《编程之美》两本书,根据书本之间的相似度计算结果可以查找到跟《C++Primer中文版》最相似的三本书为《C++编程思想》、《算法导论》以及《EffectiveC++中文版》,再根据用户对《C++Primer中文版》的评分及《C++Primer中文版》、《编程之美》与这三本书的相似度的乘积求和就可以表征出用户对这三本书的偏好程度,然后依据偏好程度的排名给用户作推荐,用公式表示偏好值:puisum(rui*wij), recommendation=top_k(rank(pui)),这就是我们最终获得的函数关系式,它将用户历史的交易数据总结出来的相似度影射到推荐的物品集合。

 

推荐算法告诉你如何“投其所好”

       当然,我们也可以从用户的角度来计算用户之间的相似度,那么相似度计算公式Wijcos<rui,rvi>中的rui, rvi分别代表用户uv对所有物品的评分向量,若数据集中所有用户评分反馈缺失,则向量中的元素只有01,其中0代表用户没有购买过该物品,1则反之。

       进一步思考,我们现在都在鼓吹AI,都希望将AI算法应用到业务场景中,上面提到的协同过滤算法顶多算是我们抽象出来的一个统计学模型而已。对于像MOVIELENS这样的数据集中已经有一部分用户对一部分电影作出评分的情况,我们是否可以通过AI算法学习出其中的统计规律进而预测出用户未参与评分甚至是未看过的电影的评分值呢?答案是肯定的。

       通常情况下,电商平台或电影碟片商家供出售的商品达十万到百万个,用户规模达到千万至亿计,如果从单个用户或商品的粒度去处理数据的话势必会造成计算量爆表的麻烦,像前面提到的基于用户的协同过滤的算法就无法避免这种问题。那么显而易见的思路是先以粗粒度的方式处理数据,那该如何以粗粒度的方式处理呢?了解机器学习的人肯定会想到无监督学习中的聚类算法,但这里存在一个致命的问题,我们的数据集并非完整的,其中占很大比例的缺失值是需要我们预测的,即便存在一部分用户对所有商品都有完整的评分值,我们根据这个评分矩阵子集作出恰当的聚类,但依然无法对缺失值作出合理的预测。

       要解决上述难题,我们得借助一种叫做隐语义矩阵分解聚类的算法,这种算法源于线性代数中的矩阵分解。若我们把用户对物品的评分矩阵R_m*n,则R_m*n可以分解为P_m*kQ_k*n的乘积,其中的k我们可以理解为算法对用户和物品自动区分出来的隐类。那么这个分解出来的隐类会偏离我们的业务逻辑或者说会具备可解释性吗?了解过线性代数的人会知道R_m*n中的第p行第q列的评分值等于P_m*k的第p行的值乘以Q_k*nq列对应的值再取和,这从业务上可以解释为用户u对物品i的评分等于用户对物品i所属的类别c的评分值乘以物品i与类别i的相似度的乘积,从本质上来看还是没有跳出协同过滤算法的思路。

推荐算法告诉你如何“投其所好”

        既然隐语义聚类的算法与协同过滤的本质趋同,那它到底有啥好处呢?首先,它是一个很好的降维动作,可以显著地降低计算复杂度,若分解成K个隐类(K<<M,N),即从协同过滤的O(N*N)O(M*M)降低至O(K*(M+N));其次,隐语义聚类可以对用户的兴趣或物品作出比人工更加客观、合理的聚类;再次,它还可以定量的计算出用户或物品在各类别中的权重。

        那么权重该如何计算呢?如果用户对物品的评分矩阵是完整的,通过矩阵分解直接可以获得所有权重,但现实是矩阵是有大量缺失值的,这时侯AI的学习算法就派上用场了。如何学习呢?从我们的生活经验可以得知,那些最有价值的经验教训都是带着血和泪的,也就是说我们必须经受过损失才会学习记忆到有价值的经验。这套法则对于AI也是如出一辙,也就说我们构建学习模型之前得先构造损失函数C,这个损失函数的意义在于时刻警示学习者(AI自我)得在遵从一定的规矩(正则项)的前提下不断迭代更新自我认知(预测值)以持续减小跟实际值之间的偏差直到逼近真理为止(达到收敛条件学习终止)

       如下面的公式所示,PukQik都是要经过反复迭代学习出来的模型参数(即经验值),而这个经验值总是在总结上一次经验值的基础上再往损失降低最大的方向(梯度下降)向前探索一小步(学习率)。可以看到,在迭代过程中PukQik是相互依赖的,这样的情况若以方程求解的思路是无法求得显式解得,而AI算法通过反复迭代学习可以很自然的获得业务模型中蕴含的经验值,不能不赞其神通广大。

推荐算法告诉你如何“投其所好”

推荐算法告诉你如何“投其所好”

        上面介绍的是推荐系统中常用的协同过滤及隐语义分解算法,实际上一个优秀的工业级推荐系统需要非常灵活的算法实验平台,可以支持多种算法组合,包括模型结构调整。因为很难有一套通用的模型架构适用于所有的推荐场景。现在很流行将LRDNN结合,前几年Facebook也将LRGBDT算法做结合。今日头条旗下几款产品都在沿用同一套强大的算法推荐系统,但根据业务场景不同,模型架构会有所调整。

       一般来说,主要有四类特征会对推荐起到比较重要的作用。第一类是相关性特征,就是评估内容的属性和与用户是否匹配。显性的匹配包括关键词匹配、分类匹配、来源匹配、主题匹配等。像FM模型中也有一些隐性匹配,从用户向量与内容向量的距离可以得出。第二类是环境特征,包括地理位置、时间。这些既是bias特征,也能以此构建一些匹配特征。第三类是热度特征。包括全局热度、分类热度,主题热度,以及关键词热度等。内容热度信息在大的推荐系统特别在用户冷启动的时候非常有效。第四类是协同特征,它可以在部分程度上帮助解决所谓算法越推越窄的问题。协同特征并非考虑用户已有历史,而是通过用户行为分析不同用户间相似性,比如点击相似、兴趣分类相似、主题相似、兴趣词相似,甚至向量相似,从而扩展模型的探索能力。

        总之,推荐算法入门不难,但做深入了也是个很深的坑,我只能以屈原大诗人的离骚体结尾以激励自我:路漫漫其修远兮,吾将上下而求索!


以上是关于推荐算法告诉你如何“投其所好”的主要内容,如果未能解决你的问题,请参考以下文章

算法 | 5类系统推荐算法,告诉你用户需要什么

用28张图告诉你什么是推荐系统

技术 | 5类系统推荐算法,告诉你用户需要什么

面试算法爱好者书籍/OJ推荐

三步在阿里云上面搭建一套个性化推荐系统

商品推荐算法