您的位置:首页 > 职场人生

机器学习面试系列一

2017-11-20 13:48 274 查看
1.请简要介绍下SVM

  SVM,全称是support vector machine,中文名叫支持向量机。SVM是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。

  扩展:这里有篇文章详尽介绍了SVM的原理、推导,http://blog.csdn.net/v_july_v/article/details/7624837。

  此外,这里有个视频也是关于SVM的推导:http://www.julyedu.com/video/play/18/429

2.请简要介绍下tensorflow的计算图

  @寒小阳:Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。



3.在k-means或kNN,我们常用欧氏距离来计算最近的邻居之间的距离,有时也用曼哈顿距离,请对比下这两种距离的差别。

  欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为:



  曼哈顿距离,我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈顿距离为:

,要注意的是,曼哈顿距离依赖座标系统的转度,而非系统在座标轴上的平移或映射。 

  通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,这也是曼哈顿距离名称的来源, 同时,曼哈顿距离也称为城市街区距离(City Block distance)。

  另,关于各种距离的比较参看http://blog.csdn.net/v_july_v/article/details/8203674

4.百度2015校招机器学习笔试题

参见http://www.itmian4.com/thread-7042-1-1.html

5.关于LR

  @rickjin:把LR从头到脚都给讲一遍。建模,现场数学推导,每种解法的原理,正则化,LR和maxent模型啥关系,lr为啥比线性回归好。有不少会背答案的人,问逻辑细节就糊涂了。原理都会? 那就问工程,并行化怎么做,有几种并行化方式,读过哪些开源的实现。还会,那就准备收了吧,顺便逼问LR模型发展历史。







另外,关于答案这篇文章可以做参考:
http://blog.csdn.net/cyh_24/article/details/50359055.html http://blog.csdn.net/zouxy09/article/details/20319673
6.overfitting怎么解决?

dropout、regularization、batch normalizatin

7.LR和SVM的联系与区别

  @朝阳在望,联系:

  1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题) 

  2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。 
  区别: 1、LR是参数模型,SVM是非参数模型。 
  2、从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。 
  3、SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。 
  4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。 
  5、logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。

来源:http://blog.csdn.net/timcompp/article/details/62237986

8.说说你知道的核函数

  通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:

  多项式核

,显然刚才我们举的例子是这里多项式核的一个特例(R
= 1,d = 2)。虽然比较麻烦,而且没有必要,不过这个核所对应的映射实际上是可以写出来的,该空间的维度是

,其中 

 是原始空间的维度。

  高斯核

,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果

选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果

选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数

,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:


  线性核,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

9.LR与线性回归的区别与联系

  @nishizhen:个人感觉逻辑回归和线性回归首先都是广义的线性回归,其次经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数,另外线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。

  @乖乖癞皮狗:逻辑回归的模型本质上是一个线性回归模型,逻辑回归都是以线性回归为理论支持的。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。

10.请问(决策树、Random Forest、Booting、Adaboot)GBDT和XGBoost的区别是什么?
  关于决策树,这里有篇《决策树算法》。而随机森林Random Forest是一个包含多个决策树的分类器。至于AdaBoost,则是英文"Adaptive Boosting"(自适应增强)的缩写,关于AdaBoost可以看下这篇文章《Adaboost 算法的原理与推导》。GBDT(Gradient Boosting Decision
Tree),即梯度上升决策树算法,相当于融合决策树和梯度上升boosting算法。
  @Xijun LI:xgboost类似于gbdt的优化版,不论是精度还是效率上都有了提升。与gbdt相比,具体的优点有:
  1.损失函数是用泰勒展式二项逼近,而不是像gbdt里的就是一阶导数
  2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
  3.节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的
  更多详见:https://xijunlee.github.io/2017/06/03/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/

11.为什么xgboost要用泰勒展开,优势在哪里?
  @AntZ:xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得二阶倒数形式, 可以在不选定损失函数具体形式的情况下用于算法优化分析.本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性。

12.xgboost如何寻找最优特征?是又放回还是无放回的呢?
  @AntZ:xgboost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性. xgboost利用梯度优化模型算法, 样本是不放回的(想象一个样本连续重复抽出,梯度来回踏步会不会高兴). 但xgboost支持子采样, 也就是每轮计算可以不使用全部样本。

13.谈谈判别式模型和生成式模型?
  判别方法:由数据直接学习决策函数 Y = f(X),或者由条件分布概率 P(Y|X)作为预测模型,即判别模型。
  生成方法:由数据学习联合概率密度分布函数 P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。
  由生成模型可以得到判别模型,但由判别模型得不到生成模型。
  常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
  常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机

14.L1和L2的区别

  L1范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。 
  比如 向量A=[1,-1,3], 那么A的L1范数为 |1|+|-1|+|3|.
  简单总结一下就是: 
  L1范数: 为x向量各个元素绝对值之和。 
  L2范数: 为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或Frobenius范数 

  Lp范数: 为x向量各个元素绝对值p次方和的1/p次方.
  在支持向量机学习过程中,L1范数实际是一种对于成本函数求解最优的过程,因此,L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征。 
  L1范数可以使权值稀疏,方便特征提取。 
  L2范数可以防止过拟合,提升模型的泛化能力。

15.L1和L2正则先验分别服从什么分布
  @齐同学:面试中遇到的,L1和L2正则先验分别服从什么分布,L1是拉普拉斯分布,L2是高斯分布。

16.CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?
  @许韩,来源:https://zhuanlan.zhihu.com/p/25005808

Deep Learning -Yann LeCun, Yoshua Bengio & Geoffrey Hinton

Learn TensorFlow and deep learning, without a Ph.D.

The Unreasonable Effectiveness of Deep Learning -LeCun 16 NIPS Keynote
  以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。



  CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。

局部连接使网络可以提取数据的局部特征;权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图:


http://blog.csdn.net/v_july_v/article/details/51812459
17.说一下Adaboost,权值更新公式。当弱分类器是Gm时,每个样本的的权重是w1,w2...,请写出最终的决策公式。

  给定一个训练数据集T={(x1,y1), (x2,y2)…(xN,yN)},其中实例

,而实例空间

,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。

  Adaboost的算法流程如下:

  步骤1. 首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N。



  步骤2. 进行多轮迭代,用m = 1,2, ..., M表示迭代的第多少轮

  a. 使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):



  b. 计算Gm(x)在训练数据集上的分类误差率



  由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。

  c. 计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):



  由上述式子可知,em <= 1/2时,am >= 0,且am随着em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。

  d. 更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代



  使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。

其中,Zm是规范化因子,使得Dm+1成为一个概率分布:


  步骤3. 组合各个弱分类器



  从而得到最终分类器,如下:



  更多请查看此文:http://blog.csdn.net/v_july_v/article/details/40718799

18.LSTM结构推导,为什么比RNN好?
  推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸

19.经常在网上搜索东西的朋友知道,当你不小心输入一个不存在的单词时,搜索引擎会提示你是不是要输入某一个正确的单词,比如当你在Google中输入“Julw”时,系统会猜测你的意图:是不是要搜索“July”,如下图所示:


  这叫做拼写检查。根据谷歌一员工写的文章(http://norvig.com/spell-correct.html)显示,Google的拼写检查基于贝叶斯方法。请说说的你的理解,具体Google是怎么利用贝叶斯方法,实现"拼写检查"的功能。

  用户输入一个单词时,可能拼写正确,也可能拼写错误。如果把拼写正确的情况记做c(代表correct),拼写错误的情况记做w(代表wrong),那么"拼写检查"要做的事情就是:在发生w的情况下,试图推断出c。换言之:已知w,然后在若干个备选方案中,找出可能性最大的那个c,也就是求

的最大值。
  而根据贝叶斯定理,有:



  由于对于所有备选的c来说,对应的都是同一个w,所以它们的P(w)是相同的,因此我们只要最大化

即可。其中:

  P(c)表示某个正确的词的出现"概率",它可以用"频率"代替。如果我们有一个足够大的文本库,那么这个文本库中每个单词的出现频率,就相当于它的发生概率。某个词的出现频率越高,P(c)就越大。比如在你输入一个错误的词“Julw”时,系统更倾向于去猜测你可能想输入的词是“July”,而不是“Jult”,因为“July”更常见。

  P(w|c)表示在试图拼写c的情况下,出现拼写错误w的概率。为了简化问题,假定两个单词在字形上越接近,就有越可能拼错,P(w|c)就越大。举例来说,相差一个字母的拼法,就比相差两个字母的拼法,发生概率更高。你想拼写单词July,那么错误拼成Julw(相差一个字母)的可能性,就比拼成Jullw高(相差两个字母)。值得一提的是,一般把这种问题称为“编辑距离”,参见http://blog.csdn.net/v_july_v/article/details/8701148#t4

  所以,我们比较所有拼写相近的词在文本库中的出现频率,再从中挑出出现频率最高的一个,即是用户最想输入的那个词。具体的计算过程及此方法的缺陷请参见http://norvig.com/spell-correct.html

20.为什么朴素贝叶斯如此“朴素”?
  因为它假定所有的特征在数据集中的作用是同样重要和独立的。正如我们所知,这个假设在现实世界中是很不真实的,因此,说朴素贝叶斯真的很“朴素”。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: