一、机器学习分类
1.1 监督学习
给出一组数据及正确的答案,使用数据训练出一个模型,当有新数据时可以得到正确结果。
- 回归问题:预测连续值的属性(如房价预测等);
- 分类问题: 将无穷多的特征进行分类,即预测离散型输出(如根据一些信息判断肿瘤是否为恶性)。
1.2 无监督学习
给出大量数据,不给出正确的答案 ,让机器自己寻找数据中可能的类型结构。
- 聚类:将一组数据进行分类,不预先说明有哪些类别。
- 鸡尾酒会算法:混合音频的分离。
二、单变量线性回归
2.1 模型描述
如图表示一个房价预测的数据集,x轴表示房子的面积,y轴表示对应的房价,现在需要做的就是用一条直线拟合这些数据,使得给出一个新的房子面积,可以预测出它的房价。当然,可以用曲线来拟合数据使得预测更加准确,但是目前只先讨论单变量的线性回归,即用直线来拟合数据。
定义一个数据集:
假设有如图所示的数据,称为一个训练集,其中用
2.2 代价函数
假设函数 :
我们称
如果将函数简化成
如果再加入
2.3 梯度下降
我们可以通过图像快速观察出代价函数
2.3.1 算法简单步骤
- 初始某个起点
- 不断一点点改变
去减少 ,直到达到我们所期望的最小值。
如图所示是某个代价函数的图,将其想象成实际生活中的地形,梯度下降算法的思想是这样的:随机指定一个初始点,假如你要走出很小的一步,并以最快的速度下山,首先环顾四周,然后寻找到坡度最陡的一个方向走,一直重复直到走到最低谷。如果,初始点在右侧一点,你可能会走到另外一个局部最低点,这也是梯度下降的一个特点。
2.3.2 数学表达
不断重复步骤直到收敛:
对于偏导项,可以通过下图理解:同样将三维简化成二维(
- 如果斜率为正数,那么
会变小,即向左移动。 - 如果斜率为正数,那么
会变大,即向右移动。
对于
即时
2.3 线性回归算法
线性回归模型:
梯度下降算法:
不断重复
首先计算一下偏导数部分:
将计算结果代回到梯度下降算法,得到线性回归算法:
不断重复,直到收敛:
注意这里的
虽然梯度下降算法可能会进入局部最优解,但是线性回归的代价函数是一个凸函数,即只有一个全局最优解,没有局部最优解,所以使用梯度下降法时一定能找到最优的解。
上述算法又称为 batch梯度下降法,因为每次下降都会遍历整个训练集的所有数据。
三、多变量线性回归
3.1 符号定义及向量化
由于代价函数中要对训练集中的每一个数据都进行运算后求和,如果用循环的方式代码会很复杂并且效率低下,所以可以考虑将其转换成矩阵运算,及将数据进行向量化。具体如下:
我们假设:
假设函数:
3.2 多元梯度下降法
类比可以得到,多元梯度下降法的算法表达为:重复进行
同样,这里我们也可以进行向量化的操作:
我们设
一点解释:
刚开始接触的时候很难理解这是怎么推得的(可能是我线代太差了),想了好久,在原理上大概理解了,首先提取出
3.3 特征缩放
3.3.1 主要思路
思路:设法将特征的取值维持在一个相近的范围。
比如有两个属性,房屋大小(取值为0-2000),卧室个数(取值1-5),那么如果画出等高线图,会是一个又高又瘦的形状,如果用梯度下降算法,会收缩地非常缓慢(如下图左)。我们可以将房屋大小除以2000,将卧室个数除以5,再画出等高线图就比较合适了(如下图右)。
更一般地来说:就是要讲每个属性的取值范围都缩放到接近
3.3.2 均值归一化
对于一个属性,求出该属性所有样本的平均值,再将每个样本的该属性值减去平均值,使得这个属性所有样本的平均值变为0,然后再除以这个属性原始的取值范围(最大值-最小值)。如:若房屋面积的取值范围为
数学表达:
3.4 学习率的选取
如果代价函数关于迭代次数的图形形如左上角这两张一样,说明学习率
3.5 特征选择和多项式回归
以房价预测为例,如果有两个属性分别表示房屋的长和宽,可以将两个属性相乘得到一个新的属性:面积,用面积属性来预测房价显然更加合适。选择好特征后,考虑用什么多项式模型进行拟合。
如果使用一个二次函数来拟合,函数图形会先上升后下降,显然不太符合实际,考虑用三次函数进行拟合,那么三个属性分别就是面积、面积的平方、面积的三次方。由于三个属性的取值范围相差很大,所以需要用到特征缩放的思想。当然,还有许多其他模型可以选取,选择合适的函数进行拟合,很重要,后面会学习算法来决定选择哪些特征,用什么模型进行拟合。
3.6 正规方程
3.6.1 工作方式
不同于梯度下降法不断迭代的方法,正规方程提供了一种直接计算模型参数
先给出求法:
- 构建
矩阵和 矩阵:
假设有m个样例,n个属性,
在matlab中,可以用代码 pinv(x'*x)*x'*y
来计算上述方程。
3.6.2 与梯度下降的区别
简单来说,小数据用正规方程,大数据用梯度下降。
3.7 正规方程在矩阵不可逆情况下的解决方法
虽然可能会出现矩阵不可逆的情况,但是pinv(x'*x)*x'*y
在MATLAB 中保证可以求得正解,这是函数实现上的一些问题。
如果矩阵不可以一般有两种可能原因:
-
学习时,包含多余特征,如:
同时有两个特征:一个是以平方英尺为单位的房屋面积,一个是以平方米为单位的房屋面积,由于两者可以相互线性表示,所以会导致矩阵不可逆的情况。
-
学习时,包含过多的特征(具体来说就是
),此时可以选择删去一些特征,或者使用正则化(后面会提到)。