常见面试之机器学习算法思想简单梳理(进阶版)

来源:互联网 发布:mac 配置ant 编辑:程序博客网 时间:2024/04/20 23:31

//2015年5月1日

//参考http://blog.jobbole.com/74438/

实际上在面试过程中,懂这些算法的基本思想和大概流程是远远不够的,那些面试官往往问的都是一些公司内部业务中的课题,往往要求你不仅要懂得这些算法的理论过程,而且要非常熟悉怎样使用它,什么场合用它,算法的优缺点,以及调参经验等等。说白了,就是既要会点理论,也要会点应用,既要有点深度,也要有点广度,否则运气不好的话很容易就被刷掉,因为每个面试官爱好不同。

一、最大熵

如何综合不同的信息,用最大熵,而不是简单的加权

预测应满足全部已知条件,而对未知情况不做主观假设

符合所有边缘分布,同时使熵达到最大

例子:骰子(详见数学之美)


二、隐马尔科夫模型

三大问题:

给定一个模型,计算输出序列概率

给定模型和输出,找到输入--维特比算法

估计隐马尔科夫参数--韦尔奇算法(无监督)


三、条件随机场


四、逻辑斯蒂回归

和普通线性回归相比,在类别变量的使用上有了突破。

实际上是一层人工神经网络,训练方式等同最大熵

广义线性模型:因变量不同分布:多重线性,逻辑斯蒂,泊松回归

优点:实现简单;分类时速度快;输出的是一个概率值(重要)

输出的是一个概率值:实际使用时往往不是取P>0.5的去做预测,可能是取top100等等。

缺点:线性模型不咋样;容易欠拟合;只处理二分类问题;需要大样本量;

问题是很多人不会用逻辑斯蒂回归,类别变量要处理成多个dummy变量就不说了。对连续变量该算法是有假设的。

假设了x与logit(P)呈线性关系。往往不符合此假设,实践中应考虑使用dummy变量,可获得非线性特性。

LR的逻辑斯蒂函数:通过非线性函数大大减小了离分离平面较远的点;

注意:往往考到最优化算法,梯度下降等等。对大数据量用随机梯度下降。还会考到逻辑回归算法的推导


五、朴素贝叶斯:

注意一:朴素贝叶斯如何处理连续特征?

假设服从高斯分布

注意二:如果中的某一项为0,则其联合概率的乘积也可能为0,即2中公式的分子为0,为了避免这种现象出现,一般情况下会将这一项初始化为1,当然为了保证概率相等,分母应对应初始化为2(这里因为是2类,所以加2,如果是k类就需要加k,术语上叫做laplace光滑, 分母加k的原因是使之满足全概率公式)。

朴素贝叶斯的优点:对小规模的数据表现很好;适合多分类任务;适合增量式训练(重要)。

适合增量式训练:数据流;一个算法不一定有权限访问之前的样本来进行训练,如处理spam。

缺点:对数据稀疏问题过于敏感(laplace光滑);假设特征间独立不相关(决策树可稍微解决一下)

其实朴素贝叶斯的缺点其他算法也解决不了,朴素贝叶斯的真正缺点是作为一个生成模型,它的准确率不高。

 

六、决策树:

搞清楚ID3,C4.5,CART,随机森林的区别

ID3 :多叉树;递归过程;子集含有单个特征后返回调用处

C4.5:用信息增益率而不是信息增益选择特征,克服了选择偏向取值多的特征;剪枝;连续属性离散化;对缺失值的处理

CART:(为了简化决策树的规模,提高生成决策树的效率)可用于分类和回归;使用基尼系数;每次分成两个子树。其两个基本思想:第一个是将训练样本进行递归地划分自变量空间进行建树的想法,第二个想法是用验证数据进行剪枝。

随机森林:对样本和特征采样;确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m。优点:正确率高;不过拟合;训练快;可以在决定类别时,评估变量的重要性;集成

决策树的优点:

计算量简单;可解释性强(指出树的深度往往过大,已经失去了可解释性);比较适合处理有缺失属性值的样本;能够处理不相关的特征;

缺点:

预测还是比较慢;容易过拟合(后续出现了随机森林,减小了过拟合现象);

 

七、KNN算法:

会要求写出算法步骤;KNN在实际使用上使用KD Tree;

如何选择一个好的K值:如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。

近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。

KNN算法的优点:

1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;

2. 可用于非线性分类;

3. 训练时间复杂度为O(n);

4. 准确度高,对数据没有假设,对outlier不敏感;

缺点:

1. 计算量大;

2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);

3. 需要大量的内存;

重点是指出: (KNN和聚类有点像)

KNN最大的优点是,其特殊的算法思想,对某些问题特别适用。

维度灾难在KNN中的完美体现,不相关特征会严重影响KNN的准确性;

KNN中各种距离计算方式,非欧空间的距离计算公式。

SVM和KNN一起用,SVM得到的是数据全局的规律,而KNN关注数据local的规律


八、SVM:(肯定会考kernel)

要学会如何使用libsvm以及一些参数的调节经验(重要http://blog.chinaunix.net/uid-20761674-id-4840101.html),另外需要理清楚svm算法的一些思路。

Libsvm六个参数:degree,gamma(径向基),coef0,Cvalue(正则化),nu,p(这两个用于回归的)

按照道理,svm简单理论应该到此结束。不过还是要补充一点,即在预测时有:

那个尖括号我们可以用核函数代替,这也是svm经常和核函数扯在一起的原因。

SVM算法优点:

可用于线性/非线性分类,也可以用于回归;

正确率高,低泛化误差;

缺点:

对参数和核函数的选择比较敏感;

不能给出一个概率值;

原始的SVM只比较擅长处理二分类问题;

计算复杂度不高,但其实还是比较困难;(可以只计算少数几个支持向量的距离。在计算复杂核函数优势明显,简化计算量)

SVM如何选择kernel:线性核,径向基核(默认参数效果差,但最优参数比linear好),多项式核;多核学习;

结构风险最小化:

所谓的结构风险最小化就是在保证分类精度(经验风险)的同时,降低学习机器的 VC 维,可以使学习机器在整个样本集上的期望风险得到控制。
传统机器学习方法中普遍采用的经验风险最小化原则在样本数目有限时是不合理的,因此,需要同时最小化经验风险和置信范围。
机器学习过程不但要使经验风险最小,还要使VC维尽量小以缩小置信范围,才能取得较小的实际风险,即对未来样本有较好的推广性。
统计学习理论提出了一种新的策略,即把函数集构造为一个函数子集序列,使各个子集按照VC维的大小排列;在每个子集中寻找最小经验风险,在子集间折衷考虑经验风险和置信范围,取得实际风险的最小。这种思想称作结构风险最小化(Structural Risk Minimization),即SRM准则。
在有限训练样本下,学习机器的VC维越高则置信范围越大,真实风险与经验风险之间可能的差别越大.这就是为什么会出现过学习现象的原因。

SVR回归:不是分类,使所有样本点离超平面的总偏差最小。等同求最大分割。两种方法:

LS-SVR:岭回归(加正则项)

偏差最大最小:用e不敏感函数时,其基础主要是 e 不敏感函数和核函数算法。若将拟合的数学模型表达多维空间的某一曲线,则根据e 不敏感函数所得的结果,就是包括该曲线和训练点的“ e管道”。在所有样本点 中,只有分布在“管壁”上的那一部分样本点决定管道的位置。

九、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算法的优点:

低泛化误差;

容易实现,分类准确率较高,没有太多参数可以调;

缺点:

对outlier比较敏感;

重点是当别人只能说出bagging,boosting时,你要提到 gradient 集成算法

gradient boosting运用之GDBT:

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),好像在阿里内部用得比较多(所以阿里算法岗位面试时可能会问到),它是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的输出结果累加起来就是最终答案。它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。

GBDT是回归树,不是分类树。其核心就在于,每一棵树是从之前所有树的残差中来学习的。为了防止过拟合,和Adaboosting一样,也加入了boosting这一项。

关于GDBT的介绍可以可以参考:GBDT(MART) 迭代决策树入门教程 | 简介。


十、聚类:

根据聚类思想划分:

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.

以上这些算法的简介可参考聚类(百度百科)。

十一、数据流上的聚类算法

Birch、CF-Tree、streaming


十一、关联分析

Apriori、prefix、FP-Growth,三大算法,理论简单,考的是如何在大数据下优化

Apriori:

Apriori是关联分析中比较早的一种方法,主要用来挖掘那些频繁项集合。其思想是:

1. 如果一个项目集合不是频繁集合,那么任何包含它的项目集合也一定不是频繁集合;

2. 如果一个项目集合是频繁集合,那么它的任何非空子集也是频繁集合;

Aprioir需要扫描项目表多遍,从一个项目开始扫描,舍去掉那些不是频繁的项目,得到的集合称为L,然后对L中的每个元素进行自组合,生成比上次扫描多一个项目的集合,该集合称为C,接着又扫描去掉那些非频繁的项目,重复…


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算法),里面讲得很详细。



十二、推荐系统:(考的最多itemCF,userCF,SVD;重点是如何在大数据下优化)

SVD将矩阵分解为三个矩阵的乘积,公式如下所示:

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

其中更深的颜色代表去掉小特征值重构时的三个矩阵。

果m代表商品的个数,n代表用户的个数,则U矩阵的每一行代表商品的属性,现在通过降维U矩阵(取深色部分)后,每一个商品的属性可以用更低的维度表示(假设为k维)。这样当新来一个用户的商品推荐向量X,则可以根据公式X’*U1*inv(S1)得到一个k维的向量,然后在V’中寻找最相似的那一个用户(相似度测量可用余弦公式等),根据这个用户的评分来推荐(主要是推荐新用户未打分的那些商品)。具体例子可以参考网页:SVD在推荐系统中的应用。

 

十三、Topic Model

pLSA:

pLSA由LSA发展过来,而早期LSA的实现主要是通过SVD分解。pLSA的模型图如下:

公式中的意义如下:

具体可以参考2010龙星计划:机器学习中对应的主题模型那一讲

 

LDA:

主题模型,概率图如下:

和pLSA不同的是LDA中假设了很多先验分布,且一般参数的先验分布都假设为Dirichlet分布,其原因是共轭分布时先验概率和后验概率的形式相同。

 

十四、机器学习纯理论之Regularization:

正则化两大作用:

1,从模型修正上看,起了一个trade-off作用,用于平衡学习过程中两个基本量,名字诸如bias-variance、拟合能力-泛化能力、损失函数-推广能力、经验风险-结构风险等等;减少模型复杂度

2,从模型求解上看,正则化提供了一种唯一解的可能,众所周知,光用最小二乘拟合可能出现无数组解,加个L1或L2正则化项能有唯一解,即楼上所言不适定性。解决了矩阵求逆问题的不适定性(岭回归)

吉洪诺夫正则化

解释:贝叶斯学派的解释是先验知识,如L1是laplace先验,L2是高斯先验。

例子:贝叶斯的MAP估计和最大似然估计,前者也是一种正则化;偏差-方差分解;结构风险最小化

SVM中的正则化:min a(y(wx-b)-1)+1/2||w||。其中第一项hinge loss表征了分类错误,第二项则表示L2-norm regularization。因为,如果没有第二项约束,第一项可以无限的小。

线性回归:L1正则化-lasso回归;L2正则化-岭回归;

1. 数值上更容易求解;

2. 特征数目太大时更稳定;

3. 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。而加入规则项能使目标函数复杂度减小,且更光滑。

4. 减小参数空间;参数空间越小,复杂度越低。

5. 系数越小,模型越简单,而模型越简单则泛化能力越强(Ng宏观上给出的解释)。

6. 可以看出是权值的高斯先验。


十四、机器学习纯理论之EM:

EM算法:

有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:

E步:选取一组参数,求出在该参数下隐含变量的条件概率值;

M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。

重复上面2步直至收敛。

公式如下所示:

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

EM算法一个常见的例子就是GMM模型,每个样本都有可能由k个高斯产生,只不过由每个高斯产生的概率不同而已,因此每个样本都有对应的高斯分布(k个中的某一个),此时的隐含变量就是每个样本对应的某个高斯分布。

GMM的E步公式如下(计算每个样本对应每个高斯的概率):

更具体的计算公式为:

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

关于EM算法可以参考Ng的cs229课程资料或者网易公开课:斯坦福大学公开课 :机器学习课程。


十五、机器学习纯理论之生成模型,判别模型:


十六、异常检测:

可以估计样本的密度函数,对于新样本直接计算其密度,如果密度值小于某一阈值,则表示该样本异常。而密度函数一般采用多维的高斯分布。如果样本有n维,则每一维的特征都可以看作是符合高斯分布的,即使这些特征可视化出来不太符合高斯分布,也可以对该特征进行数学转换让其看起来像高斯分布,比如说x=log(x+c), x=x^(1/c)等。异常检测的算法流程如下:

其中的ε也是通过交叉验证得到的,也就是说在进行异常检测时,前面的p(x)的学习是用的无监督,后面的参数ε学习是用的有监督。那么为什么不全部使用普通有监督的方法来学习呢(即把它看做是一个普通的二分类问题)?主要是因为在异常检测中,异常的样本数量非常少而正常样本数量非常多,因此不足以学习到好的异常行为模型的参数,因为后面新来的异常样本可能完全是与训练样本中的模式不同。

另外,上面是将特征的每一维看成是相互独立的高斯分布,其实这样的近似并不是最好的,但是它的计算量较小,因此也常被使用。更好的方法应该是将特征拟合成多维高斯分布,这时有特征之间的相关性,但随之计算量会变复杂,且样本的协方差矩阵还可能出现不可逆的情况(主要在样本数比特征数小,或者样本特征维数之间有线性关系时)。

上面的内容可以参考Ng的https://www.coursera.org/course/ml


十七、贝叶斯网络:

概率图模型之一


十八、深度学习


十九、CS视角的PCA,ICA


二十、各种距离函数

各种“距离”的应用场景简单概括为,空间:欧氏距离,路径:曼哈顿距离,国际象棋国王:切比雪夫距离,以上三种的统一形式:闵可夫斯基距离,加权:标准化欧氏距离,排除量纲和依存:马氏距离,向量差距:夹角余弦,编码差别:汉明距离,集合近似度:杰卡德类似系数与距离,相关:相关系数与相关距离。

0 0
原创粉丝点击