机器学习

1,机器学习算法:

1.1 监督学习:我们教计算机如何做事情

             监督学习是指:我们给算法一个数据集,并且给定正确答案;数据集中的每个样本都有相应的正确答案,再根据这些样本作出预测;即监督学习中的样本不是都相同的,每个样本都有自己的标签。

             回归问题:预测连续的输出值;回归一词是指这样的事实,我们预测一个真正的值输出

             线性回归:

             分类问题:预测一个离散的输出值

1.2 非监督学习:我们让计算机自已学习

             非监督学习是指:没有标签这一概念,所有的数据都是一样的,故无监督学习中,只有一个数据集

             聚类问题:将数据分成几个不同的聚类


2 代价函数

2.1 平方误差代价函数

                                   J(\Theta 0,\Theta 1 )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{i}))-y^{i})^2

2.2 最小化代价函数

2.2.1 梯度下降法

构想:a:开始时对代价函数的参数进行一些初步猜测,即赋值,通常选择 \theta _0=\theta _1=0

           b:不断的改变参数,使代价函数一直减小,直到找到J的最小值或者是局部最小值

梯度下降算法公式

            

             其中 α 是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。正确的更新参数的过程如下

            

        注意:此处求导的目的是使更新的参数肯定会使代价函数变小,原因如下图所示:   图中曲线为代价函数J随着参数\theta_1的变化而变化的情况。求导的目的,基本上可以说取下图这个红点的切线,就是这样一条红色的直线,刚好与函数相切于这一点,让我们看看这条红色直线的斜率,就是这条刚好与函数曲线相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条线有一个正斜率,因此,我得到的新的 θ1,θ1 更新后等于 θ1 减去一个正数乘以 α【而学习率一定是不等于0的正数】,故新的θ1一定比更新前小,由下图知,红点附近函数单调递增,而自变量θ1 减小的话一定会导致因变量J变小,即代价函                                                                           

           让我们来看看如果 α 太小或 α 太大会出现什么情况:

            如果 α 太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果 α 太小的话,可能会很慢因为它会一点点挪动,它会需要很多步才能到达全局最低点。

        如果 α 太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果 α 太大,它会导致无法收敛,甚至发散。

        如果我们预先把 θ1放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?假设你将 θ1初始化在局部最低点,在这儿,它已经在一个局部的最优处或局部最低点。结果是局部最优点的导数将等于零,因为它是那条切线的斜率。这意味着你已经在局部最优
点,它使得 θ1不再改变,也就是新的 θ1等于原来的 θ1,因此,如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这也解释了为什么即使学习速率 α 保持不变时,梯度下降也可以收敛到局部最低点

       在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,这是因为当我们接近局部最低点时,很显然在局部最低时导数等于零,所以当我们接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法。所以实际上没有必要再另外减小 α。注意:此处的幅度就是倒数,即和学习率相乘的那一部分。

2.2.2 梯度下降的单变量线性回归

       A:梯度下降算法和线性回归模型比较如图

     

   B  对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:

                 

               

              

结合梯度下降算法和线性回归模型,得到新的算法如下

             

           我们刚刚使用的算法,有时也称为批量梯度下降。实际上,在机器学习中,通常不太会给算法起名字,但这个名字”批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有 m 个训练样本求和。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一"批"训练样本,而事实上,有时也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。

3 多变量线性回归

3.1 多维特征

            n 代表特征的数量;

           X^{(i)}代表第 i 个训练实例,是特征矩阵中的第 i 行,是一个向量(vector)。比方说,

                                

            X_{j}^{(i)}  代表特征矩阵中第 i 行的第 j 个特征,也就是第 i 个训练实例的第 j 个特征

            支持多变量的假设 h 表示为: h_\theta (x)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n

            上面这个公式中有 n+1 个参数和 n 个变量,为了使得公式能够简化一些,引入 x0=1,此时模型中的参数是一个 n+1 维的向量,任何一个训练实例也都是 n+1 维的向量,特征矩阵 X 的维度是 m*(n+1)。 因此公式可以简化为:h_\theta(x)=\theta^TX,其中上标 T 代表矩阵转置

3.2 多变量梯度下降

            与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:

            

            

            我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。

           多变量线性回归的批量梯度下降算法为

                即:  

           求导数后得到:

            

            

            

             我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。


3.3 梯度下降法中的实用技巧

             在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。

3.3.1 特征缩放

            尝试将所有特征的尺度都尽量缩放到-1 到 1 之间

            最简单的方法是令:下图中sn也可为极差,即最大值减去最小值

                                            

             注意:只要使特征值的范围接近-1到1即可,例如:若范围为0-3或者-2到0.5都是比较好的,而-100到100和-0.00001到0.00000001则是不那么好的特征

            特征缩放目的:为了加速梯度下降

3.3.2 学习率

         检测梯度下降算法是否正确执行的方法是算法执行时绘制损失函数关于迭代次数的曲线图,若单调下降则正常工作;同时可以看到当迭代次数达到一定数值时,代价函数基本不再减小,则说明收敛。当代价函数随着迭代次数的增加变得越来越大时,证明其发散,即学习率过大,多次越过极值点,解决方法是减小学习率。当出现w型曲线,即先将后升再降再升如此循环时证明学习率还是过大【但是没有第一种大的厉害】,解决方法也是减小学习率。

         梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。

        梯度下降算法的每次迭代受到学习率的影响,如果学习率 α 过小,则达到收敛所需的迭代次数会非常高;如果学习率 α 过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。

         通常可以考虑尝试些学习率:α=0.01,0.03,0.1,0.3,1,3,10

3.4 特征和多项式回归

        线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:

            

       通常我们需要先观察数据然后再决定准备尝试怎样的模型。

       另外,我们可以如下,从而将模型转化为线性回归模型。

              

       根据函数图形特性,我们还可以使

             

          如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。

3.5 正规方程(标准方程法)

           到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案

            正规方程是通过求解下面的方程来找出使得代价函数最小的参数的

                                               

             假设我们的训练集特征矩阵为 X(包含了 x0=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量

                                            

             具体证明见https://blog.csdn.net/zhangbaodan1/article/details/81013056

            不规范证明如下:

            step0:首先明确X· θ = Y,其中x为这样的矩阵:每行代表一个样本,而θ表示列向量,如果我们直接这样求:\theta =X^{-1}y,则会出现一些问题:只有方阵才会有逆矩阵,所以若想求出θ,那么我们需要做一些转换:

            step1:先把θ左边的矩阵变成一个方阵。通过乘以X转置可以实现,则有X^TX\theta=X^Ty

           step2:把θ左边的部分变成一个单位矩阵,这样就可以让它消失于无形,变换后变为\theta=(X^TX)^{-1}X^Ty

           注意:若X^TX不可逆,则表示特征向量中有冗余向量,可以适当清除线性相关的特征向量后再次使用正规方程求解

 3.6 梯度下降与正规方程的比较:

             参考https://blog.csdn.net/qq_39521554/article/details/80453521

           

        总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数 θ 的替代方法。具体地说,只要特征变量数量小于一万,我通常使用标准方程法,而不使用梯度下降法。随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到, 实际上对于那些算法,并不能使用标准方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。


4 逻辑回归

4.1 分类问题

       逻辑回归是一种非线性回归。逻辑回归的输出在【0,1】之间。逻辑回归是一种分类算法。逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 y 取值离散的情况,如:1 0 0 1

       线性回归对于分类问题不是一个好的算法。线性回归的输出可能离1和0很远。

       我们从二元的分类问题开始讨论。我们将因变量(dependant variable)可能属于的两个类分别称为负向类(negative class)和
正向类(positive class),则因变量y\in{0,1},其中 0 表示负向类,1 表示正向类

     普通的逻辑回归模型仅能找到线性决策边界

4.2  假说表示

        逻辑回归模型的假设是:,X 代表特征向量,g 代表逻辑函数(logistic function)是一个常用的逻辑函数为 S 形函数(Sigmoid function),

           S 形函数公式为图像如下

                                        

   

            合起来,我们得到逻辑回归模型的假设:

                                        

             h_\theta (x)的作用是,对于给定的输入变量x,根据选择的参数\theta计算输出变量=1 的可能性(estimated probablity),等价于:

                                      

            例如,如果对于给定的 x,通过已经确定的参数计算得出 hθ(x)=0.7,则表示有 70%的几率 y 为正向类,相应地 y 为负向类的几率为 1-0.7=0.3。

4.3 判定边界

           在逻辑回归中,我们预测:当 hθ大于等于 0.5 时,预测 y=1;当 hθ小于 0.5 时,预测 y=0

           根据上面绘制出的 S 形函数图像,我们知道当 z=0 时 g(z)=0.5;z>0 时 g(z)>0.5;z<0 时 g(z)<0.

          又 Z=\theta^TX,即: \theta^TX大于等于 0 时,预测 y=1;       \theta^TX小于 0 时,预测 y=0

          现在假设我们有如左下一个 模型:并且参数 θ 是向量[-3 1 1]。 则当-3+x1+x2 大于等于 0,即 x1+x2 大于等于 3 时,模型将预
测 y=1;我们可以如右下绘制直线 x1+x2=3,这条线便是我们模型的分界线,将预测为 1 的区域和预测为 0 的区域分隔开。

            

       假使我们的数据呈现如下的分布情况,怎样的模型才能适合呢?因为需要用曲线才能分隔 y=0 的区域和 y=1 的区域,则我们得到的判定边界恰好是圆点在原点且半径为 1 的圆形。

         

       我们可以用非常复杂的模型来适应非常复杂形状的判定边界。

4.4 代价函数

              本小节我们要介绍如何拟合逻辑回归模型的参数θ,具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题

                     

          对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于当我们将逻辑回归的假设带入到此代价函数中时,得到的代价函数是一个非凸函数,这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值

                      

    线性回归的代价函数为:

                             

    我们重新定义逻辑回归的代价函数为:其中:

                        

    hθ(x)与 Cost(hθ(x),y)之间的关系如下图所示

                    

         这样构建的 Cost(hθ(x),y)函数的特点是:当实际的 y=1 且 hθ也为 1 时误差为 0,当 y=1 但 hθ不为 1 时误差随着 hθ 的变小而变大;当实际的 y=0 且 hθ 也为 0 时代价为 0,当 y=0 但 hθ不为 0 时误差随着 hθ 的变大而变大

         将构建的 Cost(hθ(x),y)简化如下:

            

           将假设函数带入代价函数得到:

            

             在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:

                                  

               将代价函数J的导数项展开得:【对代价函数J的求导过程参考:https://www.cnblogs.com/zhongmiaozhimen/p/6155093.html

                                  

                虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 与线性回归中不同,所以实际上是不一样的,另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的

              一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher  goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) fminunc 是 matlab 和 octave 中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,

4.5 简化的成本函数和梯度下降

        在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛

          当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数 θ,就是 θ0 到 θn,我们需要用这个表达式来更新这些参数。我们还可以使用 for 循环来更新这些参数值,用 for i=1 to n,或者 for i=1 to n+1。当然,不用 for 循环也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些 n 个参数同时更新

          我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。

4.6 高级优化

         梯度下降的思路是:我们需要写出代码来计算 J(θ) 和这些偏导数,然后把这些插入到梯度下降中,然后它就可以为我们最小化这个函数

         对于梯度下降来说,我认为从技术上讲,你实际并不需要编写代码来计算代价函数 J(θ)。你只需要编写代码来计算导数项,但是,如果你希望代码还要能够监控这些 J(θ) 的收敛性,那么我们就需要自己编写代码来计算代价函数 J(θ)和偏导数项 。所以,在写完能
够计算这两者的代码之后,我们就可以使用梯度下降。

         然而梯度下降并不是我们可以使用的唯一算法,还有其他一些算法,更高级、更复杂。如果我们能用这些方法来计算代价函数 J(θ)和偏导数项 两个项的话,那么这些算法就是为我们优化代价函数的不同方法,共轭梯度法 BFGS (变尺度法) 和 L-BFGS (限制变尺
度法) 就是其中一些更高级的优化算法,它们需要有一种方法来计算 J(θ),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。 

          共轭梯度法 BFGS (变尺度法) 和 L-BFGS (限制变尺度法)算法有许多优点:一个是使用这其中任何一个算法,你通常不需要手动选择学习率 α,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,你可以认为算法有一个智能的内部循环,而且,事实上,他们确实有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 α,并自动选择一个好的学习速率 α,因此它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择。这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以它们往往最终收敛得远远快于梯度下降,

 

4.7 多类别分类:一对多

           二元分类问题,我们的数据看起来可能是像左下       对于一个多类分类问题,我们的数据集或许看起来像右下:

                               

          我用三种不同的符号来代表三个类别,问题就是给出三个类型的数据集,我们如何得到一个学习算法来进行分类呢?

         我们现在已经知道如何进行二元分类,可以使用逻辑回归,对于直线或许你也知道,可以将数据集一分为二为正类和负类。用一对多的分类思想,我们可以将其用在多类分类问题上

           "一对余"方法如下:                                                                                                                                                                               

          现在我们有一个训练集,好比上图表示的有三个类别,我们用三角形表示 y=1,方框表示 y=2,叉叉表示 y=3。我们下面要做的就是使用一个训练集,将其分成三个二元分类问题。

        我们先从用三角形代表的类别 1 开始,实际上我们可以创建一个,新的"伪"训练集,类型 2 和类型 3 定为负类,类型 1 设定为正类,我们创建一个新的训练集,如下图所示的那样,我们要拟合出一个合适的分类器

         为了能实现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类都标记为负向类h_\theta^{(1)}(x),这个模型记作 。接着,类似地第我们选择另一个类标记为正向类(y=2),再将其它类都标记为负向类,将这个模型记作h_\theta^{(2)}(x) ,依此类推。

        最后我们得到一系列的模型简记为:h_\theta^{(i)}(x)=p(y=i|x;\theta)

         最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。

4.8  feature mapping

         有时候数据集中我们的样本仅有2个特征项x1,x2,但是其数据分布如下,此时2个特征的一次项不能很好的区分两类样本,此时就需要特征映射技术。                   

            

      特征映射即指从每个数据点创建更多特征项。我们将特征映射到x1和x2的多个多项式项

 

5 正则化

5.1 过度拟合问题

          线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过度拟合
(over-fitting)的问题,可能会导致它们效果很差

         如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为 0),但是可能会不能推广到新的数据。

         下图是一个回归问题的例子:

          第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适

         分类问题中也存在这样的问题:

    

  

           就以多项式理解,x 的次数越高,拟合的越好,但相应的预测的能力就可能变差;过度拟合无法泛化(泛化指一个模型应用到新样本的能力),过拟合一般是由于变量过多,如果我们没有足够多的数据去约束这个变量过多的模型,那么就是过度拟合。过多的变量,但是没有足够的数据就会过拟合。

          如果我们发现了过拟合问题,应该如何处理?

       1. 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA)
       2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)

5.2 代价函数

         上面的回归问题中如果我们的模型是h_\theta(x)=\theta_0+\theta_1x^+\theta_2x^2+\theta_3x^3+\theta_4x^4        

         我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于 0 的话,我们就能很好的拟合了。

         所以我们要做的就是在一定程度上减小这些参数 θ 的值,这就是正则化的基本方法。我们决定要减少 θ3 和 θ4 的大小,我们要做的便是修改代价函数,在其中 θ3 和 θ4 设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选
择较小一些的 θ3 和 θ4。修改后的代价函数如下

         

           通过这样的代价函数选择出的 θ3和 θ4对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:

             

          其中 λ 又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对 θ0 进行惩罚。

          经过正则化处理的模型与原模型的可能对比如下图所示

                         

            如果选择的正则化参数 λ 过大,则会把所有的参数都最小化了,导致模型变成 hθ(x)=θ0,也就是上图中红色直线所示的情况,造成欠拟合。

            那为什么增加的一项\lambda =\sum_{j=1}^{n}\theta_j^2   可以使 θ 的值减小呢?因为如果我们令λ的值很大的话,为了使 Cost Function 尽可能的小,所有的 θ 的值(不包括 θ0)都会在一定程度上减小

             但若λ的值太大了,那么 θ(不包括 θ0)都会趋近于 0,这样我们所得到的只能是一条平行于 x 轴的直线。

             所以对于正则化,我们要取一个合理的λ的值,这样才能更好的应用正则化。

5.3 正则化线性回归

            正则化线性回归的代价函数为:

                

               如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对 θ0 进行正则化,所以梯度下降算法将分两种情形:

                 

              对上面的算法中 j=1,2,...,n 时的更新式子进行调整可得:

                

            可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令 θ 值减少了一个额外的值

            我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示

             

            图中的矩阵尺寸为 (n+1)*(n+1)。

            注意:X^TX在样本数对于参数较少的情况下,很可能造成其是不可逆的,即普通正规方程只能用伪逆求解。但是可以证明,当利用正则化时,正规方程求逆部分的矩阵一定是可逆的。故运用了正则化的正规方程解决了不一定能求出真正解的问题。

5.4 正则化的逻辑回归模型

         

            我们也给代价函数增加一个正则化的表达式,得到代价函数

           

             要最小化该代价函数,通过求导,得出梯度下降算法为

           

         注意:逻辑回归的梯度下降法看上去同线性回归一样,但是知道 h_\theta(x)=g(\theta^TX),所以与线性回归不同。

             1.虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的 h(x)不同所以还是有很大差别。
             2.\theta_0不参与其中的任何一个正则化。

6 神经网络:表述(Neural Networks: Representation) 

6.1 非线性假设

             无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大

             使用非线性的多项式项,能够帮助我们建立更好的分类模型。假设我们有非常多的特征,例如大于 100 个变量,我们希望用这 100 个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合 (x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),我们也会有接近 5000 个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了

            假设我们希望训练一个模型来识别视觉对象(例如识别一张图片上是否是一辆汽车),我们怎样才能这么做呢?一种方法是我们利用很多汽车的图片和很多非汽车的图片,然后利用这些图片上一个个像素的值(饱和度或亮度)来作为特征

           假使我们采用的都是 50x50 像素的小图片,并且我们将所有的像素视为特征,则会有2500 个特征,如果我们要进一步将两两特征组合构成一个多项式模型,则会有约 25002/2 个(接近 3 百万个)特征。普通的逻辑回归模型,不能有效地处理这么多的特征,这时候我们需要神经网络

6.2 神经元和大脑

            神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器

           神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在 90年代的后期应用减少了。但是最近,神经网络又东山再起了。其中一个原因是:神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。正是由于这个原因和其他一些我们后面会讨论到的技术因素,如今的神经网络对于许多应用来说是最先进的技术。当你想模拟大脑时,是指想制造出与人类大脑作用效果相同的机器。大脑可以学会去以看而不是听的方式处理图像,学会处理我们的触觉

6.3 模型表示1

          神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输入,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。我们设计出了类似于神经元的神经网络,效果如下:

           

             其中 x1,x2,x3是输入单元(input units),我们将原始数据输入给它们;a1,a2,a3是中间单元,它们负责将数据进行处理,然后呈递到下一层;最后是输出单元,它负责计算 hθ(x);

            神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个 3 层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit)

                  

            a_i^{(j)}代表第 j 层的第 i 个激活单元。 \theta^j代表从第 j 层映射到第 j+1 层时的权重的矩阵,例如 代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j+1 层的激活单元数量为行数,以第 j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中的尺寸为 3*4;对于上图所示的模型,激活单元和输出分别表达为:

               

         上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。我们可以知道:每一个 a 都是由上一层所有的 x 和每一个 x 所对应的决定的;

         我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )

          把 x, ,a 分别用矩阵表示如下,我们可以得到\theta*X=a

                   

6.4 模型表示2

          ( FORWARD PROPAGATION ) 相对与使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:

           

           

          

          这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即

           

           我们可以把 a0,a1,a2,a3看成更为高级的特征值,也就是 x0,x1,x2,x3的进化体,并且它们是由 x 与决定的,因为是梯度下降的,所以 a 是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 x 次方厉害,也能更好的预测新数据。这就是神经网络相比于逻辑回归和线性回归的优势

6.5 特征和直观理解

            从本质上讲,神经网络能够通过学习得出其自身的一系列特征。在普通的逻辑回归中,我们被限制为使用数据中的原始特征 x1,x2,...,xn,我们虽然可以使用一些二项式项来组合这些特征,但是我们仍然受到这些原始特征的限制。

             在神经网络中,原始特征只是输入层,在我们上面三层的神经网络例子中,第三层也就是输出层做出的预测利用的是第二层的特征,而非输入层中的原始特征,我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征

             神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑 AND、逻辑或 OR 

            我们可以用这样的一个神经网络表示 AND 函数:

                   

            

                  

           这就是 AND 函数  。接下来再介绍一个 OR 函数:

          

           OR 与 AND 整体一样,区别只在于\theta的取值不同

6.6  特征和直观理解2

           二元逻辑运算符(BINARY LOGICAL OPERATORS)当输入特征为布尔值(0 或 1)时,我们可以用一个单一的激活层可以作为二元逻辑运算符,为了表示不同的运算符,我们之需要选择不同的权重即可

             下图的三个神经元依次可以被视为作用等同于逻辑与或非

           

             我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。

             例如我们要实现 XNOR 功能(输入的两个值必须一样,均为 1 或均为 0),即 XNOR=(x1ANDx2)OR((NOTx1)AND(NOTx2))

首先构造一个能表达(NOTx1)AND(NOTx2)部分的神经元:

           

           然后将表示 AND 的神经元和表示(NOTx1)AND(NOTx2)的神经元以及表示 OR 的神经元进行组合:

           我们就得到了一个能实现 XNOR 运算符功能的神经网络。按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。这就是神经网络的厉害之处。

6.7多类分类

            当我们有不止两种分类时(也就是 y=1,2,3….),比如以下这种情况,该怎么办?如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有 4 个值。例如,第一个值为 1 或 0 用于预测是否是行人,第二个值用于判断是否为汽车。

         输入向量 x 有三个维度,两个中间层,输出层 4 个神经元分别用来表示 4 类,也就是每、一个数据在输出层都会出现[a b c d]T,且 a,b,c,d 中仅有一个为 1,表示当前类。下面是该神经网络的可能结构示例

         

          神经网络算法的输出结果为四种可能情形之一:

                 

7 神经网络的学习

7.1 代价函数

       首先引入一些便于稍后讨论的新标记方法:假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经
网络层数,Sl 表示每层的 neuron 个数(SL 表示输出层神经元个数),SL 代表最后一层中处理单元的个数。

        将神经网络的分类定义为两种情况:二类分类和多类分类,

       二类分类:SL=1, y=0 or 1 表示哪一类;
       K 类分类:SL=K, yi = 1 表示分到第 i 类;(K>2)

       

       我们回顾逻辑回归问题中我们的代价函数为

       

       在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 y,但是在神经网络中,我们可以有很多输出变量,我们的 hθ(x)是一个维度为 K 的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂
一些,为

      

         这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K 个预测,基本上我们可以利用循环,对每一行特征都预测 K 个不同结果,然后在利用循环
在 K 个预测中选择可能性最高的一个,将其与 y 中的实际数据进行比较

     归一化的那一项只是排除了每一层 θ0 后,每一层的 θ 矩阵的和。最里层的循环 j 循环所有的行(由 sl +1 层的激活单元数决定),循环 i 则循环所有的列,由该层(sl 层)的激活单元数所决定。即:hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行
regularization 的 bias 项处理所有参数的平方和

7.2  反向传播算法

           之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的 hθ(x),现在,为了计算代价函数的偏导数我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法

           假设我们的训练集只有一个实例(x^{(1)},y^{(1)}),我们的神经网络是一个四层的神经网络,其中 K=4,SL=4,L=4:

           前向传播算法:

                                      

              我们从最后一层的误差开始计算,误差是激活单元的预测(a^{(4)} )与实际值(y^k)之间的误差,(k=1:K)。我们用 δ 来表示误差,则:\delta ^{(4)}=a^{(4)}-y

             我们利用这个误差值来计算前一层的误差

                     

               因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设 λ=0,即我们不做任何归一化处理时有:

                           

               重要的是清楚地知道上面式子中上下标的含义:  l 代表目前所计算的是第几层;   j 代表目前计算层中的激活单元的下标,也将是下一层的第 j 个输入变量的下标。i 代表下一层中误差单元的下标,是受到权重矩阵中第 i 行影响的下一层中的误差单元的下标

            如果我们考虑归一化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用 \Delta _{ij}^{(i)}来表示这个误差矩阵。第 l 层的第 i 个激活单元受到第 j 个参数影响而导致的误差。

          我们的算法表示为:

           

       即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差

           在求出了\Delta _{ij}^{(i)} 之后,我们便可以计算代价函数的偏导数了,计算方法如下

              

         在 Octave 中,如果我们要使用 fminuc 这样的优化算法来求解求出权重矩阵,我们需要将矩阵首先展开成为向量,在利用算法求出最优解后再重新转换回矩阵

7.3 梯度检验

           当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。

          为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

         对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ,我们计算出在 θ-ε 处和 θ+ε 的代价值(ε 是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值

         

         当 θ 是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对 θ1 进行检验的示例:

             

         最后我们还需要对通过反向传播方法计算出的偏导数进行检验

          根据上面的算法,计算出的偏导数存储在矩阵D_{ij}^{(l)} 中。检验时,我们要将该矩阵展开成为向量,同时我们也将 θ 矩阵展开为向量,我们针对每一个 θ 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同 D_{ij}^{(l)}进行比较。

7.4 随机初始化

           任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的

         我们通常初始参数为正负 ε 之间的随机值,假设我们要随机初始一个尺寸为 10×11 的参数矩阵,代码如下

                    

7.5 综合

            小结一下使用神经网络时的步骤:

            1.网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元;第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好;我们真正要决定的是隐藏层的层数和每个中间层的单元数

           2.训练神经网络:
           2.1. 参数的随机初始化
           2. 2 利用正向传播方法计算所有的 hθ(x)
           2.3. 编写计算代价函数 J 的代码
           2.4. 利用反向传播方法计算所有偏导数
           2.5. 利用数值检验方法检验这些偏导数
           2.6. 使用优化算法来最小化代价函数

7.6 其他

         matlab中,部分函数说明:

        A. 浅析image,imagesc,imshow的用法                         https://blog.csdn.net/zhupananhui/article/details/16340345

        B.matlab颜色映射colormap() pcolor()                          https://blog.csdn.net/qq_20823641/article/details/51711618

        C.MATLAB中floor、round、ceil、fix区别                     https://blog.csdn.net/xiamentingtao/article/details/52593648

        D. matlab max/min函数                                                http://blog.sina.com.cn/s/blog_6040778d0100uz25.html

        E.matlab中rand(a,b)怎么用_matlab中rand函数           https://jingyan.baidu.com/article/e8cdb32b1a9ecf37042bad52.html

        F.matlab中的numel函数                                               https://blog.csdn.net/what_lei/article/details/49000165

 

8.应用机器学习的建议(Advice for Applying Machine Learning) 

8.1 决定下一步做什么

         当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么?

               1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
               2. 尝试减少特征的数量
               3. 尝试获得更多的特征
               4. 尝试增加多项式特征
               5. 尝试减少归一化程度 λ
               6. 尝试增加归一化程度 λ 

       我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的

8.2 评估一个假设

         当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化,有人认为得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差,并不能说明它就一定是一个好的假设函数。而且我们也学习了过拟合假设函数的例子,所以这推广到新的训练集上是不适用的

         为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

            测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:对于线性回归模型,我们利用测试集数据计算代价函数 J;对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以计算误分类的比率,对于每一个测试集实例,计算下式,然后对计算结果求平均。

          

8.3 模型选择和交叉验证集

          假设我们要在 10 个不同次数的二项式模型之间进行选择:   

             

        显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。即:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集

         模型选择的方法为:
                                    1. 使用训练集训练出 10 个模型
                                    2. 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
                                    3. 选取代价函数值最小的模型
                                    4. 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)

 

8.4 诊断偏差和方差

           当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。高偏差和高方差的问题基本上来说是欠拟合和过拟合的问题。

           

      我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:

            

      对于训练集,当 d 较小时,模型拟合程度更低,误差较大;随着 d 的增长,拟合程度提高,误差减小。
      对于交叉验证集,当 d 较小时,模型拟合程度低,误差较大;但是随着 d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。

     如果我们的交叉验证集误差较大,我们如何判断是方差还是偏差呢? 根据上面的图表,我们知道

      

     训练集误差和交叉验证集误差近似时:偏差/欠拟合;交叉验证集误差远大于训练集误差时:方差/过拟合

8.5 归一化和偏差/方差

           在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则的程度太高或太小了,即我们在选择 λ 的值时也需要思考与刚才选择多项式模型次数类似的问题

   我们选择一系列的想要测试的 λ 值,通常是 0-10 之间的呈现 2 倍关系的值(如0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10 共 12 个)。 我们同样把数据分为训练集、交叉验证集和测试集。

选择 λ 的方法为:
1. 使用训练集训练出 12 个不同程度正则化的模型
2. 用 12 模型分别对交叉验证集计算的出交叉验证误差
3. 选择得出交叉验证误差最小的模型
4. 运用步骤 3 中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ 的值绘制在一张图表上

                

          当 λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大;随着 λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加

8.6 学习曲线

          学习曲线就是一种很好的工具,我经常使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(m)的函数绘制的图表

          即,如果我们有 100 行数据,我们从 1 行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据

                  

         如何利用学习曲线识别高偏差/欠拟合: 作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观,也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。

            

            如何利用学习曲线识别高方差/过拟合: 假设我们使用一个非常高次的多项式模型,并且归一化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

            

8.7 决定下一步做什么

        让我们来看一看我们在什么情况下应该怎样选择:
                 1. 获得更多的训练实例——解决高方差
                 2. 尝试减少特征的数量——解决高方差
                 3. 尝试获得更多的特征——解决高偏差
                 4. 尝试增加多项式特征——解决高偏差
                 5. 尝试减少归一化程度 λ——解决高偏差
                 6. 尝试增加归一化程度 λ——解决高方差

         神经网络的方差和偏差:

            

          使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过归一化手段来调整而更加适应数据。通常选择较大的神经网络并采用归一化处理会比采用较小的神经网络效果要好

         对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络

9.机器学习系统的设计

9.1 首先要做什么

         以一个垃圾邮件分类器算法为例进行讨论。

        为了解决这样一个问题,我们首先要做的决定是如何选择并表达特征向量 x。我们可以选择一个由 100 个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为 1,不出现为 0),尺寸为 100×1

          为了构建这个分类器算法,我们可以做很多事,例如:
         1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
         2. 基于邮件的路由信息开发一系列复杂的特征
         3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
         4. 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法

9.2 误差分析

           除了画出学习曲线之外,一件非常有用的事是误差分析,我的意思是说:当我们在构造垃圾邮件分类器时,我会看一看我的交叉验证数据集,然后亲自看一看哪些邮件被算法错误地分类。因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统
性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它

           构建一个学习算法的推荐方法为:

          1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
          2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
          3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势

        以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。

       思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从 出现次数最多的情况开始着手优化。

        误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差

        在 我 们 的 垃 圾 邮 件 分 类 器 例 子 中 , 对 于 “ 我 们 是 否 应 该 将discount/discounts/discounted/discounting 处理成同一个词?”如果这样做可以改善我们算法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和不采用截词软件这两种不同方案,然后根据数值检验的结果来判断哪一种更好

         因此,当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差还是表现好,那么这很难让你做出决定。到底是否使用词干提取,是否区分大小写。但是通
过一个量化的数值评估,你可以看看这个数字,误差是变大还是变小了。你可以通过它更快地实践你的新想法,它基本上非常直观地告诉你:你的想法是提高了算法表现,还是让它变得更坏,这会大大提高你实践算法时的速度。所以我强烈推荐在交叉验证集上来实施误差分
析,而不是在测试集上。但是,还是有一些人会在测试集上来做误差分析。即使这从数学上讲是不合适的。所以我还是推荐你在交叉验证向量上来做误差分析

11.3 类偏斜的误差度量

           类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例

           例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有 0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。然而我们通过训练而得到的神经网络算法却有 1%的误差。这时,误差的
大小是不能视为评判算法效果的依据的

            查准率(Precision)和查全率(Recall) 我们将算法预测的结果分成四种情况:

                     1. 正确肯定(True Positive,TP):预测为真,实际为真
                     2. 正确否定(True Negative,TN):预测为假,实际为假
                     3. 错误肯定(False Positive,FP):预测为真,实际为假
                     4. 错误否定(False Negative,FN):预测为假,实际为真

则:查准率=TP/(TP+FP)例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
       查全率=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好

9.4 查全率和查准率之间的权衡

          继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在 0-1 之间,我们使用阀值 0.5 来预测真和假。

         查准率(Precision)=TP/(TP+FP) 例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
         查全率(Recall)=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。

         如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比 0.5 更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
        如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5 更小的阀值,如 0.3。

           我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同

                

            我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算 F1 值(F1 Score),其计算公式为:                                           

             

            我们选择使得 F1 值最高的阀值,其中P为查准率,R为查全率

8.5 机器学习的数据

           得到大量的数据并在某种类型的学习算法中进行训练,可以是一种有效的方法来获得一个具有良好性能的学习算法。而这种情况往往出现在这些条件对于你的问题都成立并且你能够得到大量数据的情况下。这可以是一个很好的方式来获得非常高性能的学习算法。

         现在假设我们使用了非常非常大的训练集,在这种情况下,尽管我们希望有很多参数,但是如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会过度拟合。也就是说训练误差有希望接近测试误差。另一种考虑这个问题的角度是为了有一个高性能的学习算法,我们希望它不要有高的偏差和方差。       

           因此偏差问题,我么将通过确保有一个具有很多参数的学习算法来解决,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证

8.6 matlab函数

            matlab函数之bsxfun           https://blog.csdn.net/tina_ttl/article/details/51034773

9.支持向量机

9.1 优化目标

         与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

         正则化的逻辑回归的代价函数(即优化目标)和假设函数为:

              

       对应的支持向量即的优化目标和假设函数为:

        

         对比:两者的代价函数中系数不同(支持向量机中将m去掉,即把平均的意思去掉同时支持向量机将正则化系数λ提到前面得到C,故:C 等于 1/λ);两者的假设函数不同(逻辑回归得到的假设函数值在0到1之间,而支持向量机假设函数输出仅为0或者1);

9.2 支持向量机的直观理解

       人们有时将支持向量机看作是大间距分类器

       当惩罚因子C很大时,对于损失函数简化形式:C*A+B而言,肯定是要在A最小的情况下再考虑B的最小化,A最小意味着:y=1时,\theta^TX>1;y=0时,\theta^TX<-1,这样会使损失函数的第一项A=0,注意:\theta^TX在线代里面可以表示向量\theta和向量X的内积。

        当满足第一项最小化的条件后,我们来考虑第二项B=,此式可以看为向量\theta的范数,即向量\theta的长度。要最小化这一项则表示要使向量\theta的长度最小化

          针对上述2点可得出,首先令损失函数的第一项A最小化,其条件为:y=1时,\theta^TX>1;y=0时,\theta^TX<-1;其次令损失函数的第二项B最小化,条件为使向量\theta的长度最小化。

         故,要使损失函数最小化既要满足y=1时,\theta^TX>1;y=0时,\theta^TX<-1,也要满足向量\theta的长度最小化,而X和y为样本的信息,无法改变,我们只能做的是使向量\theta的长度最小且向量\theta和向量X的内积满足要求【内积要足够大,但是向量\theta要小】。

        关于向量\theta和向量X的内积,我们已知内积公式为: \theta·X= |\theta| ×|X| ×cosθ,式中,|X| ×cosθ表示向量X在向量θ上的垂直投影,记为p。损失函数最小化的要求是:内积要足够大,但是向量\theta要小,那么就是要求投影P要足够大;我们还已知:决策面和向量θ垂直。故,垂直投影p即为样本向量距离决策面的距离。所以,当C足够大时,决策面会离样本很远,这就是大距离的由来。

9.3 核函数1

            回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题

             

           为了获得上图所示的判定边界,我们的模型可能是

           

           我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令

          

          然而,除了对原有的特征进行组合以外,有没有更好的方法来构造 f1,f2,f3?我们可以利用核函数来计算出新的特征

         给定一个训练实例 x,我们利用 x 的各个特征与我们预先选定的地标(landmarks)l(1),l(2),l(3)的近似程度来选取新的特征 f1,f2,f3。

            

           例如:

                

          上例中的 similarity(x,l(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已

          这些地标的作用是什么?如果一个训练实例 x 与地标 L 之间的距离近似于 0,则新特征f 近似于 e^{-0}=1,如果训练实例 x 与地标 L 之间距离较远,则 f 近似于 e^{-\infty }=0

         假设我们的训练实例含有两个特征[x1 x2],给定地标 l(1)与不同的 σ 值,见下图:

        

        图中水平面的坐标为 x1,x2而垂直坐标轴代表 f。可以看出,只有当 x 与 l(1)重合时 f 才具有最大值。随着 x 的改变 f 值改变的速率受到 \sigma ^2的控制。\sigma ^2越大,下降越快

        在下图中,当实例处于洋红色的点位置处,因为其离 l(1)更近,但是离 l(2)和 l(3)较远,因此 f1接近 1,而 f2,f3 接近 0。因此 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测 y=1。同理可以求出,对于离 l(2)较近的绿色点,也预测 y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测 y=0

       

        这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征 f1,f2,f3

9.4 核函数2

           如何选择地标?

           我们通常是根据训练集的数量选择地标的数量,即如果训练集中有 m 个实例,则我们选取 m 个地标,并且令:l(1)=x(1),l(2)=x(2),...,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:

            

         下面我们将核函数运用到支持向量机中,

           修改我们的支持向量机假设为:给定 x,计算新特征 f,当 \theta^Tf>=0 时,预测 y=1,否则反之。

          相应地修改代价函数为:

              

            注意:此时特征数量等于样本数量,即n=m

           在具体实施过程中,我们还需要对最后的归一化项进行些微调整,我们用\theta^TM\theta 代替 \theta^T\theta,其中 M 是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算

         理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M 来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。

         在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的

         另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机

        下面是支持向量机的两个参数 C 和 σ 的影响

        C 较大时,相当于 λ 较小,可能会导致过拟合,高方差;
        C 较小时,相当于 λ 较大,可能会导致低拟合,高偏差;

        \sigma ^2较大时,会得到较平滑的模型,导致高偏差;
        \sigma ^2较小时,会得到变化较快的模型,导致高方差

9.5 使用支持向量机

       在高斯核函数之外我们还有其他一些选择,如:多项式核函数(Polynomial Kernel),字符串核函数(String kernel),卡方核函数( chi-square kernel),直方图交集核函数(histogram intersection kernel)。这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足 Mercer's 定理【Mercer 定理:任何半正定的函数都可以作为核函数。】,才能被支持向量机的优化软件正确处理。

        多类分类问题:假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有 k 个类,则我们需要 k 个模型,以及 k 个参数向量 θ。我们同样也可以训练 k 个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。

      尽管你不去写你自己的 SVM(支持向量机)的优化软件,但是你也需要做几件事:

     1、是提出参数 C 的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
     2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。

      从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?

      下面是一些普遍使用的准则:

       n 为特征数,m 为训练样本数。

      (1)如果相较于 m 而言,n 要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机

       (2)如果 n 较小,而且 m 大小中等,例如 n 在 1-1000 之间,而 m 在 10-10000 之间,使用高斯核函数的支持向量机

       (3)如果 n 较小,而 m 较大,例如 n 在 1-1000 之间,而 m 大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

       值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值

       今天的 SVM 包会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集,且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。

      最后,神经网络使用于什么时候呢? 对于所有的这些问题,对于所有的这些不同体系一个设计得很好的神经网络也很有可能会非常有效。有一个缺点是,或者说是有时可能不会使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果
你有一个非常好的 SVM 实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此之前没有展示,但是事实证明,SVM 具有的优化问题,是一种凸优化问题。因此,好的 SVM优化软件包总是会找到全局最小值,或者接近它的值。对于 SVM 你不需要担心局部最优

      在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用 SVM的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比 SVM 慢,尤其是在这样一个体系中,至于这里给出的参考,看上去有些模糊,如果你在考虑一些问题,这些参考会有一些模糊,但是我仍然不能完全确定,我是该用这个算法还是改用那个算法,这个没有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是就如在之前的视频中看到的算法确实很重要。但是通常更加重要的是:你有多少数据,你有多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是 SVM 这方面更加重要

9.6 matlab函数

matlab中strcmp函数的使用                https://blog.csdn.net/feitianziyouaoxiang/article/details/46492111

matlab 字符串处理函数                     https://www.cnblogs.com/emanlee/archive/2012/09/13/2683912.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值