吴恩达机器学习-2-梯度下降与正规方程
第二周主要讲解的内容包含:
- 多维特征
- 多变量梯度下降
- 梯度下降法实践
- 正规方程
多维特征Multiple Features
还是利用房价模型的例子,增加了更多的特征,比如:房间楼层、房间数量、地理位置等,构成了一个含有多个变量的模型

n:代表的是特征的数量
x(i):代表第i个训练实例,是特征矩阵中的第i行,是一个向量vector
xj(i):表示的是第i个训练实例的第j个特征;i表示行,j表示列
支持多变量的假设h表示为: hθ(x)=θ0+θ1x1+…+θnxn 为了简化公式,引入x0=1,公式转化为: hθ(x)=θ0x0+θ1x1+…+θnxn 特征矩阵X 的维度是m∗(n+1),公式简化为: hθ(x)=θTX
多变量梯度下降
算法目标
与单变量线性回归类似,在多变量线性回归中,构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:

J(θ0,θ1...θn)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:

hθ(x)=θTX=θ0+θ1x1+θ2x2+...+θnxn
算法过程

原始形式: θj:=θj−α∂θj∂J(θ0,θ1,...,θn)
将代价函数J带进去: θj:=θj−2m1α∂θj∂∑i=1m(hθ(x(i))−y(i))2
求导数之后: θj:=θj−m1α∑i=1m((hθ(x(i))−y(i))⋅xj(i) 其中j∈(0,1,2,…,n)
当n>=1时, θ0:=θ0−am1i=1∑m(hθ(x(i))−y(i))x0(i)
θ1:=θ1−am1i=1∑m(hθ(x(i))−y(i))x1(i)
θ2:=θ2−am1i=1∑m(hθ(x(i))−y(i))x2(i)

Python代码
给定特征矩阵X,输出y,学习率θ,求代价函数J
import numpy as np
def computeCost(X,y,theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 / len(X))
复制代码
梯度下降法实践
特征缩放
面对多维度特征问题,我们需要保证这些特征具有相近的尺度,帮助梯度下降算法更快地收敛。
以房价问题为例,假设仅用两个特征,房屋的尺寸和数量,以两个参数分别为横纵坐标,假设尺寸在0-2000
平方英尺,数量在0-5
之间。
绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。

解决办法:将所有的特征的尺度尽量缩放到-1到1之间,令: xn=snxn−un 其中un为平均值,sn为标准差

均值归一化

学习率问题
梯度下降算法的每次迭代受到学习率的影响
- 如果学习率过小,则达到收敛所需的迭代次数会非常高,收敛速度非常慢
- 如果学习率过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛
常用学习率包含:α=0.01,0.03,0.1,0.31,3,10
特征和多项式回归
如房价预测问题, hθ(x)=θ0+θ1⋅宽度+θ2⋅深度 同时房屋面积=宽度 * 深度

在实际拟合数据的时候,可能会选择二次或者三次方模型;如果采用多项式回归模型,在运行梯度下降法之前,特征缩放很有必要。

正规方程 Normal Equation
梯度下降缺点
需要多次迭代才能达到局部最优解

正规方程demo
正规方程具有不可逆性
正规方程就是通过求解下面例子中的方程找出使得代价函数最小参数θ:θ=(XTX)−1XTy


不可逆矩阵不能使用正规方程求解
Normal Equation VS Gradient Descent

梯度下降 |
正规方程 |
需要选择学习率θ |
不需要 |
需要多次迭代 |
一次运算得出 |
当特征数量n大时也能较好适用 |
需要计算(XTX) 的逆矩阵。如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n3),通常来说当n小于10000 时还是可以接受的 |
适用于各种类型的模型 |
只适用于线性模型,不适合逻辑回归模型等其他模型 |

参数θ求解过程

θ=(XTX)−1XTy ,对其推导过程进行讲解:
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
- 将==向量表达形式==转为==矩阵表达形式==,则有J(θ)=21(Xθ−y)2 ,其中:
- X为m行n列的矩阵(m为样本个数,n为特征个数)
- θ为n行1列的矩阵
- y为m行1列的矩阵
- ==对J(θ)进行如下变换==
J(θ)=21(Xθ−y)T(Xθ−y)
=21(θTXT−yT)(Xθ−y)
=21(θTXTXθ−θTXTy−yTXθ−yTy)
- 接下来对J(θ)偏导,需要使用的==矩阵求导法则==:
dBdAB=AT
dXdXTAX=2AX
所以有:
∂θ∂J(θ)=21(2XTXθ−XTy−(yTX)T−0)
=21(2XTXθ−XTy−XTy−0)
=XTXθ−XTy
令∂θ∂J(θ)=0,
则有θ=(XTX)−1XTy
正规方程的Python实现
import numpy as np
def normalEquation(X, y):
theta = np.linalg.inv(X.T@X)@X.T@Y
return theta
复制代码