给算法一个数据集,其中包含了正确答案, 算法的目的是给出更多的正确答案。
根据数据类型,监督学习可以分为回归问题和分类问题
有些问题可能具有多个特征值
数据集中没有任何的标签或者是有相同的标签。算法自行将数据进行分类或分群。
无监督学习通常可以分为聚类和维度缩减两种类型
机器学习中,小写的x是输入变量或特征,小写y是输出变量、目标变量
(x,y)是一个训练样本,那么可以看出来是第i个训练样本。
假设函数(Hypothesis)的定义:
关键在于如何选择不同的参数和" role="presentation">
代价函数公式:
我们要做的就是找到合适的和,使得最小,也就是,这就是代价函数。代价函数也被称为平方误差函数,有时也被称为平方误差代价函数。
当有一个参数时,对应的假设函数和代价函数如图所示。
当有两个参数时,对应的假设函数和代价函数如图所示。
等高线图更好地展示代价函数。离最低点越近,拟合效果越好。
可以将代价函数最小化,也就是从某个初始点开始,一直沿着负梯度方向更新参数,知道代价函数达到局部最低点。但是,如果初始点不同,那么得到的最低点也不同。
梯度下降算法的定义:
其中" role="presentation">表示学习率,越小,变化的越慢,越大,步幅越大。
过小:收敛速度较慢
过大:由于步幅较大,可能不能达到收敛效果
注意:和要同时更新(左面未正确方式,右面为错误方式)
当人们谈到梯度下降时,指的就是同步更新
当越来越接近局部最低点时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度。
如果参数已经处于局部最低点,在该点导数为零,根据公式可以看出,梯度下降法更新其实什么都没做。
线性回归的代价函数是一个凸函数,这个函数没有局部最优解,只有全局最优解,因此它总会收敛到全局最优
线性回归中求解代价函数最小值对应的模型参数,除了梯度下降算法之外,还有正规方程法。相比之下,梯度下降法更适用于较大的数据集。
矩阵是指由数字组成的矩形阵列,通常用大写字母表示。向量是只有一列的矩阵,通常用小写字母表示。
矩阵可以方便快速整理索引和访问大量数据。向量除非特别指定,应该默认下标从1开始。
只有相同维度的矩阵才能相加。
特殊:矩阵向量乘法
一般:矩阵与矩阵相乘。m*n的矩阵与n*o的矩阵相乘,得到的是m*o的矩阵
实数乘法中顺序不重要,但是矩阵乘法中不能随意变换相乘的顺序。
当相乘的矩阵至少有一个是单位矩阵时,则满足交换律。
逆矩阵的定义:
方阵的定义:这列矩阵的行数和列数相等。
只有方阵才有逆矩阵。不存在逆矩阵的矩阵称为奇异矩阵或者退化矩阵。
使用等来表示不同的特征,依旧使用表示预测值。使用表示特征的个数,表示样本数量,表示第i个样本的特征向量(一个向量),表示第i个样本的第j个特征的值。
假设函数定义:
与一元梯度下降法类似
代价函数公式为:
梯度下降的公式:
总结来说,将各个特征值的取值范围控制在接近的取值范围内。一般为[-1,1]
目的:为了让梯度下降运行得更快,收敛需要的迭代次数更少。
在特征缩放中,有时我们也会进行一个成为均值归一化的工作。也就是说,用代替,使得特征值的平均值为0。其中,为该特征值的平均值,为该特征值的范围。
该曲线表示的是梯度下降的每步迭代后,代价函数的值。
如果梯度下降算法正常工作的话,每一步迭代之后都应该下降,最后达到收敛的状态。另外,也可以进行一些自动的收敛测试,来确定梯度下降算法是否已经收敛。(自动的收敛测试:如果代价函数一步迭代后的下降小于一个很小的值,那么就判定函数已收敛。但是通常来说,选择一个合适的阈值是相当困难的)
如果代价函数的变化曲线如下图所示,通用的解决方法是使用较小的值。
总结:
- 如果过小:会遇到收敛速度慢的问题
- 如果过大:代价函数可能不会在每次迭代都下降,甚至可能不收敛
在为梯度算法选择合适的学习率时,通常可以按3的倍数来取值
当一次函数模型不能很好的表示y与x的关系时,可以考虑二次函数、三次函数等。同时,可以将二次项、三次项作为新的特征值。需要注意的是,使用这种方法时,更应该注意特征缩放。
比如,该例子中,很明显一次函数不能很好地拟合曲线,而二次函数在中心点之后,随着x(房屋面积)的增加,y(预测价格)减小,不符合逻辑。所以在这里,三次函数更合适。
正规方程是通过求解导数等于0来找出使得代价函数最小的参数的
比如一个数据集具有m个样本,n个特征。
在求最优解时,应该加上一列,然后写出矩阵x和向量y。
由此得出最优参数的公式为:(不需要进行特征缩放)
梯度学习算法的缺点:1.要选择一个合适的,这通常表示需要运行多次
2.需要更多次的迭代
正规方程的缺点:1.在特征变量很多的情况下,计算会变慢
2.在比如逻辑回归等算法中
不可逆的原因:
不可逆的解决方法:
python实现作业
当预测值y为离散值时,通常考虑为分类问题。(逻辑回归是当前最广泛使用的学习算法之一)
分类问题例子:垃圾邮件分类、分类网上交易、对肿瘤进行分类
有些分类问题,如果使用线性回归方法,将会看到拟合效果并不好
并且对于二类问题,如果使用线性回归,可能出现预测值远大于1或者远小于0。而逻辑回归算法可以很好的避免这个问题,也就是说使用逻辑回归方法的预测值的范围属于[0,1]
逻辑回归的假设函数:
由图可知,一定在0和1之间。我们同样需要找到合适的拟合这个模型。
假设函数输出值代表特征值为x的数据,在参数为时,p=1的概率为多少。
只要假设函数输出的值大于或等于0.5.那么意味着y更有可能等于1,我们就预测y=1。如果预测y=1的概率小于0.5,那么我们就预测y=0。
通过sigmoid函数我们可以看出来,只要z大于或等于0,g(z)就大于等于0.5。
决策边界还可能出现很多种情况,比如:线性边界,圆形边界等等。
需要注意的是,决策边界是由参数决定的,与数据集无关。即使还没有数据集,只要参数确定,决策边界就一定确定。
如果依然使用线性回归的代价函数以及sigmoid函数,那么将会得到一个非凸函数(如下左图所示)。当把梯度下降算法用到这个函数上时,不能得到全局最优解。
因此,我们要重新定义运用在逻辑回归上的代价函数。
当y=1时,代价函数随假设函数变化如图所示。
我们可以很明显的看出,当趋向于1时,代价函数cost趋向于0,相反,当趋向于0时,代价函数cost趋向于无穷大。举例说明就是,一个患者的肿瘤为恶性的,可是预测却说他的肿瘤肯定不是恶性的,那么代价函数将会趋向于无穷大。
当y=0时,代价函数随假设函数变化如图所示。
看起来,与y=1相反。
简化后的代价函数为
其中
其实就是将一个分段函数合并成了一行
我们的目的是找到合适的参数,使得代价函数最小。依然可以采用梯度下降算法。
梯度下降算法
看似和线性回归相同,但由于假设函数的改变,其完全不同。但是特征缩放也是可以应用到逻辑回归中的。
除了梯度下降算法外,还有其他一些优化算法:共轭梯度法、BFGS和L-BFGS。
优点:1.不用手动选择学习率(内置的线搜索算法可以自动尝试不同的学习效率并自动选择一个好的学习效率,甚至可以为每次迭代选择不同的学习速率)
2.收敛速度远远快于梯度下降。
缺点:复杂
多分类问题举例:将邮件归类到不同的文件夹里或者说可以自动地加上标签、有关药物诊断的问题、天气的分类问题。
处理步骤:1.将多元分类问题分成多个独立的二元分类问题
2.每个二元分类,都单独计算出一个划分边界。其中假设函数的输出为y=i的概率
3.最终选择对应的i(即选择选择可信度最高、效果最好的分类器)
拟合过程中可能出现欠拟合和过拟合的问题
欠拟合:具有高偏差的算法,没有很好的拟合训练数据(罔顾数据和证据的不符)
过拟合(在变量过多时出现):具有高方差的算法,代价函数很可能趋向于0,无法运用到 新样本中
对过拟合问题的解决方式:
区别:正则化的代价函数主要是在原有代价函数上添加了惩罚项
由于一开始不知道哪些变量需要惩罚,所以对于所有变量都加上惩罚项,这样能够简化假设函数,使得假设函数更加平滑,从而避免过拟合问题。
正则化后的代价函数为
其中,为正则化参数
第一个目标是想更好地拟合训练集数据,第二个目标是想使得参数尽可能小,避免出现过拟合。
在正则化的线性回归中,如果设置过大,会导致对所有参数的惩罚程度过大,从而使得所有参数都会接近于0,假设模型近似一条直线,出现欠拟合情况。
由于正则化时,没有对添加惩罚项,因此将从式子中取出,接着,原式添加正则化的导数,组成新的梯度下降算法。
我么可以发现,因为通常是非常小的数,所以可以理解为每次迭代,都乘以一个接近于1的数。
正规方程如图所示。
梯度下降算法
首先,和线性回归一样,现在代价函数中添加惩罚项。
逻辑回归正则化的代价公式为:
逻辑回归正则化后的梯度下降
因为在实际机器学习问题中,初始特征量n可能会很大,如果将大量高阶多项式加入到假设函数中,那么会产生非常多项,会使特征空间急剧膨胀。如果这时候只采取其中一部分项,那么又做不到很好的拟合。因此,引出神经网络,他在学习复杂的非线性假设上被证明是一种好算法。
例子:判断一个图片是否是汽车(通过像素)
神经网络的起源是人们想设计出模仿大脑的算法。
神经网络模仿了大脑中的神经元或者神经网络。
单个神经元如下图所示。
其中,输入通道模仿树突,输入、、...、,黄色的圈在这里就是计算假设函数。
当绘制神经元网络图时,一般只表示出,,...、。必要的时候,会增加一个额外的节点,有时也被称作偏置单元或偏置神经元(取决于问题中,添加是否方便)
神经网络术语:
神经网络其实就是一组神经元连接在一起的集合,如下图所示。
网络中的第一层也被称为输入层,中间的第二层被称作隐藏层(非输入输出层),最后一层成为输出层。
如果一个神经网络在第层有个单元,在第层有个单元,则的维度为
主要讲述用向量化计算神经网络问题。
具体而言,我们将向量定义为,,,组成的向量。将向量定义为,,组成的向量。
额外加上一个
这种依次计算激活项,从输入层到隐藏层再到输出层的过程称为前向传播。
通过上图,可以看出右半部分就是经典的逻辑回归,只不过选择了隐藏层计算出来的激活项作为特征值,而不是原本的特征。通过这种方式,有时可以学习到一些很有趣和复杂的特征,从而得到一个更好的假设函数。
神经网络中神经元的连接方式称为神经网络的架构。
该小节中的例子主要展示了逻辑与和逻辑或。
通过权重的作用,可以控制不同输入值得到的z,然后通过sigmoid函数得到最终结果。
在该小节中,首先举的例子是非运算和取反后的逻辑与运算。
要想实现逻辑非运算,大致思想是在预期得到非结果的变量前面放一个很大的负权重。
其次,介绍了XNOR运算的实现。
在该神经网络中,一共有三层网络,第一层为输入层,第二层为隐藏层,第三层为输出层,其中第二层是实现一些关于输入的略微简单的函数(逻辑与和取反后的逻辑与运算),第三层又在此基础上计算更加复杂的函数(在第二层的基础上,运用隐藏层计算出来的激活项作为特征值,实现逻辑或运算)。
例子:手写数字识别
要在神经网络中实现多类别分类,采用的方法本质上是一对多法的拓展。
简单点说,就是做后的输出对应一个四维向量,分别代表不同物品。
为神经网络问题拟合参数。
其中,L代表总层数,代表第层神经元的个数。可以将问题类型划分为二元分类和多元分类。
二元分类的输出为一个实数(0或1),多元分类的输出为k维向量(k>=3)。因为如果k<3,那么即为二元分类。
下图为多元分类的代价函数,也是常规项加上额外的正则项。
其中,正则项其实就是对所有的权重(参数进行求和),不将偏置项加入正则项中,因为我们并不想让这些值设为0。
再上一个小节中,我们已经知道了代价函数,在这个小节中,我们要做的就是找到合适的向量,使得代价函数最小。(需要计算偏导数)
首先,通过向量化实现前向传播,得出每一个激活项的值。
计算偏导数时,需要用到反向传播算法。
在图中,我们可以看出偏导数,也就是说,如果我们要得到偏导数的值,就需要计算出的值。
计算分成两种情况:和
(向量化)
需要注意的是,第一层也就是输入层是没有的,因为第一层没有误差。
当样本数量不止一个时,在前面乘以。
主要讲解参数的矩阵表达式和向量表达式之间的转换。
在神经网络或者其他一些很复杂的模型中,为了确保前向传播和后向传播都是正确的,通常采用梯度检测。
梯度检测其实就是用双侧差分(导数的定义)计算一个偏导数的近似值,当足够小时,其实可以看成两者相等,但我们为了计算的方便,达到近似即可。" role="presentation">
途中右侧的公式为单侧差分,不如双侧差分准确。
当是一个向量时,计算如下所示:
梯度检测的步骤:
注意:再进行反向传播时,一定要关掉梯度检测,否则程序运行将会非常缓慢。
当使用高级优化算法或者梯度下降算法时,需要对向量进行赋值。
第一种想法是全部设为0,在逻辑回归中,是完全被允许的,但在训练神经网络时,这种初始值起不到任何作用。因为这会导致第二层激活项的值完全相同(因为前一层的权重相同),这个问题称为对称权重问题,如下图所示。
为了解决这个问题,我们采用随机初始化的方法,也就是将每一个都初始化为一个范围在中的一个随机数
在训练神经网络之前,要先选择一个网络架构,网络架构就是指神经元之间的连接方式,可以选择每一层有多少个隐藏单元以及有多少个隐藏层。
选择网络架构的建议:
训练神经网络的六个步骤:
神经网络很好的应用例子是无人驾驶
当用训练好的模型进行预测具有较大误差时,可以采取以下方法:
完成机器学习系统时,一定注意要找到具有较好拟合效果的方法。方法为:机器学习诊断法
该小节主要讲述怎么评价算法学习得到的假设,还将讨论如何解决过拟合和欠拟合问题。
判断是否过拟合的方法:将数据分成两部分,第一部分成为我们的训练集(70%),第二部分成为我们的测试集(30%),需要注意的是在划分数据时要随机选择。
首先,需要对训练集得到一个合适的参数,也就是最小化训练误差,然后用测试集来计算测试误差。
首先,通过训练集的数据学习得到参数,然后用测试集计算测试误差。
零阿歪一种方式叫做测试分类,如下图所示。
在完成机器学习系统时,首先要做的就是对模型的选择,这里包括特征项次数的确定、特征数量的选择以及正则化参数的确定等等。那么将数据集分为训练集和测试集是不够的,需要将其分为三个部分:训练集、验证集、测试集。
首先分析如果将数据集之分成训练集和测试集两部分:
用训练集计算出每种模型对应的何时参数,然后用测试集计算得出测试误差,选择测试误差最小的模型作为最终模型,最后在使用测试集测试选择的模型的泛化能力。很多时候,这种方法并不能得到很好的预期,主要是因为引入了一个新的参数d,并且是使用测试集拟合了参数d,再用测试集观察泛化,那么就很容易又出现过拟合现象。
因此,将数据集分成训练集和测试集两部分通常不是一个很好的方法。
更优秀的方法是将数据集分为训练集(60%)、验证集(20%)和测试集(20%)三部分。
主要变化在于,我们使用验证集拟合参数d。
如果一个算法的表现不理想,那么多半会出现两种情况,一种是偏差比较大(欠拟合问题),另一种是方差比较大(过拟合问题)。
过拟合(高方差):训练误差较小,但是验证误差较大。
欠拟合(高偏差):训练误差和验证误差都比较大,两者接近。
正则化可以有效地防止过拟合问题,这一小节主要介绍正则化与偏差方差具有怎样的关系。
正如上图所示,当正则化参数过大,那么为了使代价函数最小化,参数就会很小,就会导致欠拟合问题。
当正则化参数过小,参数就会很大,就会导致过拟合问题。
为了选择合适的,我们又计算了训练误差、验证误差、测试误差(无项)
为了选择合适的,我们通常先将其设为0,以步长为2的速度增大。
步骤如下:
如上图可以看出,当正则化参数比较小时,训练误差较小,验证误差较大(过拟合问题)。
当正则化参数比较大时,训练误差较大,验证误差较大(欠拟合问题)。
如果想检查一下学习算法运行是否一切正常或者希望改进算法的表现,那么学习曲线就是一种非常好的工具。
所谓学习曲线,就是描述训练误差和验证误差的曲线。
如果模型表现较好,我们可以得出以下结论(如下图所示)
当样本数量较小时,训练误差性较小,验证误差较大。随着样本数量的不断增加,不能保证对每一个样本都具有完美的拟合效果,所以训练误差不断增加,同时,模型泛化能力越来越好,验证误差不断减小,当样本数量达到一定量时,验证误差与训练误差的值接近。
当模型处于高偏差(欠拟合状态)时,我们可以得出以下结论(如下图所示)
当样本数量较小时,训练误差性较小,验证误差较大。随着样本数量的不断增加,训练误差不断增加最终区域水平,验证误差不断减小也趋于水平,当样本数量达到一定量时,验证误差与训练误差的值接近,并且误差较大。
当模型处于高方差(过拟合状态)时,我们可以得出以下结论(如下图所示)
当样本数量较小时,训练误差性较小,验证误差较大。随着样本数量的不断增加,训练误差不断增加,但误差依旧很小,同时,模型泛化能力并不好,虽然验证误差在减小,但仍处于一个很大的误差值,当样本数量足够多时,验证误差与训练误差的值接近。
在10.1中我们提到了当模型误差较大时的一些方法,这一小节我们主要讨论什么情况应该用什么方法才是不徒劳的。
该小节以垃圾邮件分类举例
为了应用监督学习,要先需要确定如何来表示邮件的特征向量x和分类标签y,就可以使用逻辑回归方法进行分类。可以提出用100个单词作为特征向量,来区分垃圾邮件或非垃圾邮件。
如何在有限的时间内让垃圾邮件分类器具有高精准度和低错误率:
如果要研发机器学习产品或者开发机器学习应用,不建议刚开始就使用非常复杂的特征向量。
而是在最开始,选择简单较容易实现的算法,使用交叉验证集测试数据。然后根据绘制出的学习曲线,观察是否存在高偏差或者高访察的问题,找到合适的方法改进。最后,再进行误差分析,观察出现错误的样本有什么共同的特征和规律,精进算法。
在改进学习算法时,另一个技巧是保证自己对学习算法有一种数值估计的方法。(这样做将会让我们能更快地做出决定,比如是否使用词干提取)
建议在验证集上进行误差分析,而不是测试集。
不对称分类映射着偏斜类问题(正例和负例的比例接近一个极端的情况)
举例:预测病人是否患有癌症
最开始,使用验证集测试机器学习模型,发现只有1%的错误率,这个时候我们可能认为这个准确率还不错。但是如果这个验证集中只有0.5%的人患有癌症,那么这个机器模型的表现就没有那么好了。因为即使我们使用一个非机器模型,也就是直接设定y=0.5,这个非机器模型的错误率指由0.5%。(虽然这个模型肯定是不对的)。因此面对偏斜类问题不能仅通过准确率来判断一个模型的好坏。
在偏斜类问题中,常用的评估度量值为查准率和召回率。
对每个样本进行预测时,会出现四种情况:
预测值/真实值 | 1 | 0 |
1 | 真阳性 | 假阳性 |
0 | 假阴性 | 真阴性 |
查准率:所有预测患有癌症的病人中,真正患有癌症的病人的比例。
真阳性/真阳性+假阳性
召回率:所有真正患有癌症的病人中,预测出患有癌症的病人的比例。
真阳性/真阳性+假阴性
在不对称性分类问题中,查准率和召回率都是越高越好。并且在这种情况下,运用查准率和召回率评估模型要比用准确率好得多。
在很多机器学习应用中,一个模型如果查准率比较高,通常召回率就会低一些。如果召回率比较高,查准率就会低一些。因此,查准率和召回率的权衡就至关重要。
依旧以预测癌症这个问题为例
如果具有较高的临界值,那么就是等于在非常确定的情况下,再告诉病人患有癌症,这种情况下,查准率较高,召回率较低。
如果具有较低的临界值,那么就是等于以更加保守的方式,告诉他们患有癌症,这种情况下,查准率较低,召回率较高。
也就是说很难实现查准率与召回率都很高,因此,查准率和召回率的权衡就至关重要。
通过绘画图像,我么可以得出不同临界值条件下,查准率与召回率的关系,如下图所示。(查准率和召回率的取值范围均为[0,1])
那么,究竟怎样权衡召回率与查准率呢?
我们引入了一个评估度量值,的值越大,模型表现越好。
问:在什么情况下,增加样本数量对提高模型表现有用?
答:在具有足够的特征值
支持向量机(SVM)能够提供一种更为清晰和更加强大的方式。
首先,要画出当y=1和y=0时逻辑回归和SVM的单一样本的代价函数。
当y=1时,逻辑回归和SVM代价函数如左图所示。(SVM代价函数图像为粉色曲线,记为。)
当y=0时,逻辑回归和SVM代价函数如右图所示。(SVM代价函数图像为粉色曲线,记为。)
逻辑回归的代价函数为:
根据上面提到的曲线图,先将逻辑回归代价函数的对数部分换为对应的和,再去掉,因为去掉一个常数项,不影响最小化代价函数时对的选择。最后再修改正则化一项,将正则化参数去掉,在第一项前面增加参数C,其实效果是一样的。
与逻辑回归不同的是,支持向量机并不会输出概率,而是直接输出预测值为1还是0。
有时人们会将支持向量机叫做大间距分类器。
在上面所学到的监督学习算法中,每一个样本都具有一个标签值,将x与y一同输入到算法模型中,找到表现最好的算法。
但是,在无监督学习中,每一个样本都不具有标签值,通过实现算法为我们找到训练数据的内在结构。将无标签数据集划分成一系列点集(称为簇)。能够划分这些点集的算法,就被称为聚类算法。
将无标签的数据集分成有紧密关系的子集或是簇,K-Means是最为广泛运用的聚类算法。
步骤:
- 随机生成k个聚类点(k为要分成的类)
- 计算每个样本到各个聚类中心的距离,选择最近的聚类中心,成为该类
- 持续迭代,指导聚类中心不再变化为止
K表示分类的个数,将赋值为离他最近的聚类中心。
使用迭代的思想,先将赋值为离他最近的聚类中心,然后计算平均值,重新找到各个聚类中心。
如果存在欸有点的聚类中心,一般我们直接将这个聚类中心移除,但是这样做的结果会使最后产生k-1个聚类,如果想要得到k个聚类,可以重新随机该类的聚类中心。
K均值算法的代价函数
其中,表示第个样本所属于的类,表示第个类别的中心点的位置,表示表示所属类别的中心点的位置。
代价函数表示的也就是各个点到其所属类别的中心点的位置。我们的目标就是找到使代价函数最小的和。
合适的初始化值也可以避免局部最优解的问题。
首先,应该清楚的是聚类中心数目(K)应该小于样本数目(m)。
我们通常采用的方法是随机初始化的方法。
我们会在m个样本中,随机选取K个样本作为出事的聚类中心点,因为最开始选取的样本不同,可能会得到不同的分类。
我么可以看到上面的分类是我们想得到的分类,下面两个图的分类则是局部最优。
针对这种问题,我么采取的方法是多次随机初始化(50-1000次比较合理),最后比较多次运行的结果,选择代价函数最小的结果。
这种方法在K比较小的时候适用(2,10),如果K比较大,即使多次随机初始化,可能结果也不会得到明显的改善。
选择簇类数量,我们最常使用的方法还是,根据可视化或者观察聚类算法的输出,手动去选择聚类的数目。
选择聚类的数目并不容易,很大程度上是因为通常在数据集中,有多少个聚类是不清楚的。
比如下面这个例子,可以认为i是分为四类,也可以是两类。
选择聚类数量的时候,有一个方法叫做“肘部法则”,但是不能解决所有问题。
肘部法则:绘制出代价函数随聚类数量变化的曲线。
如果产生的曲线如左图所示,那我们很容易就能找出拐点,作为最佳的K值,但如果曲线如右图所示,则该方法不适用。
第二种类型的无监督学习问题是降维,有几个不同的原因可能让你想做降维,第一个是数据压缩。数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,也可以加快我们的学习算法。
降维:数据集可能还会有很多个特征值,有一些特征值是冗余的,将数据集降维。
距离:一个数据集中有两个特征值,用厘米表示物体的长度,用英寸表示物体的长度,我们想要做的就是用一个特征表示,也就是将二维数据集降为一维。(可能存在偏差,是因为精度和误差等问题)
降维的第二个应用就是可视化数据。
在很多问题中,我们都需要将数据可视化,了解其中关系,找到合适的解决方法。那么如果特征数量较多,将其可视化就会非常困难,所以要运用降维的方法。
举例:一个数据具有50个特征(总GDP,人均GDP,人类发展指数等),如果想将这50个特征进行可视化就会很困难,可以降维后再可视化。
我们将数据集降至二维之后进行可视化,但是有一个问题就是降维后的特征的意义需要我们自己总结。在这个例子中,我们可以理解为代表国内生产总值(总GDP),代表人类幸福指数(可以理解为人均GDP)
对于降维问题,最常见的方法就是主成分分析(PCA)的算法。
PCA所做的就是试图寻找一个投影平面对数据进行投影,使每个点到它们对应的支线上的投影点(投影误差)最小化。
在应用PCA之前,常规的做法是先进性均值归一化和特征规范化,使得特征值,的均值为0,并且其数值在可比较的范围之内。
在这个例子中,是将二维降至一维,PCA要做的就是找到一个数据投影后能够最小化投影误差的方向向量。如果是要将n维特征降至k维,PCA要做的就是找到k个方向向量。
PCA与线性回归的区别(两种不同的算法):
- 线性回归最小化的是某个点与假设得到的预测值之间的距离,PCA最小化的是这些点与红色直线之间的最短距离。
- 线性回归是用输入的特征值预测y值,而PCA一视同仁,没有预测。
左图是线性回归的误差(垂直于横轴投影),右图是PCA的误差(垂直于方向向量)
在使用主成分分析算法之前,需要做的事数据的预处理,最重要的是执行均值标准化,有可能也要进行特征缩放。(与监督学习部份一致)
PCA将数据集从n维降到k维的步骤:
- 均值归一化,,其中(均值),代表方差。
- 计算协方差矩阵,
- 计算协方差矩阵的特征向量,(奇异值分解),这里主要要理解U,其中,U是一个n*n的矩阵,因为要降维至k维,所以我们去除矩阵U的前k列,作为k个方向向量,新的特征向量,是一个k*1的向量。
该小节主要讲述了怎么讲压缩后的特征还原为压缩前的特征。
降维:
压缩重现:
该小节主要讲解了PCA算法执行中k(数据主要成分的数量)的选取。
PCA所做的就是试图寻找一个投影平面对数据进行投影,使每个点到它们对应的支线上的投影点(投影误差)最小化。
投影的平均均方误差:
训练集的方差:
我们希望找到最小的k使得(平均均方误差与训练集方差的比例)是一个很小的值。如果我们希望这个比例小于等于1%,也就是说我们保留了99%的方差。当然,这个比例也可以是小于等于别的值,一般希望保留95%-99%的方差。
在实际编写时,可以先令k=1,然后计算这个比例是否小于等于1%,如果不小于等于,则让k=2,以此类推,找到最小的k。
同时,还有一种比较简洁的方式,调用svd时,返回三个参数。其中,是一个对角矩阵。使得,找到最小的k。
通常也可以使用PCA对监督学习的数据集进行降维,加快算法执行速度。比如有一张100x100像素的图片,即总共有10000个特征,可以采用PCA降维至1000个特征,可以提高算法运行速度。
值得注意的是,仅仅在训练集运行PCA,得到x到z的映射后,再作用到验证集和测试集上。在大部分数据集中,大概能将特征减少到1/5或者1/10.仍然保留大部分的方差,几乎不影响性能。
常见的对PCA的误用:
- 尝试使用PCA去防止过拟合,解决过拟合更好的方法是采用正则化,而不是PCA。因为PCA的工作流程,完全不考虑结果y,根据x会舍掉一些信息,因此可能会丢掉一些有价值的信息。
- 默认将主成分分析作为机器学习系统设计的一部分,在使用主成分分析之前,我们应该先使用原有数据集训练模型,如果无效,再使用主成分分析方法。
异常检测是机器学习中常见的算法,有趣的是,他主要应用在无监督学习中,但又和监督学习必将相似。
举例:生产飞机引擎时进行质量检测,首先提取出飞机引擎的一些特征,假设生产了m个飞机引擎,则构成数据集,绘制出如下所示的散点图。所谓的异常检测,就是对于一个新生产出来的飞机引擎,检测其是否合格。我们假设之前的m个飞机引擎都是合格的,给定无标签的训练集,对数据x的概率分布p(x)建模。如下图所示,在蓝色圈内的表示合格,蓝色圈外的表示异常。
当我们建立了对x概率分布模型后,我们就可以检测新的数据。如果,我们则认为该样本异常,如果,我们则认为该样本正常。
异常检测的其它应用:检测欺诈或异常用户、数据中心的计算机监控等等。
高斯分布也称作正态分布,可以应用高斯分布开发异常检测算法。
如果x符合高斯分布,我们可以表示为,其中,是均值,是方差。
概率密度函数为。其中,
高斯分布的例子:
上图红色部分面积都为1。
假设我猜测这些样本来自一个高斯分布的总体,假设我猜测每一个样本服从某个分布。参数估计问题就是根据给定的数据集,我希望能估算出和 的值。参数估计的公式为:,。
应用高斯分布来构建一个异常检测算法。
步骤:
- 选择合适的特征变量
- 拟合参数。其中,
- 对于给定的计算
- 如果,则认为该样本正常;如果,则认为该样本异常。
异常检测结果如下图所示。
该小节重点关注如何评估一个异常检测算法。
实数评估的重要性:他的主要思想是,当你为某个应用开发一个学习算法时,你需要进行一系列的选择,比如选择使用社么特征等等。如果有某种方法,通过返回一个实数来评估算法,那么对这些选择做出决定往往会容易很多。比如,现在有一个新的特征,该不该纳入这个特征呢?如果分别在纳入该特征和不纳入该特征的情况下运行算法,然后返回一个数字,来告诉你这个特征对算法的影响是好还是坏。这样可以更简单决定要不要纳入这个特征。
开发一个异常检测系统的步骤:
- 首先,选择一部分正常(无异常)的数据作为训练集;然后,用剩下的正常数据和异常数据分别平分混合构成验证集和测试集。
- 根据训练集的数据,拟合参数,构建p(x)函数。也就是m个样本都用高斯函数来拟合。
- 对交叉验证集,使用下面公式预测该样本是否正常: 如果y=1,则该样本异常;如果y=0,则该样本正常。其中的选取,可以尝试不同的作为阈值,使得最后的最大。(通过计算真阳性、真阴性、假阳性和假阴性计算查准率和召回率)
- 最后使用测试集对算法评估
针对不同问题可以选择异常检测或者监督学习
异常检测 | 监督学习 |
非常少的正向样本(y=1),大量的负向样本(y=0) | 同等数量的正向样本和负向样本 |
异常的种类较多,未来会出现很多未出现过的异常,比如飞机引擎会因为不同原因产生异常。 | 未来出现的异常和训练样本中的一场一样。 |
例子: 欺诈用户检测、生产飞机引擎、数据中心的机器监视 | 例子:邮件过滤器、天气预报、肿瘤分类 |
当应用异常检测时,其中有一个因素对运行有很大影响,那就是特征的选择。
如果数据的分布不是高斯分布,可以先使用一些数学公式将数据转化为高斯分布。例如:或者
在选择进行异常检测的特征之前,可以先进行误差分析。
在异常检测系统中,会出现一个问题:异常样本的概率也很高,因而算法会将这样的样本认为是正常的。这时候,误差分析就能起到一定的作用。可以分析这些被预测错误的样本,观察是哪一方面出现了问题,进而增加一些新的特性,以便提高异常检测的效果。
举例:在数据中心的机器监视问题中,最开始,有一些由于进入循环而产生异常的计算机不会被认为是异常,通过误差分析,我们添加新的特征(CPU的负载/网络流量)
如果我们采用了两个相关的特征进行异常检测,一般的高斯分布可能会将异常数据认定为正常数据。
如下图所示,绿色的点可能对于和两个特征的高斯分布都有较大的概率,会被认为成正常样本,但很明显,其很有可能为异常样本,原因在于一般的高斯分布获得的判定边界为粉红色的线,而多变量高斯分布获得的是蓝色的线。
很明显,在这幅图中,三个绿色的点的概率不应该相同,但是在一般的高斯分布中,却赋予了相同的概率值。
多元高斯分布,又叫多元正态分布。与一般的高斯分布不同的是,多元高斯分布不再分别计算每个特征对应的概率然后将其累乘起来,而是用所有的特征一起构建P(x),公式如下:
,其中是一个向量,其中元素为每一行数据的均值,
上面四图展示了不同和对应的高斯分布图。
使用多变量高斯分布进行异常检测的步骤:
- 通过给定的数据集拟合模型P(x),其中是一个向量,其中元素为每一行数据的均值,
- 对于给定的新样本,计算,
- 如果,则认为该样本异常。
下图为使用高斯分布后的预测判定界限。
一般的高斯分布都是关于x和y轴轴对称的。一般的高斯分布可以想象成当时的多变量高斯分布。
原始高斯分布模型与多变量高斯分布模型的区别:
原始高斯分布模型 | 多变量高斯分布模型 |
不能自动捕捉特征之间的相关性,但是可以手动增加新的特征(一般为原有特征的组合) | 可以捕捉到特征之间的相关性 |
计算代价高,即使样本数量较大,也同样适用 | 计算代价比较高,因为涉及到协方差矩阵及其逆矩阵的计算。适用于样本数量较小时 |
对m和n的值没有要求 | 要求m(样本数量)> n(特征数量),否则协方差矩阵不可逆。一般情况下,满足m>10n,才使用多变量高斯分布模型 |
最后,其实原始模型被使用的更广泛一些。
当使用多变量高斯分布模型时,如果出现了协方差矩阵不可逆,一般可能是两个原因造成的。
推荐系统是机器学习中的一个重要的应用。
推荐系统拟在解决的就是根据用户对物品的评分等,对用户进行推荐
举例:用户A,B,C,D分别对五部电影中的某几部进行评分,系统根据这个评分,将违背评分的电影预测评分。如下图,很明显用户A,B更倾向爱情片,用户C,D更倾向动作片。
其中,代表用户的数量,代表电影的数量,代表用户j给电影i评过分,代表用户j给电影i的评分(只有当时成立)
在基于内容的推荐系统中,对于要被推荐的物品通常都有特征向量,在电影推荐的例子中,每部电影都拥有两个特征和,代表爱情片程度,代表动作片程度。
在电影推荐这个例子中,我们对每一个用户都构建了一个线性回归模型。是第个用户的参数向量,表示第个电影的特征向量,那么第个用户对第个电影的评分就可以预测为。
代价函数:
其中,表示对于用户,只对评分过的电影进行求和。并且一般的线性回归代价函数前面的系数为,由于是一个系数,乘以一个常数不影响对参数的选择。
梯度下降:
对参数的第一项不进行正则化。
协同过滤有一个很有意思的特性,叫做特征学习。这种算法能够自行学习所要使用的特征。
在上一节,主要讲述的是拥有被推荐全物品的特征可以得到用户的喜爱参数;相反,如果我们掌握了用户的喜爱参数,也可以得到最合适的被推荐全物品的特征。对于这两种情况的代价函数很相似。
给出被推荐全物品的特征():
给出用户的喜爱参数():
在拥有被推荐全物品的特征或者用户的喜爱参数时,基于内容的推荐算法就可以很好地完成预测以及推荐。但是,事实上,我们不会花费大量是人力,财力以及时间去调查每个电影的爱情程度和动作程度,这时候,这种方法就不可行了,因此,引出了下面要介绍的协同过滤。
协同过滤算法可以先随即猜测一组,通过迭代的方式,可以得到很好的和,并且最后收敛得到一组很好的用户喜爱参数以及被推荐物品的特征。(只能建立在每个用户都对数个电影进行了评分)
上面我们讲述的是,通过迭代的方式,可以得到很好的和,但实际上存在一个更有效率的算法,让我们不需要不停的计算和,而是能够将和同时计算出来。我们需要做的是将两个代价函数结合为一个。
在使用这种结合为一个代价函数的方法时,特征值是n维向量,不再是n+1维,因为不需要设定。因此,也是一个n维向量,自然而然也不存在不需要对进行正则化的问题。进而我们可以得到梯度下降的公式。
协同过滤算法的步骤:
- 初始化为一些很小的随机值
- 通过使用梯度下降法最小化代价函数,得到和
- 对于已经得到的和,进行评分预测。
该小节主要讲述的是有关协同滤波算法的向量化实现,以及该算法可以做的其他事情。
在这一小节中,主要实现的就是使用向量化的方式对电影评分进行预测。
Y矩阵就是用户实际对电影的评分,在该例子中,有5部电影,4个用户。因此,Y矩阵就是一个5行4列的矩阵。
预估的评分为:
其中,,
使用协同过滤算法还可以推荐相似的影片:当用户正在观看电影时,想要再推荐5部电影给用户。可以根据电影的特征值进行推荐,找到5部电影使得是一个很小的值,那么就可以证明两部电影很相似,进而可以进行推荐。
使用均值归一化,有时候可以让算法执行得更好。
当对于一个没有对任何电影评过分的用户E会进行怎样的操作呢?
当最小化代价函数的时候,只有这一项可以影响代价函数,因此为了保证代价函数足够小,会将都赋值为0,那么用户E对所有电影的评分都为0,这样就会没有任何意义。
为了避免这种情况的发生,我们可以对数据进行均值归一化,也就是先按行算出评分的平均值,然后。拿新的Y矩阵再去预测评分,预测完之后,需要将平均值再加回去。这样可以确保第一次位用户进行预测时,每个电影的评分都为平均值。
我们可以发现当下的学习算法比五年前运行的更好,原因之一是我们有极其庞大的数据量。
但是庞大的数据量也会存在问题,比如计算问题,假设训练集的大小m为1000000000,假设像训练一个线性回归模型或者逻辑回归模型,我们会发现进行梯度下降时,会计算超过一亿项。因此在进行模型的训练之前,我们应该考虑为什么不只用一千个样本?(也就时说思考一下可不可以减少样本数量)
我们在进行模型训练之前常常会,先取数据集的一个子集,绘制学习曲线。如果曲线如左图所示,那么增加样本可以得到更好的效果;但是如果曲线如右图所示,即使增加样本数量,可能也很难得到更好的效果。
对于很多机器学习算法,例如:线性回归,逻辑回归以及神经网络等等,我们都是提出一个代价函数,使用梯度下降这样的方法,拟合参数使代价函数最小。但是,在数据量非常庞大的时候,梯度下降算法的计算量会变得非常大,因此,引入下面要介绍的随机梯度下降。
批量梯度下降:
代价函数:
梯度下降:
批量梯度下降的每一次迭代都需要遍历所有数据样本,因此计算量大,速度慢。
随机梯度下降:
代价函数:
梯度下降:
随机梯度下降的步骤:
- 随机打乱所有数据,将这m个样本重新随机排列。
- 使用单一样本对参数进行更新。(使用上述梯度下降遍历)
批量梯度下降:每次迭代使用全部样本。
随机梯度下降:每次迭代使用1个样本。
小批量梯度学习:每次迭代使用b个样本。2-100是b常用的取值范围。
假设b=10,m=1000,小批量梯度下降公式如下:
批量梯度下降 | 随机梯度下降 | 小批量梯度下降 | |
优点 | 每次迭代都朝着梯度方向,收敛较快。 | 每次迭代只针对单一样本,速度较快。 | 如果拥有很好的向量计算库,每次迭代的小批量样本可以并行求和。 |
缺点 | 当数据集庞大时,计算量大,迭代速度慢。 | 不是朝着梯度下降,有部分点方向不准确,但是没关系。 | 多了一个参数b需要调试。 |
判断梯度下降是否收敛:
批量梯度下降:保证每次迭代中,代价函数都是下降的。但是如果数据庞大,显而易见,计算量将会非常大。
随机梯度下降:我们在每一次更新之前都计算一次代价,然后每次迭代后,求出这次对训练样本计算代价的平均值。
对于上述图片,蓝色曲线展示的是代价函数下降至平缓,因而可以找到收敛点。红色曲线使用了较小的,可以达到同样的效果,只不过收敛速度变慢。
对于上述图片,蓝色曲线表示的是对1000个样本取均值,红色曲线是对5000个样本取均值,因此更平滑。但是,它每隔5000个样本才能得到一个数据点,因此关于学习算法表现的反馈就显得有一些延迟。
对于上述图片,蓝色曲线似乎没有下降,这是由于样本数量太少造成的,噪声太大,其实是有在下降的,只不过由于样本数量较少,噪声较大,看不出下降趋势。如果增加样本数量,可以得到红色曲线。如果增加样本数量后的曲线仍然没有下降趋势,那么需要检查学习算法。
对于上述图片,展示出的是一个发散的趋势,这时我们需要使用较小的。
在机器学习问题中,学习率不是一个常数,如果想要梯度下降更好的收敛,可以逐渐减小。所以,常见的做法是让(=一个常数1/迭代次数+某个常数2)
在线学习与传统的机器学习的区别就在于,不需要将全部数据存储,当我们使用完某一个数据后可以直接丢弃。这种方式可以适应用户的新的变化。
把训练集的数据分给四个电脑运行,最后把结果汇总到一个中心服务器。这样的做法可以是算法执行速度变成原来的四倍。
举例:假设我们有400个样本,将他们分给四个计算机进行运算,最后汇总。
结果汇总为:
如果想要把MapReduce应用在某种学习算法上,通过多台电脑并行计算来实现加速,需要思考的一个关键问题是该学习算法是否可以表示成对训练集的一种求和。
介绍该实例的原因:
- 介绍一个复杂的机器学习系统是如何被组合起来的
- 介绍机器学习流水线的有关概念以及如何分配资源
- 介绍如何将机器学习运用到计算机视觉问题中和人工数据合成
图片文字识别要做的就是从一张图片中识别出文字。
图片文字识别的步骤:
- 文字检测:扫描图片,找出图像中的文字信息
- 字符分割:将文字区域分割成独立的字符
- 字符识别:识别出每一个独立的字符是什么
先以行人检测为例,行人检测比图片文字识别简单的地方在于,矩形具有相似的长宽比。
行人检测的步骤:
- 先确定一个比例标准,我们在这里确定为82x36。接着,从数据集中收集一些正样本和负样本,使用监督学习的方式,对图片进行处理,得到一个可以准确识别性人的模型。
- 尝试在新的图片中找到行人。首先在图片中选取一个矩形框,把这个图块传给分类器来检测图块中是否有行人。将图块向右滑动一些,再传给分类器进行分类判断。矩形框每次移动的距离是步长,也被称为滑动参数。(如果一次移动一个像素,那么步长为1,这种情况虽然表现最好,但是计算成本较高,我们一般选择步长为4或8。)依次遍历图片中的不同位置。接着使用更大的图块按照上述方法依次遍历图片。
图片文字识别的步骤:
- 与行人检测类似,拿出一系列包含正样本和负样本的训练集。其中,正样本代表的是对应区域有文字出现;负样本表示的是没有文字的图块。用该训练集训练模型。
- 与行人检测一样,使用滑动窗口的方式检测图片上的字符。在要检测的图片上运行算法,完成字符识别。(白色为检测到字符,灰色则表示可能有字符,但是概率不高)然后更近一步,将这些分类器的输出应用到一个叫放大算子的东西上。之后,丢弃太高太窄的矩形。
- 字符分割。再次使用监督学习算法,使用一些正样本和负样本。正样本表示有两个字符分割的地方。负样本则表示没有。训练完这些分类器后,我们可以将它运行在文字检测系统输出的这些文本中。(使用滑动窗口进行检测)
- 字符识别。
一个最可靠的得到高性能机器学习系统的方法,是使用一个低偏差机器学习算法,平且使用庞大的训练集去训练他。该小节主要讨论该怎么获取这么多的训练数据。
实际上,机器学习中有一个很重要的概念叫人工数据合成。人工数据合成主要有两种形式。第一种实际上是自己创造数据,即从零开始创造新数据;第二种是已经有小的标签训练集,然后以某种方式扩充训练集。
以图片文字识别为例,获得一个更大的数据集:
- 一种方法是我们可以在网站上下载各种字体,然后应用到不同的背景上,再利用一点模糊算子或者仿射变换,这让我们能够获得一个无限大的训练集。
- 另一种方法是对原有的较小的样本数据集,对其进行扭曲,旋转等操作,形成一个较为庞大的数据集。(声音可以人工添加失真引入不同的背景音乐)
上限分析可以很好的指导我们,工作流中的哪一部分最值得花时间去研究。
为了更好地开发系统,我们可以使用一个数值作为评价度量。比如在图片文字识别这个例子中,我们采用准确率作为这个度量。
假设我们最开始的准确率为72%。我们每次都将某一模块进行人工的改动,提供100%的准确率。
通过上限分析,我们理解了改变某一模块,可以对准确率提高多少。
上限分析的实例:人脸识别
图像预处理(去掉背景)->人脸检测(找到人脸的位置)->分别识别出眼睛、鼻子、嘴,传入逻辑回归的分类器->得到标签
我们还是每次关注一个步骤,假设系统给出的准确率为85%。
- 首先,找到测试集,手动把背景去掉,准确率提高了0.1%。这是一个很明显的信号,不应该花费太多精力在预处理或者背景移除上。
- 接着,遍历数据集,得到正确的人脸位置
- 在此基础上,依次再找到正确的眼睛、鼻子、嘴。直到最后准确率达到100%