前言
最近在看吴恩达在Coursera上的机器学习课程,并做了相关作业,https://github.com/Emma-uestc/machine-learning但Coursera经常就上不去了,所以还会再看看书,这里把自己所学及自己的理解做一个整理。
机器学习是什么
当然,首先它是Machine learning 的直译,这里,我不想说什么书上可以阅读到的定义或概念。我们还是以吴恩达的房子价格的案例作为例子,
假如,我想要知道一栋150平的房子的价格,那么我可以让计算机根据以上过去售出的房子的价格与对应面积的关系找出规律,预测待买的房子的价格,这就是一个线性回归问题,再比如,我手里有200百万,我想知道我是否能够买一栋200平的房子,这就是一个分类问题,当然,拿这个房子的例子不是那么恰当,比如,Youtube上每小时可能就有几百万份视频上传,面对,这么大的数据量,Google不可能让自己的员工对这些认为分类,那么就需要计算机对这些视频自动分类,那么计算机是如何做到的呢,就是根据已分类的视频的数据,对新的上传的视频分类。由此,我们可以得出机器学习就是:计算机对已有的数据进行学习,找到这些数据的规律,建立对应的模型,使用这个模型对新的数据进行预测的一种方法。预测房价处理的是连续的数据,是回归问题,而对视频进行分类,处理的是离散值,是分类问题,这两种问题有一个共同点,就是有变量和因变量,就是有label,房价问题中,过去的数据,面积特征对应的是价格,视频分类中,视频的特征对应相应的归类,这种有标签的问题就是监督学习,而象给出一堆T shirt 的大小,尺寸,每个数据没有给出label,让机器对这些T-shirt进行分类,这种无label的就是无监督学习。
上面简单介绍了什么是机器学习,以及机器学习的分类,下面就具体说说本文的重点---liner regression
Liner Regression
目标函数
回归算法是学习机器学习最先接触的到算法,主要又分为两类,liner regression 和logistic regression,不过,逻辑回归是分类算法。线性回归就是上面提到的房价预测问题,计算机需要找到一条直线模拟出面积与房价的关系。当然,影响房价的因素不止面积,即我们的数据特征不止一个,
上图就是一个简单的数据训练的模型,因为数据只有面积一个特征,所以模型是一条直线,当数据特征量多余三个时就是超平面了,由于局限性,无法画出超平面。通常,数据集是下面这种形式。
X 是一个mxn矩阵,即有m个样本,每个样本有n个特征。利用线性回归的模型,预测值,第一项是截距,在这里也叫偏差(bias),通常认为x0=1,则可以写成
因为加入了偏差,此时
,这里的x(i) 是vector,以后不再注明,由于我们是用模型拟合的得到的y(i),那么与实际的值肯定是有误差的,令这个误差为,
,根据中心极限定理,在样本足够大的情况下,
,要使该模型拟合效果最好,
,
显然,需要取最小,即
最小,J(theta)就是损失函数,其实,这里就是最小二乘法,这也是曲线拟合常用的方法。这里除以m,是为了之后处理方便,并不影响结果。上面推到不理解的看概率论与数理统计最大似然估计部分
上面说过数据X是mxn的矩阵,y是n维向量,所以实际计算时,因为像matlab/Octave 或一些库(numpy)等都是支持矩阵运算的,所以通常将损失函数向量化,,那么要求该式的最值,也是极值,需要求岛,
这样,就可以求出解析解,,这里
必须可逆,如果不可逆,可以加入扰动项,后面讲到过拟合时会提到。不过,
一定是半正定的(不知道为什么的查看线性代数),另外,关于向量求导可以参考这里。
过拟合问题
因为有n个特征,所以最高可以是n次方的,但通常,不会选到n,因为会出现过拟合问题(龙格现象)(可以参看数值分析方面的书),为了防止过拟合,我们希望theta的加和不要太大,并且加入一个参数,可以由我们调整的参数,,这一项也叫正则项,这里用的是l2正则,也可以说是l2范式,(不明白向量范式或矩阵范式的可以看矩阵分析方面的书。),这样目标函数就变成了
,线性回归中,这种回归也叫Ridge回归,既然有l2-normal,那么肯定也会有l1-normal,也叫lasso回归,实际中,可能会用lasso,
稀疏与lasso
在求解参数theta1 to theta n时,我们很希望有的参数是为0的,这就说明为0的参数是冗余的,也可以达到降维的作用,更为专业的理论可以参看这篇博客。
梯度下降法
上面的算法可以给出解析式,固然很好,但在实际计算中,这是非常大的计算量,所以更常用的还是梯度下降法
这里不用担心是否是全局最优的,因为此处局部最优就是全局最优,可以考虑上面的损失函数是一个凸函数,局部最优一定是全局最优的。
数据的使用
通常,我们拿到一份数据,并不是全部用于做训练,一般是60%用作训练,20%用作测试数据,20%用作验证数据。因为,我们需要在不断的交叉验证中调整参数,使得模型效果最好
第二项之所以写成交叉验证,是因为,它可能某次作为训练数据,训练数据的一部分呢作为验证数据或测试数据,多次测试,取平均。
GitHub 上的Octave 代码
在coursera上学习吴恩达的机器学习的时候,做了课后的编程作业,地址
参考:
https://blog.csdn.net/xbinworld/article/details/44276389
吴恩达机器学习笔记