之前说过线性回归可以帮我们在给定特征值后预测对应的结果,而在分类上线性回归也是可以的。
Perceptron Classifier
Perceptron Classifier 也就是我们所说的感知机,用于区分数据应该属于哪个类的。先看个使用线性回归拟合的例子吧
上面是两个不同的线性回归方程,很明显第一个拟合不是那么好。但是我们更希望看到的是有一条线将数据集里的数据分割开,而不是直接拟合。所以就有了感知机,下面是感知机的函数定义(目前就分两类)
要注意的是这里的 是特征值,在多维上感知机都能将数据分类,如二维用线分割,三维用面分割,这种分割的线/面统一叫做超平面。一个只有两个维度的特征数据集例子如下所示
这里要注意的是横纵坐标不再是 和 了,而是 以及 。下面是另外一个例子
不可分情况
上面这个例子特征数据都很好,一眼就看出要怎么分割,但是数据里你中有我,我中有你怎么办?如下图所示
这个时候我们就可以对特征值“做点手脚”,比如将它们平方一下
这样就可以将原来的一维变成二维,在二维里用一维的方式去分割。以此类推,二维不能分割的变成一个曲面(三维),用二维平面去分割曲面,等等。
过拟合
当然最好不要从一维变到一万维,这样就过拟合了,即训练数据每个都精确地分类,但是分类测试数据时候往往出错率很高。所以这种修改特征值的方法优点在于
- 更容易分类
- 在修改特征值后是一定可以分类的(如搞到一万维一定可以分类。。。)
缺点是
- 高维容易过拟合
- 训练数据分类结果很好,但是测试数据分类结果很差
用图表形式表示出错率
找到恰当的
刚刚只是简单说了下感知机的原理,现在要深入了解感知机。其实,有没有发现如果开局数据好看,只要能够将训练数据分成两类,感知机的参数 怎么设置都可以。当然,这是不好的,理想情况是两边数据离感知机方程越远越好,也就是要找到一个恰当的 值使得这个方程最优。
我们的线性回归就是使用梯度下降出错率导数去找 值的,不过这里可以先不用梯度下降,而对每次预测值直接调整 。伪代码如下
这里有点像梯度下降的感觉,不过没有求导,只是借用了一下它的原理。
当预测正确后,,这时候不需要调整 值
当预测出错后,,这时候就可以要调整 值使得拟合函数更靠近数据且感知机更好分割数据
调整过程如下
一直调整下去最终结果会将两边数据分开
基于梯度的感知机
我们先来看看原来的线性拟合函数是怎么样的
方方正正的,出错率还很高,拟合也不是很理想。这时候就想,要不我把这个函数变曲一点?这样的话拟合效果会好一点,而且出错率就不是 ,可以是 ,出错率会稍微降低一点。如图所示
这个平滑的函数一般使用 Sigmoid 函数。变曲了之后,出错率就可以用公式表示了
除了上面这些优点,我们还可以用梯度下降的方法来寻找最优的 值了。
梯度下降
假设现在的 Cost Function 是
对其中参数 求导后,就可以用梯度下降的方法去求最优的 值了。
当然这里的 Cost Function 是假定的,而使用不同的回归函数也会有不一样的 Cost Function。比如下图两个不同的 Cost Function
多个类的分类
多个类的分类可以借用 Bayes 的分类方法,求数据属于哪个类的概率高,哪个高选哪个,函数表示成这样
而感知机里的分割函数要写成这样
计算给定特征值后属于哪个类的概率
而 Negative Log Likelihood 的代价函数就是
多次梯度下降迭代后, 值就可以调整到最优了,
正则化
在梯度下降的迭代过程中肯定少不了要正则一下,以此防止下面的过拟合情况
下面给出使用 Negative Log Likelihood 并添加正则因子的代价函数