本周主要讲解的内容是:
-
多维特征
-
多变量梯度下降
-
梯度下降法实践
-
正规方程
多维特征Multiple Features
还是利用房价模型的例子,增加了更多的特征,比如:房间楼层、房间数量、地理位置等,构成了一个含有多个变量的模型
![](https://img.haomeiwen.com/i5142014/fa73766900f9bdcf.png)
n:代表的是特征的数量
:代表第个训练实例,是特征矩阵中的第行,是一个向量vector
:表示的是第个训练实例的第个特征;i表示行,j表示列
支持多变量的假设表示为:
为了简化公式,引入,公式转化为:
特征矩阵X 的维度是,公式简化为:
多变量梯度下降
算法目标
与单变量线性回归类似,在多变量线性回归中,构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:
其中
算法过程
原始形式:
将代价函数带进去:
求导数之后:
其中
当时:
![](https://img.haomeiwen.com/i5142014/cd9a953036c366f6.png)
Python代码
给定特征矩阵X,输出y,学习率,求代价函数
import numpy as np
def computeCost(X,y,theta):
inner = np.power(((X * theta.T) - y), 2) # 求解每个平方项
return np.sum(inner) / (2 / lne(X)) # 求和再除以2*len(X)
梯度下降法实践
特征缩放
面对多维度特征问题,我们需要保证这些特征具有相近的尺度,帮助梯度下降算法更快地收敛。
以房价问题为例,假设仅用两个特征,房屋的尺寸和数量,以两个参数分别为横纵坐标,假设尺寸在0-2000平方英尺,数量在0-5之间。
绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。
![](https://img.haomeiwen.com/i5142014/d9f75978a7cf73e2.png)
解决办法:将所有的特征的尺度尽量缩放到-1到1之间,令:
其中为平均值,为标准差
![](https://img.haomeiwen.com/i5142014/17c07aa6719e57a1.png)
均值归一化
![](https://img.haomeiwen.com/i5142014/2483f64f904b0562.png)
学习率问题
梯度下降算法的每次迭代受到学习率的影响
-
如果学习率过小,则达到收敛所需的迭代次数会非常高,收敛速度非常慢
-
如果学习率过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛
常用学习率包含:
特征和多项式回归
如房价预测问题,
![](https://img.haomeiwen.com/i5142014/42dda8ad233116f5.png)
房屋面积=宽度 * 深度
在实际拟合数据的时候,可能会选择二次或者三次方模型;
如果采用多项式回归模型,在运行梯度下降法之前,特征缩放很有必要。
![](https://img.haomeiwen.com/i5142014/f89e6ba783277404.png)
正规方程 Normal Equation
梯度下降缺点
需要多次迭代才能达到局部最优解
![](https://img.haomeiwen.com/i5142014/b0e2eccd08bb7419.png)
正规方程demo
正规方程具有不可逆性
正规方程就是通过求解下面例子中的方程找出使得代价函数最小参数
![](https://img.haomeiwen.com/i5142014/bbe78d7e2ca0ebeb.png)
不可逆矩阵不能使用正规方程求解
Normal Equation VS Gradient Descent
梯度下降 | 正规方程 |
---|---|
需要选择学习率 | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n大时也能较好适用 | 需要计算 如果特征数量n较大则运算代价大<br />矩阵逆的计算时间复杂度为,通常小于10000建议用正规方程 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
![](https://img.haomeiwen.com/i5142014/a8a06fb20b95c090.png)
参数求解过程
目标任务
其中:
具体过程:
- 将代价函数的向量表达式转成矩阵表达式
-
X为m行n列(m个样本个数,n个特征个数)
-
为n行1列的矩阵
-
y为m行1列的矩阵
- 做变换:
- 在进行求解偏导的过程中会用到的公式
- 求导
令上面的导数等于0,得到
Python实现
import numpy as np
def normalEquation(X, y):
theta = np.linalg.inv(X.T@X)@X.T@Y # X.T@X等价于X.T.dot(X) @等价于.dot
return theta
网友评论