机器学习笔记[入门版]
本文是吴恩达《机器学习》的笔记,由于课程内容较为基础,所以本文对于许多数学知识有些欠缺
多变量线性回归
- 非线性函数线性化
这种情况下,特征的缩放就变得很重要(因为在平方甚至立方的情况下,特征的值会放大很多)
也不一定只要平方,开方也可以:
正规方程
相比梯度下降法,可以更快地获得最优解。
正规方程法更适合于较小型的问题,而梯度下降法适用于更大的数据集
正规方程不需要缩放特征
每个特征列在开头补上一个1然后转置,计算的公式是:
如果X^tX不可逆怎么办?
整体来说,这种情况还是比较少的
pinv()指令能在矩阵不可逆的情况下也求解出正确答案
需要求解的特征量大于样本数时也会造成问题。
解决不可逆问题的办法:
- 删除线性相关的变量
- 当特征数量太多时,删除一些特征,或者使用正规化方法
向量化
多使用内置函数库(老师的意思是自己造轮子比不上人家的2333)
左图是自己写的循环,右图是调用向量相乘的方法。右图由于使用了内置的乘法,效率比自己写的要高
C++也有这种,线性运算的库
再复杂一点的情况也是,向量化之后慢慢处理
Logistic回归
依然是在机器学习中常用的一种算法
线性规划在分类问题中的表现一般不太好
线性规划设置阈值的方法在分类中不好使
Logistic回归是一种分类算法,和回归分析没关系,这个名字有点问题,是历史遗留问题
- Sigmoid functionLogistic function
这两个是一个东西,名字不一样而已
长这样
它的使用是为了实现单位阶跃函数并且保持连续性,以便于之后的微分等运算。使用它主要是因为它的形状和单位阶跃函数比较相近,可以起到相近的功能。
现在我们的问题就是预测θ
输出的是在目前的条件下,y=1的概率,和1相减就是y=0的概率
Decision boundary决策界限
这里的函数g就是上面的sigmoid函数
决策平面是和假设配套的,和训练集没关系
再来一个例子:
假设函数为:
所以,使用sigmoid函数后,决策边界为:
干货预警
Logistic回归和线性回归的区别是什么?
初学的时候,我对这两种方法总是很疑惑,总感觉他们明里暗里是差不多的意思,后来我思考了之后才豁然开朗。
Logistic回归和线性回归可以说是用同样的技术解决不同的问题线性回归解决的是典型的回归分析问题。
在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
另外,对于一个回归方程,如果自变量的指数大于1,那么它就是多项式回归方程。如下方程所示:
y=a+bx2
在这种回归技术中,最佳拟合线不是直线。而是一个用于拟合数据点的曲线。
来源:百度百科
线性回归的作用可以描述为拟合确定变量间的线性关系,以便于通过一个指标来预测另外一个指标,在二维平面上,可以理解为“由点画线”。而Logistic回归解决的问题却是分类,但是却是在用回归的思路解决:在二维平面上,Logistic回归利用回归的思想来确定决策平面,之后通过Logistic函数这个近似的阶跃函数来达到二分类的目的。我们可以把Logistic函数看做一个开关,其实它核心的功能函数构建决策平面,而这一过程和线性回归一样,都是通过求代价函数的极小值点实现的,只不过这两种方法由于公式不一样,要是都套用线性规划的代价函数,Logistic函数的代价函数会出现多个极值点,这就给梯度下降法的使用造成了很大困难,所以又自己构造了个。
Logistic方法的决策边界一定是线性的吗?当然不是的,具体看上一节的例子。但这种就属于符合函数了,不是原本的Logistic模型了。
举一个使用Logistic回归解决问题的例子:
代价函数
以一个例子开头:
h(x)是我们选择的预测模型,现在的问题是如果确定模型中的参数
这里讲了,我们原来常见的Cost函数不适用于现在的问题,因为它画出来的代价函数的图像是一个非凸函数,有很多的局部最优解,这给我们使用梯度下降法来求解全局最优解带来了很多问题。我们希望的代价函数是右面形式的。例如线性回归的代价函数就是一个凸函数:
Logistic上常用的代价函数为:
上面的式子还可以合成为一个:
这个估计方法是由统计中的极大似然法来的
这里的h(x)输出的是没有用决策平面截断之前的连续值:可以看一下,第一个公式中如果h(x)=0的问题有多大!(当然这一点也不是我们选择的代价函数有问题,而是我们主动选择的这一特性,因为在输出值为[0,1]的情况下,y=1而h(x)=0确实是最严重的预测失误了)
使用梯度下降法计算最合适的θ:
这个式子和做线性回归的梯度下降法时是一样的。当然这和h(x)没什么关系,其实体现的是用在两种方法上的代价函数的导数形式是一样的。
关于梯度下降法,有一些实践上的细节需要注意:
- θ0和θ1的更新需要是同时进行的,不可以更新完θ0之后再计算θ1,这样结果会有偏差
- 一般所说的梯度下降方法,也就是这里说的Batch梯度下降方法,是遍历了整个样本集合的,也就是对每一个样本都求一遍,最后取平均值。也有方法不遍历所有的样本
对梯度现下降法的高级优化:
课程没有讲这些部分
自动选择学习率α,甚至为每一次迭代设置不同的学习率,所以他们的收敛速度比梯度下降法要快很多
“很有可能成功应用了这些方法并解决了实际问题,但并不知道这些算法的内循环中在做什么”“如果你不是数值计算方面的专家,不要试着自己去实现像BFGS这样的算法”2333
功能的实现是否足够好对于学习过程是有影响的,所以如果使用的是其他的编程语言,比如Java、C++等,可能要多试几个库来找那个效果最好的
一些高级方法的具体实现:
fminunc会调用高级方法之一来解决问题
initialTheta:θ的初始值
100:迭代次数
exitFlag指示算法是否收敛
要调用fminunc方法,θ的数量必须大于等于2。
由于这些方法的实现我们都是不知道的,算是一个黑盒,所以在debug的时候可能会有些麻烦,但是由于它的速度要远好于梯度下降法,所以一般还是选择这种方法
Logistic在多元分类中的应用
总体思想:将多元分类问题拆分为多个二分类问题,对于每一个分类,只区分“我”和“非我”
我们分别设计三个分类函数,之后:
选择概率最大的那个
正则化
过度拟合(Overfitting)
欠拟合、拟合正常和过拟合
过拟合也被称为高方差
如果我们拟合出来的是一个很高阶数的多项式,那么它可以完全拟合任何小于其阶数数量的数据点,这是没有意义的
同样的问题不仅仅存在于线性回归中,还存在于Logistic回归等问题中
对于一维和二维的数据,overfitting的问题很好解决,因为我们可以直观地看出数据的分布以选择最合适的拟合方法,也可以将拟合的方法和数据做比较来看它是不是overfitting了。但是这种情况太少了,大多数情况下,我们的问题的维度都很高,这种方法是不行的。
如果变量太多而数据量太少的话,overfitting就会出现
减少过拟合的方法:
- 减少变量数,手动确定保留哪些变量
- 使用模型选择算法,自动选择要保留的变量
但是,在减少变量数的同时,我们关于问题的信息量也减少了
另外的方法就是正则化了:保留所有变量,但是减少量级
为特征项加入惩罚项
在求和函数中加入正则项,注意这里约定成俗地只对1到n进行求和,而不去管第0项(实践中来说,是否包括0对于结果没什么影响)
这里的λ称为正则化参数,作用是控制两个不同目标(更好的拟合数据和保持参数尽可能小)之间的取舍
这里的λ如果设置的过大,可能会导致参数结果变得太小,使得拟合不准确
- 线性回归的正则化
如图,加入惩罚项后θj相比原来变得更小了(减小地更快了)
如果使用正规方程呢?
那如果正规方程中的不可逆怎么办?
这种情况下,如果我们依然在软件中执行Pinv,依然可以得到一个结果,但是这个结果的效果就不会很好了。
可以证明的是,如果对乘上了后面带λ的矩阵,这个矩阵就一定是可逆的,这样就不会有不可逆的问题了。
- Logistic回归的正则化
对Cost函数进行修改实现正则化:
对梯度下降法进行修改:
神经网络
Logistic分类遇到的问题:
特征数量太多,很容易过拟合(样本数量赶不上特征数量)
Logistic不适合作为非线性分类:一般的问题,例如图片识别,特征的维度都是很高的。
神经网络:生物学
神经重接实验:神经元是具有学习能力的
神经元获取信息,处理后传递给其他神经元
神经网络基础知识
神经元是最小的逻辑单元:
输入x1x2x3,输出h(x)的值
X0是一个恒等于1的值,叫做偏置单元或偏置神经元,但有时候也不画了。
激活函数:
神经元的参数这里用θ表示,有时也叫权重(weight)
神经网络就是一些神经元连接在一起的集合。
这里省略了第0个神经元:
第一层被称为输入层,我们在这里输入特征(feature);最后一层称为输出层,输出最终计算结果;中间层称为隐藏层
符号表示:
每条连接线都有自己的值和对应的计算权重
这里的函数g是激活函数,一般是Logistic函数
输入有四个(算上一个隐藏的),但是只加在三个上面(因为第0个恒为1,不需要计算
上角标表示第几层,下角标表示这一层的第几个
计算原则:
基本结构就是这样,神经网络的效果通过改变θ实现
前向传播:依次计算输入层-隐藏层-输出层
向量化计算:
(这里的内容和数电有点类似了2333)
- 拟合AND运算的网络:
利用偏置神经元,只有两个都为正的时候才能比偏置神经元的绝对值大,结果才能为正,输出才能是1。如图:
-
拟合OR运算的网络:
一个意思,只要有一个为正结果就是正数
-
拟合NOT运算的网络:
这个其实已经不是单纯的NOT了。其实要拟合NOT很简单,只要为对应的神经元上加一个绝对值很大的负数特征,使得只要他为正就会输出0就好了
-
拟合XOR(异或)运算的网络:
-
拟合XNOR(异或取反)运算的网络:
XNOR就不是基本类型了,需要将基本类型进行组合
XNOR=OR(AND,(NOT)AND(NOT))//真假一定能中一个
通过多层结果,可以实现在每层都执行较为简单的指令的基础上最终实现一个复杂的功能
利用神经网络进行多分类识别
多分类对应着多输出,第i个输出只判断是否属于第i个分类
注意这里对于多个结果是如何表示的:多分类时,有几个分类,我们就需要用几个输出层来表示结果。
神经网络的代价函数
这里的K是结果向量的维数,最后的θ的平方求和实际上就是对神经网络里所有的θ(除了来自偏置神经元和去向偏置神经元的,注意求和都是从1开始的)都算了一遍。当然要是算了应该也没错,只是这种不算的方式比较常用些。
代价函数最小化与反向传播
下面举了一个例子来说明如何计算神经网络以及其代价函数:
反向传播:
δ表示预测值和实际值之间的误差,是cost函数计算出来的中间项的导数
最后一层的误差是最好计算的,直接用预测值减去实际值就好了
注意第一层是没有误差的,所以δ1是不存在的
整个的计算过程就是由后往前反推
反向传播的使用方法:
- 设置初始值
- 使用前向算法计算各个中间结果
- 计算输出层的偏差
- 使用反向算法反推各个层的偏差
- 利用公式将偏差加和
- 利用公式计算D{i,j}
- 可以证明,,这样我们就可以使用梯度下降法来计算θ了