推荐系统的常用算法----算法岗面试题

● 请你说一说推荐算法,fm,lr,embedding

参考回答:

推荐算法:

基于人口学的推荐、基于内容的推荐、基于用户的协同过滤推荐、基于项目的协同过滤推荐、基于模型的协同过滤推荐、基于关联规则的推荐

FM:

LR:

逻辑回归本质上是线性回归,只是在特征到结果的映射中加入了一层逻辑函数g(z),即先把特征线性求和,然后使用函数g(z)作为假设函数来预测。g(z)可以将连续值映射到0 和1。g(z)为sigmoid function.

sigmoid function 的导数如下:

逻辑回归用来分类0/1 问题,也就是预测结果属于0 或者1 的二值分类问题。这里假设了二值满足伯努利分布,也就是

其也可以写成如下的形式:

对于训练数据集,特征数据x={x1, x2, … , xm}和对应的分类标签y={y1, y2, … , ym},假设m个样本是相互独立的,那么,极大似然函数为:

log似然为:

如何使其最大呢?与线性回归类似,我们使用梯度上升的方法(求最小使用梯度下降),那么

如果只用一个训练样例(x,y),采用随机梯度上升规则,那么随机梯度上升更新规则为:

Embedding:

Embedding在数学上表示一个maping:,也就是一个function。其中该函数满足两个性质:1)injective (单射的):就是我们所说的单射函数,每个Y只有唯一的X对应;2)structure-preserving(结构保存):比如在X所属的空间上,那么映射后在Y所属空间上同理

那么对于word embedding,就是找到一个映射(函数)将单词(word)映射到另外一个空间(其中这个映射具有injective和structure-preserving的特点),生成在一个新的空间上的表达,该表达就是word representation。

● 协同过滤的itemCF,userCF区别适用场景

参考回答:

Item CF 和 User CF两个方法都能很好的给出推荐,并可以达到不错的效果。但是他们之间还是有不同之处的,而且适用性也有区别。下面进行一下对比

计算复杂度:

Item CF 和 User CF 是基于协同过滤推荐的两个最基本的算法,User CF 是很早以前就提出来了,Item CF 是从 Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得 Item CF 从性能和复杂度上比 User CF 更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。

适用场景:

在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性远远超过了网站首页对该用户的综合推荐。可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。同时 Item CF 便于为推荐做出解释,在一个非社交网络的网站中,给某个用户推荐一本书,同时给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但如果解释说是因为这本书和你以前看的某本书相似,用户可能就觉得合理而采纳了此推荐。

相反的,在现今很流行的社交网络站点中,User CF 是一个更不错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。

● 推荐系统的大概步骤,解决冷启动。。。

参考回答:

步骤:1)收集用户的所有信息。2)使用大数据计算平台对收集的信息进行处理,的到用户偏好数据。3)将偏好数据导入喜好类型计算算法中进行预算计算,的到预算结果。4)将推荐的结果导入数据库(redis、hbase)。5)发开一个推荐引擎,对外开放接口,输出推荐结果。

解决冷启动的方案:

1)提供非个性化的推荐

最简单的例子就是提供热门排行榜,可以给用户推荐热门排行榜,等到用户数据收集到一定的时候,再切换为个性化推荐。例如Netflix的研究也表明新用户在冷启动阶段确实是更倾向于热门排行榜的,老用户会更加需要长尾推荐

2)利用用户注册信息

用户的注册信息主要分为3种:(1)获取用户的注册信息;(2)根据用户的注册信息对用户分类;(3)给用户推荐他所属分类中用户喜欢的物品。

3)选择合适的物品启动用户的兴趣

用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。一般来说,能够用来启动用户兴趣的物品需要具有以下特点:

比较热门,如果要让用户对物品进行反馈,前提是用户得知道这是什么东西;

具有代表性和区分性,启动用户兴趣的物品不能是大众化或老少咸宜的,因为这样的物品对用户的兴趣没有区分性;

启动物品集合需要有多样性,在冷启动时,我们不知道用户的兴趣,而用户兴趣的可能性非常多,为了匹配多样的兴趣,我们需要提供具有很高覆盖率的启动物品集合,这些物品能覆盖几乎所有主流的用户兴趣

4)利用物品的内容信息

用来解决物品的冷启动问题,即如何将新加入的物品推荐给对它感兴趣的用户。物品冷启动问题在新闻网站等时效性很强的网站中非常重要,因为这些网站时时刻刻都有新物品加入,而且每个物品必须能够再第一时间展现给用户,否则经过一段时间后,物品的价值就大大降低了。

5)采用专家标注

很多系统在建立的时候,既没有用户的行为数据,也没有充足的物品内容信息来计算物品相似度。这种情况下,很多系统都利用专家进行标注。

6)利用用户在其他地方已经沉淀的数据进行冷启动

以QQ音乐举例:QQ音乐的猜你喜欢电台想要去猜测第一次使用QQ音乐的用户的口味偏好,一大优势是可以利用其它腾讯平台的数据,比如在QQ空间关注了谁,在腾讯微博关注了谁,更进一步,比如在腾讯视频刚刚看了一部动漫,那么如果QQ音乐推荐了这部动漫里的歌曲,用户会觉得很人性化。这就是利用用户在其它平台已有的数据。

再比如今日头条:它是在用户通过新浪微博等社交网站登录之后,获取用户的关注列表,并且爬取用户最近参与互动的feed(转发/评论等),对其进行语义分析,从而获取用户的偏好。

所以这种方法的前提是,引导用户通过社交网络账号登录,这样一方面可以降低注册成本提高转化率;另一方面可以获取用户的社交网络信息,解决冷启动问题。

7)利用用户的手机等兴趣偏好进行冷启动

Android手机开放的比较高,所以在安装自己的app时,就可以顺路了解下手机上还安装了什么其他的app。比如一个用户安装了美丽说、蘑菇街、辣妈帮、大姨妈等应用,就可以判定这是女性了,更进一步还可以判定是备孕还是少女。目前读取用户安装的应用这部分功能除了app应用商店之外,一些新闻类、视频类的应用也在做,对于解决冷启动问题有很好的帮助。

● 传统的机器学习算法了解吗

参考回答:

常见的机器学习算法:

1). 回归算法:回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。 常见的回归算法包括:最小二乘法(Ordinary Least Square),逻辑回归(Logistic Regression),逐步式回归(Stepwise Regression),多元自适应回归样条(Multivariate Adaptive Regression Splines)以及本地散点平滑估计(Locally Estimated Scatterplot Smoothing)。

2). 基于实例的算法:基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括 k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization, LVQ),以及自组织映射算法(Self-Organizing Map,SOM)。深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

3). 决策树学习:决策树算法根据数据的属性采用树状结构建立决策模型, 决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树(Classification And Regression Tree,CART),ID3 (Iterative Dichotomiser 3),C4.5,Chi-squared Automatic Interaction Detection(CHAID), Decision Stump, 随机森林(Random Forest),多元自适应回归样条(MARS)以及梯度推进机(Gradient Boosting Machine,GBM)。

4). 贝叶斯方法:贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法,平均单依赖估计(Averaged One-Dependence Estimators,AODE),以及Bayesian Belief Network(BBN)。

5). 基于核的算法:基于核的算法中最著名的莫过于支持向量机(SVM)了。基于核的算法把输入数据映射到一个高阶的向量空间,在这些高阶向量空间里,有些分类或者回归问题能够更容易的解决。常见的基于核的算法包括:支持向量机(Support Vector Machine,SVM), 径向基函数(Radial Basis Function,RBF),以及线性判别分析(Linear Discriminate Analysis,LDA)等。

6). 聚类算法:聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括 k-Means算法以及期望最大化算法(Expectation Maximization,EM)。

7). 降低维度算法:像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。常见的算法包括:主成份分析(Principle Component Analysis,PCA),偏最小二乘回归(Partial Least Square Regression,PLS),Sammon映射,多维尺度(Multi-Dimensional Scaling, MDS), 投影追踪(Projection Pursuit)等。

8). 关联规则学习:关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori算法和Eclat算法等。

9). 集成算法:集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括:Boosting,Bootstrapped Aggregation(Bagging),AdaBoost,堆叠泛化(Stacked Generalization,Blending),梯度推进机(Gradient Boosting Machine, GBM),随机森林(Random Forest)。

10). 人工神经网络:人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法。(其中深度学习就是其中的一类算法,我们会单独讨论),重要的人工神经网络算法包括:感知器神经网络(Perceptron Neural Network), 反向传递(Back Propagation),Hopfield网络,自组织映射(Self-Organizing Map, SOM)。学习矢量量化(Learning Vector Quantization, LVQ)。

RF:通过对训练数据样本以及属性进行有放回的抽样(针对某一个属性随机选择样本)这里有两种,一种是每次都是有放回的采样,有些样本是重复的,组成和原始数据集样本个数一样的数据集;另外一种是不放回的抽样,抽取出大约60%的训练信息。由此生成一颗CART树,剩下的样本信息作为袋外数据,用来当作验证集计算袋外误差测试模型;把抽取出的样本信息再放回到原数据集中,再重新抽取一组训练信息,再以此训练数据集生成一颗CART树。这样依次生成多颗CART树,多颗树组成森林,并且他们的生成都是通过随机采样的训练数据生成,因此叫随机森林。RF可以用于数据的回归,也可以用于数据的分类。回归时是由多颗树的预测结果求均值;分类是由多棵树的预测结果进行投票。正式由于它的随机性,RF有极强的防止过拟合的特性。由于他是由CART组成,因此它的训练数据不需要进行归一化,因为每课的建立过程都是通过选择一个能最好的对数据样本进行选择的属性来建立分叉,因此有以上好处的同时也带来了一个缺点,那就是忽略了属性与属性之间的关系。

K-meas:基本K-Means算法的思想很简单,事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

初始化常数K,随机选取初始点为质心

重复计算一下过程,直到质心不再改变

计算样本与每个质心之间的相似度,将样本归类到最相似的类中

重新计算质心

输出最终的质心以及每个类

● 用mapreduce实现10亿级以上数据的kmeans

参考回答:

算法1.map(key,value)

输入:全局变量centers,偏移量key,样本value

输出:<key’,value>对,其中key’是最近中心的索引,value’是样本信息的字符串

从value构造样本的instance;

minDis=Double.MAX_VALUE;
Index=-1;
For i=0 to centers.length do
dis=ComputeDist(instance,centers[i]);
If dis<minDis{
minDis=dis;
index=i;
}
End For

把index作为key’;

把不同维度的values构造成value’;

输出<key’,value’>对;

End

注意这里的Step 2和Step 3初始化了辅助变量minDis和index;Step 4通过计算找出了与样本最近的中心点,函数ComputeDist(instance,centers[i])返回样本和中心点centers[i]的距离;Step 8输出了用来进行下一个过程(combiner)的中间数据。

Combine函数. 每个map任务完成之后,我们用combiner去合并同一个map任务的中间结果。因为中间结果是存储在结点的本地磁盘上,所以这个过程不会耗费网络传输的代价。在combine函数中,我们把属于相同簇的values求和。为了计算每个簇的对象的平均值,我们需要记录每个map的每个簇中样本的总数。Combine函数的伪代码见算法2.

算法2.combine(key,V)

输入:key为簇的索引,V为属于该簇的样本列表

输出:<key’,value’>对,key’为簇的索引,value’是由属于同一类的所有样本总和以及样本数所组成的字符串。

初始化一个数组,用来记录同一类的所有样本的每个维度的总和,样本是V中的元素;

初始化一个计数器num为0来记录属于同一类的样本总数;

While(V.hasNext()){

从V.next()构造样本实例instance;

把instance的不同维度值相加到数组

num++;

}

把key作为key’;

构造value’:不同维度的求和结果+num;

输出<key’,value’>对;

End

Reduce函数. Reduce函数的输入数据由每个结点的combine函数获得。如combine函数所描述,输入数据包括部分样本(同一类)的求和以及对应样本数。在reduce函数中,我们可以把同一类的所有样本求和并且计算出对应的样本数。因此,我们可以得到用于下一轮迭代的新中心。Reduce函数的伪代码见算法3。

算法3.Reduce(key,V)

输入:key为簇的索引,V为来自不同结点的部分总和的样本列表

输出:<key’,value’>对,key’为簇的索引,value’是代表新的聚类中心的字符串

初始化一个数组,用来记录同一类的所有样本的每个维度的总和,样本是V中的元素;

初始化一个计数器NUM为0来记录属于同一类的样本总数;

While(V.hasNext()){

从V.next()构造样本实例instance;

把instance的不同维度值相加到数组

NUM+=num;

}

数组的每个元素除以NUM来获得新的中心坐标;

把key作为key’;

构造value’为所有中心坐标的字符串;

输出<key’,value’>对;

End

● Kmeans

参考回答:

基本K-Means算法的思想很简单,事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

初始化常数K,随机选取初始点为质心

重复计算一下过程,直到质心不再改变

计算样本与每个质心之间的相似度,将样本归类到最相似的类中

重新计算质心

输出最终的质心以及每个类

● 协同过滤中的算法怎么细分

参考回答:

协同过滤算法通过对用户历史行为数据挖掘发现用户的偏好,基于不同的偏好对用户进行群组划分并推荐相似的商品。协同过的算法分为两类分为基于用户的协同过滤算法和基于物品的协同过滤的算法。基于用户的协同过滤是基于用户对物品的偏好找到相邻邻居用户然后将邻居用户喜欢的推荐给当前的用户。基于物品的协同过滤是计算邻居时采用物品本身,基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好推荐相似的物品给他。

● FM公式

参考回答:

● FM公式

参考回答:

原文地址:https://www.cnblogs.com/zhangyang520/p/10969951.html

时间: 2024-09-30 15:53:38

推荐系统的常用算法----算法岗面试题的相关文章

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

转:【总结】推荐系统中常用算法 以及优点缺点对比

转:http://www.sohu.com/a/108145158_464065 在推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基 于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要

常用排序算法的python实现和性能分析

http://www.cnblogs.com/wiki-royzhang/p/3614694.html 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数

Spark中常用的算法

Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测.精确营销.客户获取.个性偏好等.MLlib 目前支持分类算法有:逻辑回归.支持向量机.朴素贝叶斯和决策树. 案例:导入训练数据集,然后在训练集上执行训练算法,最后在所得模型上进行预测并计算训练误差. import org.apache.sp

电商大数据项目-推荐系统实战之推荐算法(三)

电商大数据项目-推荐系统实战(一)环境搭建以及日志,人口,商品分析http://blog.51cto.com/6989066/2325073电商大数据项目-推荐系统实战之推荐算法http://blog.51cto.com/6989066/2326209电商大数据项目-推荐系统实战之实时分析以及离线分析http://blog.51cto.com/6989066/2326214 (七)推荐系统常用算法协同过滤算法协同过滤算法(Collaborative Filtering:CF)是很常用的一种算法,

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

DotNet常用排序算法总结

数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法,希尔排序算法,快速排序算法. (1).选择排序算法:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(1大于等于i小于等于n)个记录交换. (2).希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各

常用MD5算法代码

常用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 维基百科:MD5 MD5加密后是一个字节数组, 但我们一般是取其十六进制的字符串表示法,当然,十六进制数字符串是区分大小写,在 mysql数据库,Java,和JavaScript语言中,一般是使用小写的字符串来表示, 而在 Oracle数据库官方提供的包中,返回的是大写字符串,这算是一个坑,如果你想要执行多次 md5,可能需要转换为小

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排