常见面试之机器学习算法思想简单梳理
(新浪微博:tornadomeet,欢迎交流!)
前言:
找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也能够当作是一个选择,不少计算机方向的研究生都会接触这个,假设你的研究方向是机器学习/数据挖掘之类。且又对其非常感兴趣的话,能够考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习能够作为一种重要手段。而随着科技的不断发展,相信这方面的人才需求也会越来越大。
纵观IT行业的招聘岗位。机器学习之类的岗位还是挺少的。国内大点的公司里百度,阿里,腾讯。网易,搜狐。华为(华为的岗位基本都是随机分配。机器学习等岗位基本面向的是博士)等会有相关职位。另外一些国内的中小型企业和外企也会招一小部分。当然了,当中大部分还是百度北京要人最多,上百人。
阿里的算法岗位非常大一部分也是搞机器学习相关的。另外本人有幸签约了网易杭州研究院的深度学习算法岗位,打算从事机器学习领域至少5年。
非常感谢小易收留了我。
以下是本人在找机器学习岗位工作时。总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想,希望对大家找机器学习岗位时有点帮助。实际上在面试过程中,懂这些算法的基本思想和大概流程是远远不够的,那些面试官往往问的都是一些公司内部业务中的课题,往往要求你不仅要懂得这些算法的理论过程,并且要非常熟悉如何使用它,什么场合用它,算法的优缺点。以及调參经验等等。说白了,就是既要会点理论,也要会点应用。既要有点深度。也要有点广度。否则运气不好的话非常easy就被刷掉,由于每一个面试官爱好不同。
朴素贝叶斯:
有以下几个地方须要注意:
1. 假设给出的特征向量长度可能不同,这是须要归一化为通长度的向量(这里以文本分类为例),比方说是句子单词的话。则长度为整个词汇量的长度。相应位置是该单词出现的次数。
2. 计算公式例如以下:

当中一项条件概率能够通过朴素贝叶斯条件独立展开。要注意一点就是
的计算方法。而由朴素贝叶斯的前提假设可知,
=
。因此一般有两种,一种是在类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本的总和;另外一种方法是类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本中全部特征出现次数的总和。
3. 假设
中的某一项为0,则其联合概率的乘积也可能为0,即2中公式的分子为0,为了避免这种现象出现。普通情况下会将这一项初始化为1。当然为了保证概率相等,分母应相应初始化为2(这里由于是2类,所以加2,假设是k类就须要加k,术语上叫做laplace光滑,
分母加k的原因是使之满足全概率公式)。
朴素贝叶斯的长处:
对小规模的数据表现非常好。适合多分类任务,适合增量式训练。
缺点:
对输入数据的表达形式非常敏感。
决策树:
决策树中非常重要的一点就是选择一个属性进行分枝,因此要注意一下信息增益的计算公式。并深入理解它。
信息熵的计算公式例如以下:

当中的n代表有n个分类类别(比方假设是2类问题。那么n=2)。分别计算这2类样本在总样本中出现的概率p1和p2。这样就能够计算出未选中属性分枝前的信息熵。
如今选中一个属性xi用来进行分枝。此时分枝规则是:假设xi=vx的话,将样本分到树的一个分支。假设不相等则进入还有一个分支。非常显然。分支中的样本非常有可能包括2个类别。分别计算这2个分支的熵H1和H2,计算出分枝后的总信息熵H’=p1*H1+p2*H2.,则此时的信息增益ΔH=H-H’。以信息增益为原则,把全部的属性都測试一边,选择一个使增益最大的属性作为本次分枝属性。
决策树的长处:
计算量简单。可解释性强,比較适合处理有缺失属性值的样本,能够处理不相关的特征;
缺点:
easy过拟合(兴许出现了随机森林,减小了过拟合现象);
Logistic回归:
Logistic是用来分类的,是一种线性分类器,须要注意的地方有:
1. logistic函数表达式为:

其导数形式为:

2. logsitc回归方法主要是用最大似然预计来学习的,所以单个样本的后验概率为:
![]()
到整个样本的后验概率:

当中:

通过对数进一步化简为:

3. 事实上它的loss function为-l(θ),因此我们需使loss function最小。可採用梯度下降法得到。
梯度下降法公式为:

![]()
Logistic回归长处:
1、实现简单;
2、分类时计算量非常小,速度非常快。存储资源低;
缺点:
1、easy欠拟合,一般精确度不太高
2、仅仅能处理两分类问题(在此基础上衍生出来的softmax能够用于多分类)。且必须线性可分。
线性回归:
线性回归才是真正用于回归的,而不像logistic回归是用于分类,其基本思想是用梯度下降法对最小二乘法形式的误差函数进行优化,当然也能够用normal equation直接求得參数的解。结果为:

而在LWLR(局部加权线性回归)中,參数的计算表达式为:

由于此时优化的是:

由此可见LWLR与LR不同,LWLR是一个非參数模型,由于每次进行回归计算都要遍历训练样本至少一次。
线性回归长处:
实现简单,计算简单;
缺点:
不能拟合非线性数据;
KNN算法:
KNN即近期邻算法,其主要过程为:
1. 计算训练样本和測试样本中每一个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2. 对上面全部的距离值进行排序;
3. 选前k个最小距离的样本。
4. 依据这k个样本的标签进行投票。得到最后的分类类别。
如何选择一个最佳的K值,这取决于数据。普通情况下。在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启示式技术来获取,比方,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。
近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。
注:马氏距离一定要先给出样本集的统计性质,比方均值向量,协方差矩阵等。关于马氏距离的介绍例如以下:

KNN算法的长处:
1. 思想简单,理论成熟,既能够用来做分类也能够用来做回归;
2. 可用于非线性分类;
3. 训练时间复杂度为O(n);
4. 精确度高。对数据没有假设,对outlier不敏感。
缺点:
1. 计算量大;
2. 样本不平衡问题(即有些类别的样本数量非常多。而其他样本的数量非常少);
3. 须要大量的内存。
SVM:
要学会如何使用libsvm以及一些參数的调节经验,另外须要理清楚svm算法的一些思路:
1. svm中的最优分类面是对全部样本的几何裕量最大(为什么要选择最大间隔分类器。请从数学角度上说明?网易深度学习岗位面试过程中有被问到。答案就是几何间隔与样本的误分次数间存在关系:
,当中的分母就是样本到分类间隔距离,分子中的R是全部样本中的最长向量值),即:

经过一系列推导可得为优化以下原始目标:

2. 以下来看看拉格朗日理论:

能够将1中的优化目标转换为拉格朗日的形式(通过各种对偶优化。KKD条件),最后目标函数为:

我们仅仅须要最小化上述目标函数,当中的α为原始优化问题中的不等式约束拉格朗日系数。
3. 对2中最后的式子分别w和b求导可得:

由上面第1式子能够知道,假设我们优化出了α,则直接能够求出w了。即模型的參数搞定。而上面第2个式子能够作为兴许优化的一个约束条件。
4. 对2中最后一个目标函数用对偶优化理论能够转换为优化以下的目标函数:

而这个函数能够用经常使用的优化方法求得α。进而求得w和b。
5. 依照道理,svm简单理论应该到此结束。只是还是要补充一点,即在预測时有:

那个尖括号我们能够用核函数取代,这也是svm经常和核函数扯在一起的原因。
6. 最后是关于松弛变量的引入,因此原始的目标优化公式为:

此时相应的对偶优化公式为:

与前面的相比仅仅是α多了个上界。
SVM算法长处:
可用于线性/非线性分类。也能够用于回归;
低泛化误差。
easy解释;
计算复杂度较低;
缺点:
对參数和核函数的选择比較敏感;
原始的SVM仅仅比較擅好处理二分类问题;
Boosting:
主要以Adaboost为例。首先来看看Adaboost的流程图。例如以下:

从图中能够看到,在训练过程中我们须要训练出多个弱分类器(图中为3个),每一个弱分类器是由不同权重的样本(图中为5个训练样本)训练得到(当中第一个弱分类器相应输入样本的权值是一样的),而每一个弱分类器对终于分类结果的作用也不同。是通过加权平均输出的,权值见上图中三角形里面的数值。那么这些弱分类器和其相应的权值是如何训练出来的呢?
以下通过一个样例来简单说明。
书中(machine learning in action)假设的是5个训练样本,每一个训练样本的维度为2,在训练第一个分类器时5个样本的权重各为0.2. 注意这里样本的权值和终于训练的弱分类器组相应的权值α是不同的。样本的权重仅仅在训练过程中用到,而α在训练过程和測试过程都实用到。
如今假设弱分类器是带一个节点的简单决策树,该决策树会选择2个属性(假设仅仅有2个属性)的一个,然后计算出这个属性中的最佳值用来分类。
Adaboost的简单版本号训练步骤例如以下:
1. 训练第一个分类器。样本的权值D为同样的均值。通过一个弱分类器。得到这5个样本(请相应书中的样例来看,依然是machine learning in action)的分类预測标签。
与给出的样本真实标签对照,就可能出现误差(即错误)。
假设某个样本预測错误,则它相应的错误值为该样本的权重,假设分类正确,则错误值为0. 最后累加5个样本的错误率之和,记为ε。
2. 通过ε来计算该弱分类器的权重α,公式例如以下:

3. 通过α来计算训练下一个弱分类器样本的权重D。假设相应样本分类正确,则减小该样本的权重,公式为:

假设样本分类错误,则增加该样本的权重。公式为:

4. 循环步骤1,2,3来继续训练多个分类器,仅仅是其D值不同而已。
測试步骤例如以下:
输入一个样本到训练好的每一个弱分类中。则每一个弱分类都相应一个输出标签。然后该标签乘以相应的α,最后求和得到值的符号即为预測标签值。
Boosting算法的长处:
低泛化误差。
easy实现。分类准确率较高,没有太多參数能够调;
缺点:
对outlier比較敏感。
聚类:
依据聚类思想划分:
1. 基于划分的聚类:
K-means, k-medoids(每一个类别中找一个样本点来代表),CLARANS.
k-means是使以下的表达式值最小:

k-means算法的长处:
(1)k-means算法是解决聚类问题的一种经典算法,算法简单、高速。
(2)对处理大数据集。该算法是相对可伸缩的和高效率的。由于它的复杂度大约是O(nkt),当中n是全部对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法通常局部收敛。
(3)算法尝试找出使平方误差函数值最小的k个划分。
当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。
缺点:
(1)k-平均方法仅仅有在簇的平均值被定义的情况下才干使用。且对有些分类属性的数据不适合。
(2)要求用户必须事先给出要生成的簇的数目k。
(3)对初值敏感。对于不同的初始值,可能会导致不同的聚类结果。
(4)不适合于发现非凸面形状的簇,或者大小区别非常大的簇。
(5)对于"噪声"和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
2. 基于层次的聚类:
自底向上的凝聚方法,比方AGNES。
自上向下的分裂方法,比方DIANA。
3. 基于密度的聚类:
DBSACN,OPTICS,BIRCH(CF-Tree),CURE.
4. 基于网格的方法:
STING, WaveCluster.
5. 基于模型的聚类:
EM,SOM,COBWEB.
以上这些算法的简单介绍可參考聚类(百度百科)。
推荐系统:
推荐系统的实现主要分为两个方面:基于内容的实现和协同滤波的实现。
基于内容的实现:
不同人对不同电影的评分这个样例。能够看做是一个普通的回归问题,因此每部电影都须要提前提取出一个特征向量(即x值),然后针对每一个用户建模,即每一个用户打的分值作为y值,利用这些已有的分值y和电影特征值x就能够训练回归模型了(最常见的就是线性回归)。这样就能够预測那些用户没有评分的电影的分数。
(值得注意的是需对每一个用户都建立他自己的回归模型)
从还有一个角度来看。也能够是先给定每一个用户对某种电影的喜好程度(即权值),然后学出每部电影的特征,最后採用回归来预測那些没有被评分的电影。
当然还能够是同一时候优化得到每一个用户对不同类型电影的热爱程度以及每部电影的特征。详细能够參考Ng在coursera上的ml教程:https://www.coursera.org/course/ml
基于协同滤波的实现:
协同滤波(CF)能够看做是一个分类问题,也能够看做是矩阵分解问题。协同滤波主要是基于每一个人自己的喜好都类似这一特征,它不依赖于个人的基本信息。
比方刚刚那个电影评分的样例中,预測那些没有被评分的电影的分数仅仅依赖于已经打分的那些分数,并不须要去学习那些电影的特征。
SVD将矩阵分解为三个矩阵的乘积,公式例如以下所看到的:

中间的矩阵sigma为对角矩阵,对角元素的值为Data矩阵的神秘值(注意神秘值和特征值是不同的),且已经从大到小排列好了。即使去掉特征值小的那些特征,依然能够非常好的重构出原始矩阵。例如以下图所看到的:

当中更深的颜色代表去掉小特征值重构时的三个矩阵。
果m代表商品的个数,n代表用户的个数,则U矩阵的每一行代表商品的属性,如今通过降维U矩阵(取深色部分)后,每一个商品的属性能够用更低的维度表示(假设为k维)。这样当新来一个用户的商品推荐向量X,则能够依据公式X'*U1*inv(S1)得到一个k维的向量。然后在V’中寻找最类似的那一个用户(类似度測量可用余弦公式等),依据这个用户的评分来推荐(主要是推荐新用户未打分的那些商品)。详细样例能够參考网页:SVD在推荐系统中的应用。
另外关于SVD分解后每一个矩阵的实际含义能够參考google吴军的《数学之美》一书(只是个人感觉吴军解释UV两个矩阵时好像弄反了,不知道大家如何觉得)。或者參考machine learning in action当中的svd章节。
pLSA:
pLSA由LSA发展过来,而早期LSA的实现主要是通过SVD分解。pLSA的模型图例如以下:

公式中的意义例如以下:

详细能够參考2010龙星计划:机器学习中相应的主题模型那一讲
LDA:
主题模型。概率图例如以下:

和pLSA不同的是LDA中假设了非常多先验分布。且一般參数的先验分布都假设为Dirichlet分布,其原因是共轭分布时先验概率和后验概率的形式同样。
GDBT:
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),好像在阿里内部用得比較多(所以阿里算法岗位面试时可能会问到),它是一种迭代的决策树算法,该算法由多棵决策树组成,全部树的输出结果累加起来就是终于答案。
它在被提出之初就和SVM一起被觉得是泛化能力(generalization)较强的算法。近些年更由于被用于搜索排序的机器学习模型而引起大家关注。
GBDT是回归树。不是分类树。其核心就在于,每一棵树是从之前全部树的残差中来学习的。
为了防止过拟合。和Adaboosting一样。也增加了boosting这一项。
关于GDBT的介绍能够能够參考:GBDT(MART) 迭代决策树新手教程 | 简单介绍。
Regularization:
作用是(网易电话面试时有问到):
1. 数值上更easy求解。
2. 特征数目太大时更稳定;
3. 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。
而增加规则项能使目标函数复杂度减小,且更光滑。
4. 减小參数空间;參数空间越小,复杂度越低。
5. 系数越小,模型越简单,而模型越简单则泛化能力越强(Ng宏观上给出的解释)。
6. 能够看成是权值的高斯先验。
异常检測:
能够预计样本的密度函数,对于新样本直接计算其密度,假设密度值小于某一阈值,则表示该样本异常。而密度函数一般採用多维的高斯分布。假设样本有n维。则每一维的特征都能够看作是符合高斯分布的,即使这些特征可视化出来不太符合高斯分布,也能够对该特征进行数学转换让其看起来像高斯分布。比方说x=log(x+c), x=x^(1/c)等。
异常检測的算法流程例如以下:

当中的ε也是通过交叉验证得到的,也就是说在进行异常检測时,前面的p(x)的学习是用的无监督,后面的參数ε学习是用的有监督。那么为什么不全部使用普通有监督的方法来学习呢(即把它看做是一个普通的二分类问题)?主要是由于在异常检測中,异常的样本数量非常少而正常样本数量非常多,因此不足以学习到好的异常行为模型的參数,由于后面新来的异常样本可能全然是与训练样本中的模式不同。
另外,上面是将特征的每一维看成是相互独立的高斯分布,事实上这种近似并非最好的,可是它的计算量较小。因此也常被使用。更好的方法应该是将特征拟合成多维高斯分布,这时有特征之间的相关性,但随之计算量会变复杂,且样本的协方差矩阵还可能出现不可逆的情况(主要在样本数比特征数小,或者样本特征维数之间有线性关系时)。
上面的内容能够參考Ng的https://www.coursera.org/course/ml
EM算法:
有时候由于样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的參数时一般採用最大似然预计,由于含有了隐含变量,所以对似然函数參数求导是求不出来的,这时能够採用EM算法来求模型的參数的(相应模型參数个数可能有多个),EM算法一般分为2步:
E步:选取一组參数,求出在该參数下隐含变量的条件概率值;
M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。
反复上面2步直至收敛。
公式例如以下所看到的:

M步公式中下界函数的推导过程:

EM算法一个常见的样例就是GMM模型。每一个样本都有可能由k个高斯产生。仅仅只是由每一个高斯产生的概率不同而已。因此每一个样本都有相应的高斯分布(k个中的某一个)。此时的隐含变量就是每一个样本相应的某个高斯分布。
GMM的E步公式例如以下(计算每一个样本相应每一个高斯的概率):

更详细的计算公式为:

M步公式例如以下(计算每一个高斯的比重,均值。方差这3个參数):

关于EM算法能够參考Ng的cs229课程资料 或者网易公开课:斯坦福大学公开课 :机器学习课程。
Apriori:
Apriori是关联分析中比較早的一种方法,主要用来挖掘那些频繁项集合。
其思想是:
1. 假设一个项目集合不是频繁集合,那么不论什么包括它的项目集合也一定不是频繁集合;
2. 假设一个项目集合是频繁集合。那么它的不论什么非空子集也是频繁集合。
Aprioir须要扫描项目表多遍。从一个项目開始扫描。舍去掉那些不是频繁的项目,得到的集合称为L,然后对L中的每一个元素进行自组合。生成比上次扫描多一个项目的集合,该集合称为C。接着又扫描去掉那些非频繁的项目,反复…
看以下这个样例:
元素项目表格:

假设每一个步骤不去掉非频繁项目集,则其扫描过程的树形结构例如以下:

在当中某个过程中,可能出现非频繁的项目集,将其去掉(用阴影表示)为:

上面的内容主要參考的是machine learning in action这本书。
FP Growth:
FP Growth是一种比Apriori更高效的频繁项挖掘方法。它仅仅须要扫描项目表2次。当中第1次扫描获得当个项目的频率,去掉不符合支持度要求的项。并对剩下的项排序。第2遍扫描是建立一颗FP-Tree(frequent-patten tree)。
接下来的工作就是在FP-Tree上进行挖掘。
比方说有下表:

它所相应的FP_Tree例如以下:

然后从频率最小的单项P開始,找出P的条件模式基。用构造FP_Tree同样的方法来构造P的条件模式基的FP_Tree。在这棵树上找出包括P的频繁项集。
依次从m,b,a,c,f的条件模式基上挖掘频繁项集,有些项须要递归的去挖掘,比較麻烦,比方m节点,详细的过程能够參考博客:Frequent Pattern 挖掘之二(FP Growth算法)。里面讲得非常详细。

浙公网安备 33010602011771号