线性回归是一种做拟合的算法:
通过工资和年龄预测额度,这样就可以做拟合来预测了。有两个特征,那么就要求有两个参数了,设置
,对应工资和年龄两个字段的值。拟合的公式一般都是
,所以还缺一个
,所以还要设置一个
,所以决策函数就是
。这个决策函数的形式并不是推出来的,而是经验之举设置成这个形式的。可以设置多一个
,使得
,然后上式就可以变成
,整合一下,
。
误差 上面的
可以看做是一个误差,这个误差满足高斯分布,服从均值为0,方差为
的高斯分布,也就是高斯分布。因为求出来的拟合数值不是一定就准确的,肯定会有一些的误差。
一般误差不会太多,都是在0上下浮动的,所以0附近是最高的概率。 使用linear regression要满足三个条件: 1.独立,每一个样本点之间都要相互独立。 2.同分布,他们的银行是一样的,使用的算法是一样的。 3.误差都服从高斯分布。
由于误差是服从高斯分布的,自然有:
上述式子有:
需要求参数
,自然就是最大似然函数:
log化简:
最大化这个似然函数那就是最小化
。因为前面都是常数,可以忽略。而这个式子稍微变一下就是最小二乘法了。 最小二乘法:
,不用上面化简出来的式子非要加上
是因为求导之后2是可以和0.5抵消的。
化简一下:
求极小值,直接就是导数为0即可,所以对
求导数即可。
直接令等于0:
。 这样就是得到了最终的目标函数,一步就可以到达最终的optimal value。这就是linear regression。所以线性回归是有解析解的,直接一条公式就可以求出来的。注意上面的公式
的
是不包含bias偏置值,偏置项就是误差,代入高斯函数推导出来的。
首先要提一个函数,sigmoid函数:
这个函数之前被用来做神经网络的激活函数,但是它有一个缺点。
离原点处越远梯度就越趋近于0,在神经网络里面就会出现一个梯度消失的问题,所以后来就用relu或者tanh函数代替了。这个函数的值域是在
,所以sigmoid函数可以把一个值映射成一个概率,通过这个函数就可以做出一个概率,最后用过这个概率来区分类别。这里的决策函数还是和之前的一样
这样有点麻烦,可以把
合并到
,只需要在
中加多一列1就好了,所以函数可以简化
。这还是不是最终的决策函数,这只是一个值,只是一个得分,需要把这个得分转换成一个概率。所以最终的决策函数就是
。假设有两个类别
,那么可以假设属于
的类别就是
,属于
的类别就是
这样的两个的式子对于求导和化简都不好,所以合并一下:
因为y只有1和0,如果当前的分类是y,那么就是
的概率,不是就是另外一个。
最大似然函数,常规操作,给定了数据集找到符合这个数据集的分布一般也就是最大似然函数适合了。所以
log化:
所以梯度更新公式:
这个方法就梯度下降,问题来了,为什么要用梯度下降?为什么不可以直接等于0呢?
logistics regression没有解析解 如果等于0,就有:
考察一下两个特征两个样本的情况:
有三个不同的sigmoid函数,两个式子解不了,因为sigmoid函数不是线性的,如果是线性的,那么可以吧
提出来,这样就有解了。其实如果sigmoid去掉,仅仅把
那么就和linear regression一样了。所以是没有解析解的,主要的原因就是因为sigmoid函数是一个非线性的函数。
计算分数函数一样的:
之前了解的preceptron:
直接把score分数通过一个sign函数即可。0/1错误。 linear regression:
线性回归就是去掉了sign函数,使其成为一个线性函数,error function = square logistic regression:
常规操作,就是要找到error function先。按照刚刚的函数分布可以得到:
极大似然函数:
sigmoid函数有一个比较牛逼的性质。
所以美滋滋,替换一下就OK了:
是先验概率,开始就给定的了,是可以忽略的。
最大值一般比较难求,加上负号变成一个最小化的问题,化简一下:
其实这个就是交叉熵函数,和上面推导出的:
是一个东西,整合起来了而已,负号提前,所以形式有点不一样。最小化error function:
gradient decent,和刚刚的方法是一样的。
上面的
可以看做是-yx的线性加权,要求就是加权和之后为0,而如果是线性可分的话,则只要
为0就可以了;根据sigmoid函数的特性,为0就相当于是
要 << 0,即
>> 0,这就尴尬了,需要保证全部的yx都同号,都是线性可分的,这样其实是很难做到的,所以我们转换一个思路,用梯度下降解决。归根到底,还是sigmoid函数的非线性。
随机梯度下降,以往的经验是全部一起做一次更新,如果计算量非常大,那么计算复杂度很高,另外如果是做online learning的时候也不方便,因为这个时候数据不是一个betch的过来了,而是几个几个的了。
优点:简单,如果迭代次数够多的话是可以比得上average true gradient的效果的。 缺点:迭代的方向会不稳定,可能会左拐右拐的。average true gradient是查找的当前一阶导最适合的方向走的,而SGD是直接随机一个方向走。
他和PLA其实很像,而在理解上面其实也是类似,他们都选取一个点进行调整。而SGD ≈ soft PLA,PLA是错了之后才纠正,而SGD会看下你错了多少,错了越多,意味着你的wx越大,所以纠正的越多,是动态可变的,所以也叫做soft PLA。
三个比较简单算法:PLA,linear regression,logistic regression。他们勇于分类的时候:
square function对于分类来说其实不太合理的,分类正确了,应该越远越好才对,但是square function是越远错误就越大,是不合理的,logistics就更合理了,错误的越错就越大正确的就小,所以linear regression适合回归而不是分类。 可以看到ce和err0/1是有焦点的,我们乘上一个数字使他相切:
根据VC bound的理论:
所有logistic regression是可以作为分类的,而且他的分类效果要比linear regression好,首先直观理解错误,他比linear regression更合理,其次,他的VC bound比linear regression要小,这就证明了Ein ≈ Eout的概率会更高,泛化能力更强。
对于线性可分的情况来说,几乎是不用对x做什么预处理就可以直接使用模型进行分类,但是如果是对于非线性的模型,上面的方法就有点吃力了,他们都是线性分类,直接在model上改进有点困难,所以在数据上进行处理。
这种是绝逼找不到一条直线分开的,要完成这种任务就需要找一个非线性的模型分开,比如看起来这就像是一个圆:
把上面的式子变成我们认识的形式:
于是决策函数:
其实就是把x空间映射到了z空间,然后再z空间解决。x里面是nonlinear的,映射到z可能就会是linear的了,低纬度解决不了的问题拉到高维度解决:
支持向量机也用到了这种思想,核函数就是映射到高维度空间里面然后进行切片操作。 Nolinear Transformation的方法不止一个:
目前我们所讨论的都是过原点的,如果是不过原点的话,那么他们的VC dimension就会增加。比如这种
其实,做法很简单,利用映射变换的思想,通过映射关系,把x域中的最高阶二次的多项式转换为z域中的一次向量,也就是从quardratic hypothesis转换成了perceptrons问题。用z值代替x多项式,其中向量z的个数与x域中x多项式的个数一致(包含常数项)。这样就可以在z域中利用线性分类模型进行分类训练。训练好的线性模型之后,再将z替换为x的多项式就可以了。具体过程如下:
整个过程就是通过映射关系,换个空间去做线性分类,重点包括两个: 特征转换 训练线性模型
首先,用十二指肠想都知道:
如果是d维的x做二次的扩展,那么有
求上界,如果阶数更高,假如阶数为Q,对于x是d维,那么对于z空间就是
这种特征变换会导致计算空间变大,计算复杂度变大。另外,可以看到随着Q增大,W也会增大,这样就导致了VC dimension会增大,而W的秩其实就是VC维,所以,如果Q越大,就会导致泛化能力变差。
接下来讨论一下x到z多项式的变换: 一维:
二维:
三维:
Q维:
所以这些hypothesis是包含关系的:
对应上图:
所以一目了然,代价就是
之间的差距会越来越大,
最后就不能再代表
了。随着变换多项式的阶数增大,虽然逐渐减小,但是model complexity会逐渐增大,造成很大,所以阶数不能太高。如果选择的阶数很大,确实能使接近于0,但是泛化能力通常很差,我们把这种情况叫做tempting sin。所以,一般最合适的做法是先从低阶开始,如先选择一阶hypothesis,看看是否很小,如果足够小的话就选择一阶,如果大的话,再逐渐增加阶数,直到满足要求为止。也就是说,尽量选择低阶的hypothes,这样才能得到较强的泛化能力。模型复杂度越高出现的泛化能力问题,就是过拟合,在训练数据上表现很好,Ein = 0,但是在测试数据上就很差,Ein << Eout。