赞
踩
目录
2.单变量线性回归(Linear Regression with One Variable)
4.多变量线性回归(Linear Regression with Multiple Variables)
8. 神经网络的表述(Neural Networks: Representation)
9.神经网络的学习(Neural Networks: Learning)
10.应用机器学习的建议(Advice for Applying Machine Learning)
10.3 模型选择和交叉验证集( Model Selection and Train_Validation_Test Sets)
10.4 诊断偏差和方差(Diagnosing bias vs. variance)
10.5 正则化和偏差/方差(Regularization and Bias_Variance)
14.降维(Dimensionality Reduction)
14.1 动机一:数据压缩(Motivation I_ Data Compression)
14.2 动机二:数据可视化( Motivation II_ Visualization)
14.3 主成分分析问题(Principal Component Analysis Problem Formulation)
监督学习指的就是我们给学习算法一个数据集。
回归这个词的意思是,我们在试着推测出这一系列连续值属性。
分类指的是,我们试着推测出离散的输出值:0或1良性或恶性,而事实上在分类问题中,输出可能不止两个值。
无监督学习中,我们已知的数据。看上去有点不一样,不同于监督学习的数据的样子,即无监督学习中没有任何的标签或者是有相同的标签。针对数据集,无监督学习就能判断出数据有两个不同的聚集簇。
,因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。
目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数 最小。代价函数也被称作平方误差函数,平方误差代价函数可能是解决回归问题最常用的手段了。
梯度下降是一个用来求函数最小值的算法,批量梯度下降(batch gradient descent)算法的公式为:
其中a 是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。 如果a 太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。如果a 太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点。
结合梯度下降法,以及平方代价函数,我们会得出第一个机器学习算法,即线性回归算法。
将梯度下降和代价函数结合,应用于具体的拟合直线的线性回归算法里。
上述称为 批量梯度下降。
此时模型中的参数是一个 维的向量,任何一个训练实例也都是 维的向量,特征矩阵 的维度是 。 因此公式可以简化为:
找出使得代价函数最小的一系列参数。 多变量线性回归的批量梯度下降算法:
开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
面对多维特征问题的时候,要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。尝试将所有特征的尺度都尽量缩放到-1到1之间。
线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:或者三次方模型:
通常我们需要先观察数据然后再决定准备尝试怎样的模型。 另外,我们可以令:
从而将模型转化为线性回归模型。采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。
求解方程来找出使得代价函数最小的参数,正规方程解出向量
梯度下降与正规方程的比较:
梯度下降 | 正规方程 |
需要选择学习率α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n 大时也能较好适用 | 需要求逆 如果特征数量n 较大则运算代价大,因为矩阵逆的计算时间复杂度为On3 ,通常来说当n 小于10000 时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
总结,只要特征变量的数目并不大,标准方程是一个很好的计算参数θ 的替代方法
写代码做矩阵乘法,不如用合适的向量化方法来实现。
在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归。将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量 ,其中 0 表示负向类,1 表示正向类。这个算法的性质是:它的输出值永远在0到 1 之间。这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 y 取值离散的情况。
逻辑回归模型的假设是: 其中: 代表特征向量 代表逻辑函数(logistic function),常用的逻辑函数为S形函数(Sigmoid function),公式为: 。
的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)即 例如,如果对于给定的x ,通过已经确定的参数计算得出=0.7 ,则表示有70%的几率y 为正向类,相应地y 为负向类的几率为1-0.7=0.3。
决策边界(decision boundary),我们可以绘制直线 ,这条线便是我们模型的分界线,将预测为1的区域和预测为 0的区域分隔开。
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和对逻辑回归模型沿用这个定义,得到的代价函数将是一个非凸函数(non-convexfunction),有许多局部最小值,影响梯度下降算法寻找全局最小值。
重新定义逻辑回归的代价函数为:,其中
构建的 函数的特点是:当实际的 且 也为 1 时误差为 0,当 但 不为1时误差随着 变小而变大;当实际的 且 也为 0 时代价为 0,当 但 不为 0时误差随着 的变大而变大。简化为
虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
用 梯度下降最小化逻辑回归中代价函数 :,简化为
使用逻辑回归 (logistic regression)来解决多类别分类问题,具体来说,叫做"一对多" (one-vs-all) 的分类算法。
(上图右,将其分成3个二元分类问题。)创建一个新的"伪"训练集。将多个类中的一个类标记为正向类(y=1 ),然后将其他所有类都标记为负向类,这个模型记作,拟合出一个合适的分类器。接着,类似地第我们选择另一个类标记为正向类(y=2 ),再将其它类都标记为负向类,将这个模型记作 ,依此类推。 最后我们得到一系列的模型简记为:
最后,在我们需要做预测时,我们将所有的分类机都运行一遍,三个分类器里面输入 x ,然后我们选择一个让 最大的i ,即。
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质即预测新数据,称为过拟合(over-fitting)。中间的模型似乎最合适。拟合的越好,相应的预测的能力就可能变差,应该如何处理?
1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)
2.正则化。 保留所有的特征,但是减少参数的大小(magnitude)。
上面的回归问题中如果我们的模型是:,那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,就能很好的拟合了,所以在一定程度上减小这些参数 的值,这就是正则化的基本方法。减少 和 的大小,我们要做的便是修改代价函数,在其中 和 设置一点惩罚,在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的θ3 和θ4 。
修改后的代价函数如下:,通过这样的代价函数选择出的 和 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:,其中λ 又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:
如果选择的正则化参数λ过大,则会把所有的参数都最小化了,导致模型变成 ,也就是上图中红色直线所示的情况,造成欠拟合。要取一个合理的 的值。把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。
基于梯度下降:每次都在原有算法更新规则的基础上令θ 值减少了一个额外的值。
对上面的算法中j=1,2,...,n 时的更新式子进行调整可得:
基于正规方程:图中的矩阵尺寸为 (n+1)*(n+1) 。
对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数:
要最小化该代价函数,通过求导,得出梯度下降算法为:
注:1、看上去同线性回归一样,但是知道 ,所以与线性回归不同。2、 不参与其中的任何一个正则化。
在神经网络中,参数又可被称为权重(weight)。神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
激活单元
我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ),把x , θ , a 分别用矩阵表示,我们可以得到θ⋅X=a :
我们可以把a0,a1,a2,a3 看成更为高级的特征值,也就是x0,x1,x2,x3 的进化体,并且它们是由 x 决定的,因为是梯度下降的,所以a 是变化的,并且变得越来越厉害,所以这些更高级的特征值远比 x 次方厉害,也能更好的预测新数据。这就是神经网络相比于逻辑回归和线性回归的优势。
从本质上讲,神经网络能够通过学习得出其自身的一系列特征。在普通的逻辑回归中,我们被限制为使用数据中的原始特征x1,x2,...,xn ,我们虽然可以使用一些二项式项来组合这些特征,但是我们仍然受到这些原始特征的限制。在神经网络中,原始特征只是输入层,在我们上面三层的神经网络例子中,第三层也就是输出层做出的预测利用的是第二层的特征,而非输入层中的原始特征,我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征。
代价函数会比逻辑回归更加复杂一些,为:
通过代价函数来观察算法预测的结果与真实情况的误差有多大。
在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的。现在,为了计算代价函数的偏导数 ,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。在求出了之后,我们便可以计算代价函数的偏导数了
对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法:在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
任何优化算法都需要一些初始的参数。通常初始参数为正负 之间的随机值。
小结一下使用神经网络时的步骤:
1、网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。
2、训练神经网络:
为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
测试集评估:在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数J
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以计算误分类的比率,然后对计算结果求平均。
越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型,即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集
模型选择的方法为:
1. 使用训练集训练出10个模型
2. 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
3. 选取代价函数值最小的模型
4. 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)
运行一个学习算法时,如果算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:
对于训练集,当 d 较小时,模型拟合程度更低,误差较大;随着 d 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 d 较小时,模型拟合程度低,误差较大;但是随着 d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
训练集误差和交叉验证集误差近似时:偏差/欠拟合。 交叉验证集误差远大于训练集误差时:方差/过拟合。
训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高或太小了,即我们在选择λ的值时也需要思考与刚才选择多项式模型次数类似的问题。
选择一系列的想要测试的 值,通常是 0-10之间的呈现2倍关系的值。同样把数据分为训练集、交叉验证集和测试集。
选择λ 的方法为:
1.使用训练集训练出12个不同程度正则化的模型
2.用12个模型分别对交叉验证集计算的出交叉验证误差
3.选择得出交叉验证误差最小的模型
4.运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:
随着 λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加
学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差(因变量)作为训练集实例数量(自变量)(m )的函数绘制的图表。即,如果我们有100行数据,我们从1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
利用学习曲线识别高偏差/欠拟合:我们用一条直线来适应下面的数据,可以看出,无论训练集实例数量有多么大,误差都不会有太大改观。即在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
利用学习曲线识别高方差/过拟合:我们用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。即在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
我们来看一看我们在什么情况下应该怎样选择:
1. 获得更多的训练实例——解决高方差
2. 尝试减少特征的数量——解决高方差
3. 尝试获得更多的特征——解决高偏差
4. 尝试增加多项式特征——解决高偏差
5. 尝试减少正则化程度λ——解决高偏差
6. 尝试增加正则化程度λ——解决高方差
神经网络的方差和偏差:
无监督学习中,我们的数据没有附带任何标签,我们拿到的数据就是这样的:
我们有一系列点,却没有标签。因此,我们的训练集可以写成只有一直到,没有任何标签 。我们需要将一系列无标签的训练数据,输入到一个算法中,让这个算法为我们找找这个数据的内在结构。图上的数据看起来可以分成两个分开的点集(称为簇),一个能够找到我圈出的这些点集的算法,就被称为聚类算法,这将是我们介绍的第一个非监督学习算法。聚类算法可以用来:
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:
首先选择K 个随机的点,称为聚类中心(cluster centroids);
对于数据集中的每一个数据,按照距离K 个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
重复步骤直至中心点不再变化。
下面是一个聚类示例:
心的索引。算法分为两个步骤,第一个for循环是赋值步骤,即:对于每一个样例i ,计算其应该属于的类。第二个for循环是聚类中心的移动,即:对于每一个类K ,重新计算该类的质心。K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为:
我们知道,第一个循环是用于减小 引起的代价,而第二个循环则是用于减小 引起的代价。迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
随机初始化所有的聚类中心点:
K-均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。为了解决这个问题,我们通常需要多次运行算法,每一次都重新进行随机初始化,最后再比较多次运行的结果,选择代价函数最小的结果。这种方法在K 较小的时候(2--10)还是可行的,但是如果K 较大,这么做也可能不会有明显地改善。
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的,选择时思考运用算法聚类的动机是什么。选择聚类数目的方法时,有一个可能会谈及的方法叫作“肘部法则”,我们所需要做的是改变 值,也就是聚类类别数目的总数。
曲线的肘点,畸变值下降得很快,那么使用3个聚类来进行聚类是正确的。
第二种类型的无监督学习问题,称为降维。有几个不同的的原因使你可能想要做降维,一是数据压缩。数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,也可以加快我们的学习算法。降维是什么?例子:我们收集的数据集有许多特征,我绘制两个在这里。
假设我们未知两个的特征(长度):x1:用厘米表示;x2:用英寸表示同一物体的长度。这给了我们高度冗余表示,我们想要做的是减少数据到一维,只有一个数据测量这个长度。
在许多及其学习问题中,如果我们能将数据可视化,我们便能寻找到一个更好的解决方案,降维可以帮助我们。
假使我们有有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP,人均GDP,平均寿命等)。如果要将这个50维的数据可视化是不可能的。使用降维的方法将其降至2维,我们便可以将其可视化了。
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。
主成分分析(PCA)是最常见的降维算法。在PCA中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
将 维数据降至 维,进行数据压缩,目标是找到向量 , ,..., 使得总的投射误差最小,如果100维的向量最后可以用10维来表示,那么压缩率为90%。主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。图像处理领域的KL变换使用PCA做图像压缩。但PCA 要保证降维后,还要保证数据的特性损失最小。
PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果,同时最大程度的保持了原有数据的信息。
PCA技术的一个很大的优点是,它是完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
减少n 维到k 维:
(1)均值归一化。我们需要计算出所有特征的均值μj ,然后令 xj=xj-μj 。如果特征是在不同的数量级上,我们还需要将其除以标准差 σ2 。
(2)计算协方差矩阵(covariance matrix):
(3)计算协方差矩阵的特征向量(eigenvectors)。利用奇异值分解(singular value decomposition)来求解[U, S, V]。
对于一个 维度的矩阵,上式中的 是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从 维降至 维,我们只需要从 中选取前 个向量,获得一个n×k维度的矩阵,通过 计算获得要求的新特征向量,其中x 是n×1 维的,因此结果为k×1 维度。注,我们不对方差特征进行处理。
主要成分分析是减少投射的平均均方误差:,训练集的方差为:平均均方误差与训练集方差的比例:,我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的k 值。如果我们希望这个比例小于1%,就意味着原本数据的偏差有99%都保留下来了,也能显著地降低模型中特征的维度。可以先令k=1 ,然后进行主要成分分析,获得Ureduce 和z ,然后计算比例是否小于1%。如果不是的话再令k=2 ,如此类推,直到找到可以使得比例小于1%的最小k 值(原因是各个特征之间通常情况存在某种相关性)。
压缩表示回到原有的近似高维数据。给定的 ,可能100维,怎么回到原来的表示x(i) ,可能是1000维的数组?
相反的方程为:。所以,给定未标记的数据集,应用PCA,低维表示可以映射到高维特征 。
假设我们正在针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000 个特征。
1. 第一步是运用主要成分分析将数据压缩至1000个特征
2. 然后对训练集运行学习算法。
3. 在预测时,采用之前学习而来的 ,将输入的特征x 转换成特征向量z ,然后再进行预测
注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的 。
错误的主要成分分析情况:
(1)将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
(2)默认地将主要成分分析作为学习过程中的一部分。虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。