Stanford Machine Learning 公开课学习总结

关键词:机器学习,Stanford,Andrew Ng
作者:BIce 创建时间:2012-04-04 00:22:03

 

         最开始的时候知道这个公开课是Vivi姐推荐的,当时只记下了地址,没有深入的去看。后来因为觉得应该认真学下机器学习,就准备买本机器学习的书看,然后再去学这个课程。经同学推荐买到了《集体智慧编程》这本好书,此书作为最近的一本关于机器学习的入门书,无论是在覆盖范围上还是内容的趣味性上都非常好,而且作者在每个章节都给出了具体的代码,可供读者学习和修改,关于这本书,我之前在一篇博客中总结过,在此就不再多说,但是强烈推荐。

         后来看完了集体智慧编程之后,对机器学习产生了很大的兴趣,遂在开学后找时间继续学习,开始上这个本文要说的Stanford机器学习公开课。Stanford机器学习公开课是由Andrew Ng教授进行讲授的,此公开课的视频可以在网易上找到,地址:http://v.163.com/special/opencourse/machinelearning.html,这组视频是和普通的公开课一样,由上课时录播。但是我所学的不是这组视频,Andrew Ng教授还自己搭建了一个很好的机器学习网络公开课的网站:http://www.ml-class.org ,上面有一共18节公开课的视频,上完每次课之后还可以去做练习题,对应的,还有8个编程的大作业,课程比较紧凑,但是相对于网易公开课里的视频内容来比,相对于要少些,可能是为了照顾大众吧。另外Andrew Ng教授为参加这个课程、完成了所有作业、且分数平均在80分以上的学生提供一份电子版的课程认证哦,很诱人吧,不过只能在开课的时间参与才行,最近一次结课是去年11月份,新的课程还没有开始,所以想得到认证的同学也可以关注一下网站哦,目前全球已经有1w+网络学生得到认证啦~大家也不能落后吧~。(PS:本人一样因为不在开课时间学习,虽然可以完成作业和所有要求,但是目前是无法获得认证的orz,只能等开课时再说)

         好吧,废话少说,开始对这个课程进行小小的总结,准备学的同学可以了解下课程先。

一、课程内容梗概

         和《集体智慧编程》一书不同,Stanford ML Class没有采用一种比较通俗的表述方式,Andrew Ng教授采用了一种相对数学化,但是依然很好理解的方式来阐述整个机器学习课程。

         下面首先总结下课程的大致内容:

1.1课程内容介绍

1.1.1 Supervised Learning

         关于监督型学习方法,本课程涉及到的有Linear RegressionLogistic RegressionNeural NetworkSVMs

1.1.2 UnSupervised Learning

         非监督型方法中,本课程教授了K-means Clustering Principal Component AnalysisAnomaly Detection

1.1.3 Special Application /Topic

         在本课程中,除基本课程中的应用外,还提及了几种应用:

1) Recommender System(推荐系统)

2) Photo OCR(图片中的文字识别)

另外提到的主题有:

1) Large Scale Machine Learning(在大数据量下的机器学习)

2) Advice on building a machine learning system(一些机器学习系统设计的建议)

3) Bias/Variance(应对overfitunderfit的方法,Learning Curves学习曲线等)

4) Regularization(一种处理overfitunderfit的具体办法)

5) Evalution of Learning Algorithm(如何评判算法效率:F1 ScoreCross Validation

6) Ceiling analysis(找到机器学习系统的瓶颈的方法)

1.2 课程脉络描述

纵观整个课程,Andrew Ng教授对机器学习的表述是非常统一的,所以在课程的学习上,虽然是不同的方法,却有很多类似的地方。下面大致描述一下课程对机器学习算法的描述方法:

1. 所有的课程中提到的机器学习算法或工具,无论监督方法和非监督方法,都可以表述为一种对于模型参数进行优化求解的过程(Optimization,也就是说,把所有的方法过程都看成是优化问题。(无论是SVMNeural NetworkLinear Regression K-mean Clustering等等。)

2. 这种表示方法有三个要素(也是Optimization的要素),分别是:

a) h(params,x)函数hypothesis,对于所有的监督方法,对于给定输入样本x,计算出输出y的方法。

b) J(params,x,y)函数cost function,由优化算法所使用,给出对于样本x,计算cost值的方法。

c) grad(params,x,y)函数:由优化算法所使用,给出参数修正值的计算方法,为了简便起见,在本课程中,一直使用Gradient Descent(也就是对每个参数进行求偏导,然后使用偏导值进行参数修改的方法)。

 

其中上述表示方式中的参数params即是我们的模型所需要的参数,也就是我们所要优化求解的对象。(模型参数params像是Linear RegressionTheta Neural NetworkWeighted Matrix

3. 课程对提到的所有算法进行阐述的时候,都采用上述的三要素进行表示,但是虽然这些模型都有这些要素,每个模型的三要素与其他模型的差别还是非常大的。

另外,为了描述计算方便,本课程的所有代码均为MatlabOctave,所有的练习也都由MatlabOctave完成。

下面开始对课程进行总结。

二、课程内容总结

         下面根据www.ml-class.org 网站上video课程的顺序来依次进行简单的总结。

2.1 线性回归:Linear Regression

         线性回归Linear RegressionRegression最简单的一种,为什么叫线性呢,因为在上面提到的三要素中,它的h(x)函数是线性的(说白了,最简单的情况就是在一个2D的图上有一些点,线性回归就是找到一条直线可以对这些点进行拟合,使总体的距离误差最少)。它的典型应用是根据房屋的大小和卧室数目对房价进行预测

         它的输入为Xy两个矩阵,其中

         Xm*n的矩阵,为m个样本,n个特征,每行代表一个样本房屋的所有特征。

         Ym*1的向量,每行代表一个样本房屋的实际售价。

2.1.1 Linear Regression的模型要素

Cost Function JHypothesis H

         本例中只有一个特征x1,所以在计算H的时候公式只有两项,当特征向量Xn*1时,H就有n+1项。(为了加强模型准确度,需要加入一个常数项,这样就需要在在特征X中加入一个x0=1,并且Theta中加入一个Theta(0)才能完成,所以在实际进行计算的时候Xn+1*1向量,比特征数多1,而参数Theta也比特征数多1

 

Gradient Descent

         上面就是进行模型参数修改的公式,需要注意的是,在一次迭代中,必须在所有的Theta(j)都已经完成计算了之后,在能一次性修改所有的Theta,不可以一个一个对Theta(j)进行修改。上面式中:Theta(j)减去的部分就是我们要计算的Gradient Descent

         另外我们需要注意的是在计算Grad的时候,有一个参数alpha,此参数可以进行手动设定如0.01,但实际使用的时候我们一般不进行手动书写优化算法的循环,而是使用Matlabfminunc函数,此参数alpha则不用我们进行设置,算法会自动选取。

2.1.2 Feature Normalization

         由于我们选取的特征的值域很可能是不同的,比如房子的面积可以是100-200平方米,而房子的卧室数也就在2-5之间,这些值域不同的特征在依据上面公式计算Hypothesis的时候,不同的特征的权重是不一样的,房子的面积这个特征就对Hypothesis的影响很大,有可能卧室数的变化根本对Hypothesis的影响不大,这样是不对的,为了防止这种情况的发生,我们要使用一种叫Feature Normalization的计算,对特征值进行二次计算,将其值域调整为比较小的固定区间。

         具体的做法为:对于输入矩阵Xm*nm个样本,n个特征),计算每个FeatureX(:,j)是个列向量哦)的平均值mean(),然后计算每个Feature的标准差std(),最后对此列特征的所有值执行操作:

X(:,j)=(X(:,j)-mean())/std();

即得到了新的特征值。得到特征值之后,我们就可以带入之前的公式计算JHGrad,调用优化算法对Theta进行求解了。不过要注意的是,在进行预测的时候,也需要对输入数据进行如上的变换,之后才可以带入H中进行输出值Hypothesis计算。

2.1.3 Normal Equations:正规方程组

         上面说了那么多,其实这个Linear Regression不用优化算法也可以直接进行求解,经过数学推导之后,Linear RegressionTheta可以直接表示为:

         我们可以直接根据输入矩阵Xy进行Theta的计算,直接就得到了我们Linear Regression的模型参数,就直接可以执行预测了。(PS:这种算法还不用对Feature进行缩放处理,很强大,不过此方法只在线性回归中有效,有一定局限性)

2.2 Logistic Regression

         Logistic Regression是对Linear Regression的一种改进,主要的做法是将线性的Linear Regression中的Hypothesis函数使用一个sigmoid函数g进行作用,将Hypothesis函数转换为非线性的。

         Logistic Regression将线性的Linear Regression改进为可以处理非线性Decision Boundary的算法,并且用Logistic Regression实现了一个分类器。另外课程中分类器是做Binary分类的,类别只有两个{01}。(也可以扩展到多个类分类的情况,这样需要对每个类建立一个模型,计算Theta,输入样本是自己类的为1,否则为0,对于预测结果来说,哪个Hypothesis的输出大,就识别为某个类,这样就可以解决多类分类的问题了

2.2.1 Logistic Regression模型要素

Hypothesis函数:

         其中函数g是一个S型函数,形状大致是:

x趋近负无穷的时候,g值趋近0,在x趋近正无穷的时候,g值趋近1

Cost Function 函数JGradient

         同样要注意的是,计算Grad的时候,需要用上一次迭代的Theta进行计算,全都计算完毕后,才可以用GradTheta进行统一的修改。

2.2.2 使用Matlab的优化函数对参数进行求解

  在课程中我们可以使用Matlab函数fminunc来进行优化算法的计算,而不用自己书写Iterator loop ,仅需要给出计算Cost Grad的函数即可。

         使用Matlab的计算代码如下:其中costFunction函数返回每次循环的CostGrad值。

         上述代码就完成了对Cost Function的优化计算,求得了模型参数Theta,我们可以使用Theta直接对未知数据进行分类预测

2.2.3 预测分类

在求到了Theta后,我们通过使用Hypothesis函数进行计算,来进行对未知数据的分类。当H值大于某个值a---可以是0.5,我们就预测分类为1,否则就分类为0

这个值a,可以我们手动给出,可以使用Cross Validation的方式进行自动选取,具体方式在后面会进行说明。(大致为给出a的一系列可能值,比如从0.11,然后分别计算Cross Validation 选择Error最小的作为实际使用a

2.3 Regularization

         在我们使用了机器学习算法对分类器进行实现之后(任何算法,可以是Logistic Regression或者Neural Network等),都可能出现overfitting(过拟合)或者underfitting(未拟合)的问题。为了解决overfitting(主要)和underfitting的问题,我们可以采用一种叫做Regularization的方法。

         在应对Overfitting的时候,我们可以选择减少特征个数或者是使用Regularization。其中使用Regularization的优点是不用减少特征个数,且在特征数比较多的时候很使用。其思想就是在计算CostGrad的时候,使用模型参数Theta来对其进行修正。修改后的CostGrad公式如下。

2.3.1 Logistic Regression with Regularization

         Regularization方法适用在很多模型上,但是在不同的模型上的公式修改不同。在Logistic Regression上,使用了RegularizationCostGrad计算公式修改为如下:

Cost Function

         要注意的是,在计算Regularization部分的时候,不要计算用于修正模型的Theta(1)Matlab中索引从1开始),计算Theta(2:n+1)即可。

         另外,在计算Regularization部分的时候,有一个参数lambda,是Regularization的参数,lambda很大的时候,会出现underfitting的情况,lambda很小的时候,会出现overfitting的情况,关于lambda的选取,可以使用手动设定或者是自动选择的方法,在下面介绍。

Gradient Decent

         通样,在计算Grad的时候,也不要对Theta(1)进行计算,在Matlab中可以通过获取一个临时ThetaTemp,并将其ThetaTemp(1)=0,来进行计算,简化逻辑。

2.3.2 自动选择Regularization参数lambda

         lambda的自动选择算法可以描述为如下几步:

1. 给出可能的lambda选值(每个建议为*3的关系),如[0.001 ; 0.003 ; 0.01 ; 0.03 ; 0.1 ;0.3 ; 1 ; 3 ;10 ;30 ;100]

2. 分别使用上述可选的lambda对模型进行计算,求得Theta

3. 使用ThetaTest集上进行计算,求得误差和Error

4. 比较Error,选择使得Error最小的lambda的实际使用的lambda

(其他模型中参数的选择也类似的方法)。

2.4 Neural Network

         Neural Network可以算得上是机器学习或是人工智能领域最常用,也比较经典的算法了,在这里不在赘述Neural Network的实现方式,仅仅给出模型描述和具体的实现方式。在课程中,Andrew Ng教授给处了一种用Neural Network模拟逻辑操作(与或门)等的方式,并且实现了一个使用3层的Neural Network进行手写数字识别的工具。

         和其他提到的模型一样,如Logistic RegressionNeural Network一样有自己的模型元素和模型参数,不同的是它的参数是权重矩阵Weighted Matrix

2.4.1 Neural Network模型要素

         对于一个3层的Neural Network分类器来讲,Input layer的节点数应该就是Feature的个数feature_numhidden layer的节点数可以随意指定,假设为hidder_layer_sizeoutput layer的节点数则是具体的分类的个数classes_num。图示如下:

         我们注意到在实际的Neural Network中,Input LayerHidden Layer都多了一个只输出1的节点,用于对模型进行调整,所以在实际的使用中,Input LayerHidden Layer个数各子加1

         图中的Theta1Theta2即为Neural Network的模型参数Weighted Matrix,它们的维度随着Input LayerHidden Layer1也要修改。

         Hypothesis函数:

         在上图中,其中output layer的输出a3,即为我们的Hypothesis,它的计算方法是一次forward propagation的过程,注意每层的输入到输出过程中使用了sigmoid函数g,它的定义和Logistic Regression中一致。

         使用RegularizationCost Function函数:

         需要注意的是,在计算Regularization部分的时候,要忽略Input LayerHidden Layer中只输出1的调整节点的参数Theta

         Grad函数计算:Neural NetworkGrad计算方式很特别,在下面给出具体步骤。

2.4.2 Neural Network Back propagation

         注意到在上面的模型元素中,我们没有提到Grad的计算方法,这是因为Neural NetworkGrad计算方法比较特别,需要用到back propagation技术,在这里单独描述。

         Back propagation的具体想法大致为:从Output Layer的输出开始与实际输出y进行Error计算,将此Error沿着Neural Network反向计算,一直到Input Layer输出,计算对Weighted Matrix Theta1 Theta2Grad修正值。

         对于一个3Neural NetworkBack propagation大致算法如下:

         在实现上述算法的时候,我们需要写一个for i=1: size(X,1)的循环,对每个样本循环计算,

在循环中进行一次forward propagation,得出每层的输出,然后根据步骤2-4进行delta_1delta_2的统计。循环外部计算Grad_1Grad_2。大致代码如下:

         以上算法是计算不带RegularizationGradient Decent,带Regularization的需要将上述求得的Theta1_gradTheta2_grad加上Regularization部分。

         Grad使用Regularization的公式如下:

         需要注意的是,在计算Regularization的时候,我们对调整节点(Bias Node)的相关Theta值不能处理。

2.4.3 Gradient Checking---验证Gradient Descent计算是否正确的方式

         有时候我们需要确定我们的Gradient Descent是否计算的正确(尤其像Neural Network这种需要很大计算,并且很容易出错的算法),Gradient Checking就是一种计算Gradient Descent的辅助验证手法。

         因为Gradient Descent是一种计算Cost Function对于每个模型参数的偏导的方式,那我们就可以用简单的数学上知识对此进行验证,Gradient Checking就是这个想法。具体步骤如下:

         上面的计算公司给出了我们一种模拟计算偏导的好方法,通过对小数据量上的数据进行Gradient Checking,我们就可以验证Gradient Descent的正确性。(由Gradient CheckingGradient Descent对于Gradient的计算结果进行比较,他们的误差应该非常小。)这种方法不仅适合Neural Network,也适合很多其他的算法,当你对你计算Gradient Descent的代码不够自信(自信其实算一下也没错)的时候,就是用它来Checking吧。

2.5 Cross Validation & Bias/Variance

2.5.1 Cross Validation

Cross Validation,中文称作交叉验证,是一种很好的对算法进行验证的方法,它可以适用于任何监督类学习算法。

Cross Validation的思想很简单,大致为以下几步:

1. 训练集Training set划分为两个部分Cross-Validation setTraining set_use

2. 使用Training set_use来进行算法的训练,计算得到的模型在Training set_use上的误差数据J_train

3. 使用训练的结果对Cross-Validation set上的数据进行计算Hypothesis,计算模型在Cross-Validation set上的误差数据J_cv

4. 根据Cross-Validation set上的模型表现J_cv判定算法效率。

2.5.2 Learning Curves, Bias & Variance

         我们计算通过调整训练集的大小(从1m)来计算J_trainJ_cv两个数据,这样,我们就得到了一个关于训练集大小和J_train/J_cv的学习曲线(Learning Curves)。它可以帮助我们更好的确定数据集的大小,以及确定当前算法的表现情况。

         High BiasunderfittingLearning Curves中的J_trainJ_cv数据都很高,两者曲线最后距离变很靠近。

         解决办法:获取更多的特征;使用多项式特征(Feature Mapping,引入特征的幂作为新特征);如果是Logistic Regression的话减少lambda

         High VarianceoverfittingLearning Curves中的J_train值很低,J_cv数据很高,二者有明显的差距。

解决办法:选择更多的训练集;选择更少的特征;如果是Logistic Regression则增加lambda

2.6 Error Metrics ---如何度量Skewed Classes的错误

         使用机器学习的时候,我们需要一个评价得到的模型效率的的方式,使用准确率来讲,一般的情况就可以了,不过应对一些特殊问题的时候,比如说小概率事件的预测上,癌症预测:平均发送比例非常小(5/1000),这种情况叫做Skewed Classes

Skewed Classes问题中就算我们的算法一直预测0(正常),对于现实的样本也可能得到非常高的准确率,但是这明显是不对的,所以我们需要其他的评价方式。

         下面介绍一些新的概念。

2.6.1 Precision & Recall

如上图,左边是一个2*2的矩阵,其中每个元素为实际模型在Test集上的表现数据,其中

True Positive为预测为1,实际也是1的次数

False Positive为预测为1,实际为0的次数

False Negative为预测为0,实际为1的次数

True Negative为预测为0,实际也为0的次数

我们又引入两个概念PrecisionRecall,其中Precision=tp/(tp+fp)Recall=tp/(tp+fn)

它们的具体计算方法如下:

2.6.2 F1 Score

         为了计算Error Metrics for Skewed Classes,最终我们需要计算的值称为F1 Score,它的计算公式为:

         我们最终使用F1 Score来评价不同的算法效率,对于F1 Score的值最高的算法,效率最高。(根据公式可见,F1 Score高的算法的PrecisionRecall的值都比较高才行)

         另外,F1 Score的评价方法不仅局限于Skewed Classes,还可以应用于任何其他类型的算法比较

2.7 SVM

         Support Vector Machine,支持向量机,现在应用很广的非常好用的机器学习算法,关于此算法已有了比较成型的工具支持,如LIBSVM,使用也非常好用,在这里仅仅简单介绍SVM的一些概念。本课程中给出了一个利用SVM进行垃圾邮件分类的工具。(关于SVM的具体理论很复杂,不进行讨论,只要知道如何使用就好

2.7.1 SVM模型要素

Cost Function Hypothesis

         由上公式可见,SVM模型中有一个参数C,这个参数的大小是很重要的,它和1/lambda的概念差不多,如果C取得比较大,则SVM 训练到的Decision Boundary对于训练集数据敏感,如果C取得比较小,则Decision Boundary对训练集的噪声比较不重视。

2.7.2 Kernels核函数

         在处理非线性的Decision boundary的时候,SVM通常要将特征空间扩展到高维空间上,而Kernel函数的主要工作是用于代替高维向量的点积运算,这样甚至我们就不用真的执行高维空间映射就可以完成高维空间的效果。有几种常用的Kernel函数,课程中使用的Kernel函数是Gaussian Kernel。它的定义如下:

        

其中xixj为两个特征空间的向量。

2.7.3 SVM的使用

         SVM的使用是比较简单的,一般我们只要给出样本集Xy,要使用的kernel 函数,以及参数C,即可。关于更多的使用,课程建议我们使用已有的SVM工具集LIBSVM

         另外,关于多类分类的SVM使用,假设有K个分类,则我们可以训练KSVMs,对每一组输入数据,进行KSVMHypothesis计算,取其中比较大的为最后的分类。

2.8 Supervised Learning 算法的比较

         目前我们学到的Supervised Learning算法有Logistic Regression Neural NetworkSVM

         假设输入样本集为m个,特征为n个,我们来分情况讨论上述算法的适用情况。

1. nm大很多:使用Logistic Regression或者Linear KernelSVM比较好。

2. n比较小,m数量级适中:使用Gaussian KernelSVM比较好

3. n比较小,m很大的情况:尝试提取更多的特征,使用Logistic Regression或者使用Linear KernelSVM比较好。

4. 在上述所有情况,Neural Network都可以有很好的表现,但是训练的时间要很长。

 

2.9 ClusteringK-means

         Clustering聚类,课程涉及到的第一个非监督算法。用来找到结构或者模式,可以用于社交网络分析、市场分析、优化计算集群、天文数据分析等个个方面。

经典Clustering 算法:K-means。在Programming exercises中,给出了一个图片压缩的应用。(图片中保存的颜色为RGB,每个8位,我们实际可以使用16个颜色来代替其他所有的颜色,针对所有像素点的RGB值,作为一个3D的特征,使用K=16K-means方法,将所有的RGB值聚类为16类,然后用这每个RGB值的从属类RGB值代替原RGB,即完成了图像压缩,每个像素只用4位(2^4=16

和监督算法不同,非监督算法中没有Hypothesis函数,只有Cost Function,也有Grad的形式。

2.9.1 K-means算法

K-means算法的Cost Function如下:

         由上公式我们可以看到,K-means算法的模型参数有两组,一组是m个样本的所属分类情况C,另一组是K个聚类的中心点左边U。通过优化Cost Function J,我们想得到这两组值。

K-means算法的过程如下:

         如上所示,算法循环中对CU的修正,即为minimize Cost Function J的过程。

2.9.2 K-means的初始值UC

         K-means算法的Cost Function J可能有局部最小值,这样就无法避免K-means算法可能会得到一个局部最小值而无法得到全局最小值。

解决的办法大致有二:

1) 随机赋值初始值UC,并执行K-means算法,记录最后的Cost值,循环上述过程N次,取其中Cost最小的UC作为最后的全局最小值。

2) 使用模拟退火法,修改K-means算法循环过程,加入模拟退火,防止进入局部最小值(详见《集体智慧编程》)。

2.10 Principal Component Analysis

         PCA算法在机器学习的主要作用即为:对数据的降维。Programming exercises中给出的例子是对人脸图片进行压缩。它可以用于我们在机器学习训练时对训练集降维,进而加快我们的训练速度等等,也可以完成数据的可视化。(n维数据降维成3维)

PCA算法解决的主要问题是:如何在尽量保持数据完整性情况下将n维数据降到k维(n>k)。它的想法大概是这样:找到一个K维的超平面,它可以拟合大部分的数据集中的n维点,然后将数据集中的n维点都投影(projection)到这个K维的超平面上,即完成了数据的压缩。

需要注意的是对于PCA算法,所有的输入数据必须进行Normalization,否则会出错。

PCA算法的步骤和过程是固定的,下面简单进行描述。

2.10.1 PCA Algorithm

         PCA算法主要需要计算两个值:一是数据的covariance matrix,二是计算principal components

1. 计算covariance matrix :对于数据集X,计算covariance matrix的公式如下:

2. 计算principal components:使用matlabsvd函数计算如下:

                  

其中Sigma即为上面计算出的covariance matrix

3. 对数据X进行降维到K得到数据集Z:(Xm*nZm*k

U_reduce=U(:,1:K);

Z=X*U_reduce;

4. 对数据Z进行还原得到X_approx

X_approx=Z*U_reduce’;

2.10.2 PCACost Function

        

         上式的左边即为PCA算法的Cost Function,代表经压缩的数据相对于原数据的信息丢失程度。上式在我们进行K的选择的时候比较有用(比如要将数据降维,但又要保持数据完整性)可以自动选择一个满足上式的还比较小的K,满足上式代表着经过PCA算法的处理后,数据的信息量丢失不超过1%

2.11 Anomaly Detection

         异常检测,用于检测异常的情况,如检测用户异常动作或者系统行为等等。在Programming Exercises中,课程给出了一个根据吞吐量和延时检测服务器异常的用例

         在异常检测中,所有的输入训练集都是正常的训练集,没有异常情况的样例。

         课程使用了Gaussian ModelAnomaly Detection,它的思想比较简单,把所有的特征Feature都假定其满足Gaussian的分布。

         Gaussian Distribution如下:

         我们看到Gaussian Distribution有两个参数,我们需要将样本中的每个特征看为一组训练数据,来求得每个特征的Gaussian分布参数。计算公式:

2.11.1 Anomaly Detection Algorithm

由上可见,算法在计算玩每个FeatureGaussian分布后,对每个后来的新数据X,都要计算p(x),公式如上,如果p(x)小于特定值则判定为异常。此值可以用自动选择的方式进行计算(上面讨论过:使用CVF1对不同值的算法进行评价,取最好的)。

2.11.2 More about Anomaly Detection

         Anomaly DetectionSupervised算法是不同的,anomaly的种类有非常多,它不能像Supervised算法一样根据之前的anomaly学习,对后来的数据进行预测,因为后来的anomaly可能和之前的是完全没有相似性的。

         另外,在例子中我们使用的是Gaussian Model,那么在实际的使用中很可能Feature是不满足Gaussian分布的,在这种情况下我们可以对特征进行某种变换(某种数学计算),来使它满足Gaussian分布即可,可自己尝试对特征进行变换的方法。

2.12 Recommender System

         Recommender System推荐系统,课程以一个对电影进行评分的应用展示了推荐系统的设计方法。

2.12.1 Content-based recommendation

         输入共有nm个电影,nu个用户。输入矩阵Xnm*nu,其中每行是一个电影的所有用户的评分,(从15,没填即为?),而R矩阵也是nm*nu的,R(i,j)=1代表用户j对电影i进行了评分。

         假设每个电影都有n个特征,特征值由我们自行给每个电影填上(如romantic,action)。

对于每个用户j,计算他相对与特征的Thetaj,计算采用优化算法,其中要素如下:

Cost FunctionGradient Descent

在优化求得了Theta_1Theta_nu之后,我们就可以使用Hypothesis函数来对用户j对未评价的电影i进行评分。Hypothesis如下:

2.12.2 Collaborative filtering learning algorithm

         协同过滤算法,和基于内容的推荐不同,对于Collaborative filtering算法,电影的特征值是不知道的,对于模型来说,参数就换成了:X_1X_nmTheta_1Theta_nu。它的Cost Function如下:

而它的Grad修改为:

         我们要计算两个Grad矩阵:X_gradnm*nTheta_gradnu*n

         Collaborative filteringHypothesis函数还是一样,对于h(i,j)=Theta_j’*X(i,:)

         这样,Cost FunctionGradient Descent以及Hypothesis都有了,我们就可以使用优化算法对Theta_1Theta_nuX_1X_nm进行计算。得到这些值之后,我们就可以这些值使用Hypothesis(i,j)进行对于用户j对于电影i的评分进行预测了。

2.13 Large Scale Machine Learning

         在这个议题里,我们主要讨论了对于数据量比较大的情况下,如何有效地使用机器学习算法。

2.13.1 对于Logistic Regression算法

         Logistic Regression算法中的Grad中每个元素的计算每次都要遍历所有的输入,这样在数据样本比较大时是非常耗时的,这时我们就可以使用随机梯度下降算法(Stochastic Gradient Descent)或者Mini-batch Gradient Descent算法。

         Stochastic Gradient Descent算法如下:

         由上图可见,在每次循环计算Theta(j)的时候,算法不再像原始的Batch Gradient Descent一样需要计算所有的数据,只有了一条数据。减少了计算量。(当然这样求得的Gradient Descent就不是真正意义上的偏导数了,其Cost Function可能会有上升的情况,不过没问题,经过迭代是可以收敛的)

         Mini-batch Gradient Descent算法和Batch Gradient Descent算法(一次计算需要所有值的计算)与Stochastic Gradient Descent算法(一次计算只用一个值的计算)都不同,它每次计算使用b=mini-batch size个元素进行计算,是上述两种的中间算法,Gradient Descent的计算方式修改为:

        

2.13.2 Online Learning

         在线学习,主要的思想是根据用户的新输入实时的对模型参数进行持续的在线修改,完成持续性的学习。另外的一种方式是将之前训练的结果加以保存,这样可以在下次运行时继续持续的学习。增加了允许学习的时间。

2.13.3 Map Reduce and Data parallelism

         使用如Map Reduce等分布式计算的工具也是一种加速我们学习的算法,可以通过将学习中的计算任务分布到不同的机器或节点上的方式来进行并行化。

2.14 Ceiling analysis

         上限分析,一种可以让我们找到我们机器学习系统瓶颈的工具。一个完整的机器学习系统由很多部分组成,在整体系统的表现不好的时候,我们需要确定到底是那个子系统出了问题,我们需要集中经历解决哪个系统的问题。这时就可以使用Ceiling analysis

Ceiling analysis的思想也很简单,它通过用人工替换的方式,记录在系统各部分依次换成人工执行的时候,整个系统的表现,在某个部分换成人工之后,系统性能有很明显的提升,这就说明这个部分的表现决定了我们系统的表现,目前是系统的瓶颈,是我们应该集中精力改善的部分。

课程以OCR(图片文字识别)为例给出了进行Ceiling analysis的方法。

         如图为OCR系统进行Ceiling analysis的一个例子:

         根据图片所示,我们系统目前的瓶颈在于Text detection部分,对Text detection部分进行改进最有效。

三、结语

         最后,我觉得从这门课程学到了很多,非常感想Andrew Ng教授的讲解,另外课程的Review QuestionsProgramming Exercises都非常不错,有很好的辅助教学的效果(另外感想Andrew Ng教授ML的时候也教我学习Matlab ^ _^),最后,继续努力!

    PS:最后放一张Machine Learning 官网的图,以表感谢~

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)