分为回归算法和分类算法
先在Octave或者matlab实现,可行,再尝试用Java或者python或者C++重新写出来
只考虑两个变量的线性回归:例如找出一条函数拟合房价的那个例子里面的数据点。
数据集:输入x[i],输出y[i],中间函数是h。使用成本函数(即方差误差,这里假设是只有房屋大小这一个变量,所以线性函数是一条直线,用两个参数表示,m是样本的个数)来衡量我们的假设函数的准确性:
假设θ[0]=0,测试θ1。最低点误差为0,刚好就是实际函数h
测试θ[0]
和θ[1]
。有点类似高中地理的地势图
把上面那张图用立体显示出来就是下面这样,变量x和y就是θ[0]
和θ[1]
,输出变量z是误差(越小越好)。用梯度下降函数来调整θ[0]
和θ[1]
,该函数的第二个部分是导数,注意所有θ要同时调整。可以看到原本位置相差不大的两个点,下降的路径却完全不同。这里的梯度下降函数其实就是找局部最低点。
α可以影响下降的步长(导数的值也会影响),下降的方向就是斜率(导数)的方向,越接近局部最低点,导数的值越来越小,步长也越来越小(α保持不变)
矩阵A的转置和逆矩阵,用matlab测试一下
线代的向量用来代表样本,下标n代表变量(属性),如年龄,面积等等。上标m代表第几个样本。
**考虑多个变量(多元)**的情况下,即h=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5+…+θn*xn,其中x0=1,故省略,成本函数(误差):
梯度下降函数:对比J(θ)可知,是在J(θ)的公式里面去掉平方,乘上x而已
这种梯度下降函数又称为批量梯度下降函数,因为“批量”就表示在画蓝色边框的这个式子里面,每次都得考虑所有的样本进行求和。
特征缩放feature scaling
能够帮助梯度下降函数更快的运行:如下图所示,当考虑两个变量即n=2时,成本函数(误差)画成平面(类似等势图)会是一个椭圆,梯度下降会使θ从边缘从中心点(值最小的点)靠近,但靠近的路径会是来回振荡而缓慢的。通过下图的右边所示,将变量x1和x2通过缩放的方法限制在0到1之间,可以使椭圆变得类似正圆,梯度下降就会很快。
均值归一化:不一定是要0到1,负的0.5到正的0.5,或者-3到3等等都是可以的。但不能是-0.00001到0.00001这么小,也不能是-100到100这么大。如下图所示,可以这样缩放成-0.5到0.5
补充:为什么梯度下降函数中的[a’hua]取值过大会发散
如下图右边所示的A点到B点。由于B点比A点高(函数值大),更加陡峭,故导数更大,导数与α相乘,箭头(步长)就越长了,所以就发散了。而α过小则收敛缓慢,如下图右边绿色的箭头所示。
下面的这种图,是选定一个α后,迭代次数(横轴)和误差值(纵轴)之间的关系。
选取合适的特征值来构建模型
1.例如可以选取房屋的大小这一个值(一元),也可以选取房屋的长和宽这两个值(二元)构建函数。
2.对于下面这个数据集(一元),用一条直线取拟合并不合适;选二次函数取拟合,如蓝色的线条所示,到后面会下降,也不合适;故选取三次函数(右边绿色方框所示,其实采取开根号的幂函数更好),比较合适。但是如果通过如图下方所示,(size)及其平方,立方数量级差距有点大。
其中一个解决办法是令x1=(size),x2=(size)开根号,x3=(size)开立方根。类似题目如下:
正规方程(标准方程)法(Normal Equation)
梯度下降算法需要一步步迭代找到误差最低值,而我们可以利用所学到的微积分的知识,知道函数最低点就是导数为0的点。正规方程就是用来找到这个点的。如下图所示,构建出矩阵X和向量y,用最下方的红色方框圈出来的那个公式直接求出最终的θ
可以用matlab实现这个公式
梯度下降算法和用正规方程的优缺点对比:梯度下降算法需要不断尝试α以及多次迭代,而正规方程可以一步到位,而且不需要特征缩放。但是正规方程在计算"矩阵X的转置乘以矩阵X"这一步时,时间复杂度是O(n^3),但n到达一万的时候就会开始有点慢了,而梯度下降算法就算百万级别都可以。而且正规方程在有些复杂的算法中不适用,只能用梯度下降算法。
备注:当矩阵X是不可逆矩阵的时候,可能原因和解决办法如下:
分类问题,y=0成为负类,y=1称为正类。
用线性回归来预测分类问题:例如我们设置阈值为0.5,即意味着函数值大于等于0.5则y=1,否则y=0(函数值等于0.5时也可以是y=0)。
P=(y=1|x;θ)表示在x和参数θ情况下,y=1的概率。
逻辑函数(等同于S型函数(sigmoid))-> 逻辑回归(以线性回归为基础)
该函数坐标趋向于0,右边趋向于1,x=0时y=0.5,并且左右对称。 因此正好可以利用这一点,将自变量换成h=θx,当h>0时预测y=1,h<0时预测y=0
注意g(z)是1./
不是 1/
。
现在tanh函数几乎在任何场景都比sigmoid函数好,除了二分类。如果不知道用哪个,就用relu函数,更快。
决策边界
不一定只使用一次幂,可以使用多阶函数。例如h=θ0+θ1x1+θ2x2+θ3*x12+θ4*x22等等。或者可以使用其他更复杂的函数,只要变量个数正确即可,例如只有两个变量就只能是x1和x2。
h=θx画出来的线就是决策边界,由θ决定,而不是数据集决定。
逻辑回归的成本函数(误差)
分情况讨论Cost(θ),而不再是线性回归里面简单的h(x)-y
上面两种情况可以合二为一,以及向量化实现**(向量化实现,也就是用numpy库,可以避免使用for循环,大幅度提高运行效率,“避免使用for循环”是一个经验法则):**
(但是有些情况,例如神经网络的正向传播,显式for循环是避免不了的)
matlab里面的句柄(符合:@)!!
https://www.cnblogs.com/Hand-Head/articles/8863702.html
注意掌握两种用法,一种是类似自定义函数 myfunc=@(x)(x^2-2*x+1) 再 myfunc(2)
。一种是自定义函数,例如在myfunc.m文件里面定义函数myfunc,然后就可以func1 = @myfunc 再 func1(2)
matlab里面的fminunc函数!!
https://www.cnblogs.com/Hand-Head/articles/8863702.html
1.这个函数的功能是传入一个函数,计算这个函数的最小值,例如可以[a,b,c]=fminunc(@(x)(x^2-2*x+1),-1)
,a是x值,b是y值,c表示是否收敛。
2.而在机器学习里面,我们用这个函数来计算成本函数(误差)最小值时的θ值(也就是x值)。可以用第1点提到的用法去用,matlab会调用比梯度下降函数更加高级(速度也快得多)的方法去计算(计算下一步应该用哪个θ值(x值)测试)。
也可以用我们自己定义的梯度下降函数,具体做法是在传入的成本函数的返回值里面,设置第一个返回值是y值,第二个返回值是下图中方框计算出来的值,matlab会自动调整设置α,然后得到下一次要用到的θ值(x值)。然后在fminunc函数里面加个options参数,值为options = optimset('GradObj','on','MaxIter','10')
。matlab的函数的参数很多有这种key-value,key-value对应的关系,如这里’GradObj’和’MaxIter’是指定变量,'on’和10是变量的值。
过度拟合(overfit)
1.概念
1)欠拟合 = 高偏差
2)拟合过度 = 高方差
3)泛化 即 能够推广,拟合新的数据
2.解决办法
1)减少变量(特征值):手动选择需要保留的变量 或者 使用模型选择算法
2)正则化:可以保留所有变量
正则化
思路:例如在房价的那个例子里面,高次幂反而会导致过度拟合,于是在成本函数(误差)里面添加对某些θ的惩罚
对除θ0以外的θ都进行惩罚,会有比较好的结果,公式如下。但如何公式里面的λ过大,会导致欠拟合,因此需要合理设置λ
正则化后的成本函数(误差)
正则化后的梯度下降函数
正则化后的正规方程(直接用矩阵算出)
上面用到的回归模型可以看成是只有输入层和输出层的神经网路模型。
如果变量很多,例如100个,即使只考虑两两组合,即x1x2,x2x2这种,也有5000个θ,如果考虑三个组合,则上百万个θ
在识别汽车的例子中,5050个像素就2500个变量了,太大。
神经网络模仿生物的神经元,树突接受输入,轴突输出。
第一层是输入层,最后一层是输出层,中间是隐藏层。θ[上标j]表示从j层到j+1层的θ矩阵,如果第二层有4个神经元,第一层有2个神经元,那么θ[上标1]的维度是4(2+1)= 4*3。注意每一层在输出的时候都会加上一个第0个神经元,赋值为1。
神经网络每一层到下一层都是g(z)也就是逻辑回归函数计算的。也可以是ReLU线性整流函数。从第一层到最后的输出层,这样的顺序也称为前向传播。
向量化实现:
异或XOR : 两个全为0或全为1,返回1
异或再取反XNOR : 两个里面有且只有一个为1
1.首先是逻辑或的神经网络例子:h(x)=θ0+θ1x1+θ2x2,当θ=[-10,20,20]时,就是逻辑或,因为只有当x1和x2全为0时,h(x)才为0,其他情况都为1
逻辑与的例子,取θ=[-30,20,20]
如果取θ=[10,-20,-20],可以表示(NOT x1)AND(NOT x2)
2.将上面三种结合起来,两层神经网络就可以实现XNOR了
将数据集六二二分,六分训练、二分cv调整(validation set 交叉验证)、二分测试
这里用来调整函数的最高次幂d
高方差variance(过拟合)与高偏差bias(欠拟合)
λ是惩罚高次幂项的那个参数,λ很小时训练集误差最小,拟合度最高,但会导致过拟合;λ很大时训练集误差会比较大,拟合度降低,但能防止过拟合。
我们要找出上图中指出的那个点
高偏差bias的话,增大数据量是没有用的
高方差的话,增大数据量是有用的
六种操作分别可以解决的问题
偏斜类
例如换癌症的人大约占总数的0.5%,因此就算全都预测为0(不患癌症),准确率也有99.5%。
说明:一般令y=1代表概率很少发生的事情,例如患癌症
解决办法:通过计算precision和recall的值来看(准确率和召回率)。如果阈值设置得很高,例如设为h(x)>=0.9才令y=1,则准确率很高,召回率很低,很可能会漏判;如果令阈值为0.3,则准确率很低,召回率(即预测y=0的正确率)很高。
再计算F值,值越高说明算法越好,权衡了准确率和召回率。这个测试应该放在cv test里面
聚类
聚类是无监督学习算法中的一种。
K-means算法(K均值算法)
算法流程:
1)给定两个点作为簇类中心(cluster centroids),计算数据点到这两个点的距离,距离短的就属于那个簇,染色。计算误差函数J(θ)
2)计算各个簇的所有数据点的平均值,将平均值作为那个簇的簇类中心。
3)褪色,重复1)和2)步骤。
补充:C[上标4]=3 表示第4个点属于第3个簇。
说明:
1)**误差函数J(θ)**公式如下,会不断减少,不会上升。
2)一开始簇类中心应该随机分布,尝试多次才会有比较好的结果。例如下图中,虽然都是三个簇类中心,但右下角两个明显是由于初始化不好导致了不好的分类。
3)关于一开始要选取多少个簇类中心,也就是簇类中心数K是多少。首先应该根据需求,其次可以尝试多个簇类中心数画出曲线,如果有肘点就选那个点。
降维
降维的动机
1)数据压缩,以节省内存和硬盘空间。例如下图中一个是厘米和英寸冗余,可以降至一维;一个是把3维降到2维。
2)高维数据可视化。例如一个国家的数据有50个特征,如GDP,人均寿命等等,降至二维或者三维,就能将数据画图出来了(可视化顶多画出3D,也就是三维)。问题在于,降维算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。
降维的算法——PCA(主成分分析)
1)PCA问题的公式描述
a)PCA 要做的是找到一个方向向量(Vector direction),当把所有的数据都投射到该向量上时,投射平均均方误差尽可能小。如下图,右边是PCA,找的是点到向量的垂直距离;而左边是线性回归,找的是误差值(y值误差)。
b)PCA问题要将n维数据降至k维,目标是找到向量u(1) ,u(2) ,…,u(k) 使得总的投射误差 Projected Error 最小
2)PCA算法过程
a)零均值化。计算出所有特征的均值,然后令 xj = xj − μj 。如果特征是在不同的数量级上,还需要将其除以标准差 σ2 。
这里x的均值是1.81,y的均值是1.91,于是变成
b)计算协方差矩阵(covariance matrix) sigma Σ
下图中第一个∑是协方差矩阵的意思,第二个Σ是求和的意思。
c)计算协方差矩阵 Σ 的特征向量(eigenvectors):在 Matlab 里我们可以利用奇异值分解(singular value decomposition)来得到特则向量矩阵 U,调用方式为 [U, S,V] = svd(sigma) 。(注:函数返回的矩阵 S 也有用,后续会讲到)
d) 如果希望将数据从 n 维降至 k 维,只需要从 U 中选取前 k 个向量,获得一个 n × k 维度的矩阵,用Ureduce 表示,然后通过如下计算获得要求的新特征向量 z(i):
3)重建原始特征
当 x 为 2 维,z 为 1 维,z = UreduceT * x, 则相反的方程为: xappox = Ureduce ⋅ z, 这时有 xappox ≈ x。
4)如何选择主成分的数量K(也就是压缩后的维数)
首先计算“平均均方误差与训练集方差的比例”,如果结果是1%,那就说明有99%的原本数据的偏差被保留了下来。通常95%到99%是最常用的取值范围。(注:许多数据集都可以在保留大部分差异性的同时大幅降低数据的维度,因为大部分现实数据的许多特征变量都是高度相关的。)
公式如下:
得到K的过程如下:
a) 先令 k = 1,然后进行主要成分分析,获得Ureduce 和z,然后计算比例是否小于1%。
b) 如果不是的话,再令k = 2,如此类推,直到找到可以使得比例小于 1%的最小k 值。
改进:
第a)步中,我们在svd()的时候除了得到U,也得到了S,可以用S来直接计算“平均均方误差与训练集方差的比例”。就不需要算那个麻烦的公式了,直接一点点增大下式中的k即可。
应用建议:
机器学习中的应用:降维,将通过Ureduce得到的z替换原来的x,然后进行机器学习预测。(n是指n维,k是指k维,m是指样本个数,R[上标n]是指n维的数据(有理数集))
正确用法:
1)压缩数据,然后可以用来减少内存/磁盘空间,或者加快算法运行速度。
2)可视化数据(二维或者三维)
错误用法:
1)用于减少过拟合。(应该用正则化)
2)在项目开始时便将PCA考虑进去。(先不用PCA,必要的时候才用)
额外备注
还有一种自编码器autoencoder也可以用于降维(比喻:将一幅图片打上马赛克,还可以重新还原)
有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数据:
6000 台正常引擎的数据作为Training set;
2000 台正常引擎和 10 台异常引擎的数据作为CV set
2000 台正常引擎和 10 台异常引擎的数据作为Test set
计算p(x),对比ε,预测哪些数据点异常。
由于正常的数据比异常的数据多很多,是偏斜类,因此要根据计算出precision和recall来评价。
异常检测与监督学习的对比
异常检测的选择特征
1)最好还是将数据转换成高斯分布,例如: 使用对数函数 x = log(x + c),其中 c为非负常数; 或者 x = xc ,c为 0-1 之间的一个分数。
2)一些异常的数据可能也会有较高的p(x)值,因而被算法认为是正常的。如下图。
解决办法:通常可以通过将一些相关的特征进行组合,例如增加两个特征值的比例这一特征。例如下面这个例子,用 CPU负载与网络通信量的比例作为一个新的特征,当CPU负载很高但网络通信量很低(说明不是网络通信造成的CPU负载高)时,说明出现了异常。
多元高斯分布
所需场景:
算法过程如下,最后跟原来的一样,计算出p(x)后跟ε比较即可:
其中,协方差矩阵对模型的影响(不懂。。。):
均值μ对中心点的影响:
原始高斯分布模型和多元高斯分布模型对比
a)原高斯分布模型使用较广泛,如果特征之间在某种程度上相互关联,可以通过构造新特征的方法来捕捉这些相关性。
b)如果训练集不是太大,并且没有太多的特征,可以使用多元高斯分布模型。
1.如果数据集特别大,则首先应该检查这么大规模是否真的必要
2.两种替换批量梯度下降函数的函数(因为数据集很大的时候,每次都遍历所有数据来统计误差,计算量太大了):
随机梯度下降函数(SGD)
小批量梯度下降 Mini-Batch Gradient Descent
小批量梯度下降算法,介于批量梯度下降算法和随机梯度下降算法之间,每计算常数b次训练实例,更新一次参数 θ
通常会令 b 在 2-1024(2的整数次幂) 之间。小批量梯度下降的好处在于可以用向量化的方式来循环b个训练实例,如果用的线性代数函数库能支持平行处理,那算法的总体表现将与随机梯度下降近似。
注意:如果b=m,就是批量梯度下降;如果b=1,就是随机梯度下降SGD
SGD的收敛图像
1.当数据集很大时使用随机梯度下降算法,这时为了检查随机梯度下降的收敛性,我们在每1000次迭代运算后,对最后1000个样本的cost值求一次平均,将这个平均值画到图中。
2.可以令α的值随着迭代次数的增加而减小,这样可以让收敛的时候震荡越来越小。
在线学习机制
映射化简和数据并行 Map Reduce and Data Parallelism
大规模数据下,批量梯度下降函数的代价很大,因此可以用map reduce分流而治的思想。例如求和任务可以分配:
很多高级的线性代数函数库能够利用多核 CPU 的来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故(比调用循环快)。
#第十一周 Photo OCR 应用实例:图片文字识别
https://www.cnblogs.com/maxiaodoubao/p/10222391.html
建立一个从图片中识别出文字的系统需要三步:
1.文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来
2.字符切分(Character segmentation)——将文字分割成一个个单一的字符
3.字符分类(Character classification)——确定每一个字符是什么
获得更多数据的几种方法: 1.人工数据合成;2.手动收集、标记数据;3.众包
不要根据直觉,而是使用上限分析判断应该改进哪个模块:
如何知道哪一部分最值得花时间和精力去改善呢?可以使用流程图进行上限分析,流程图中每一部分的输出都是下一部分的输入。
在上限分析中,我们选取一部分,手工提供 100%正确的输出结果,然后看应用的整体效果提升了多少。假使当前总体效果为 72%的正确率:
1) 如果让文字检测部分100%正确,系统的总体效果从 72%提高到了89%。这意味着很值得投入时间精力来提高我们的文字检测的准确度
2) 接着让字符切分结果100%正确,系统总体效果只提升了 1%,这意味着字符切分部分可能已经足够好了
3) 最后让字符分类100%正确,系统总体效果又提升了10%,这意味着我们可能也会应该投入更多的时间和精力到分类这部分