【ng公开课笔记02】线性回归

一、主要步骤(各算法通用)

  • 构建模型
  • 构建代价函数
  • 参数优化

监督学习的工作方式:

image_1bh51fai51gi31us419km90j9jd13.png-28.8kB

二、单变量线性回归

eg:房价估计

1.构建模型
house_price

假设函数:

2.代价函数

对代价函数的直观理解:
image_1bh52dkl91r4ku7t1chp14hl10ee9.png-293kB

image_1bh52euue1b1d1dch80q68v154lm.png-75.3kB

3.梯度下降

直观理解:从高点逐步到达局部最小值(选择的初始参数组合不同,可能最后的结果也不同)
image_1bh52helr1us51q841gqofvb1rln13.png-84.2kB

算法:
repeat:

:学习率
注意梯度下降时,要同时更新 ,即:

image_1bh53avt6194ghvblhv18q9doo2a.png-36.1kB

将代价函数带入上式求导

image_1bh539j6p1j1aomn1g7q1a8b1meg1t.png-15.7kB

三、多变量线性回归

步骤与上述类似,只是需要将X和Y向量化
即代价函数变为:

梯度下降算法变为(求导带入后):
Repeat{

}

四、一些数据处理方法

1.特征缩放:面对多特征问题时,要保证这些特征都具有相近的尺度,这样可以使收敛速度加快。最简单的是将所有特征取值范围都缩放到[-1,1]

其中 是平均值 是标准差

收敛速度对比:
image_1bh53tnepat82p93d11p1v15pv2n.png-51.1kB

2.常用学习率:0.01,0.03,0.1,0.3,1,3,10.(过高可能越过最值,过低迭代次数过高)

3.非线性多项式:有时需要用曲线来适应数据,如

通常需要先观察数据再决定尝试怎样的模型
还可以令: 将模型转换为线性回归

五、正规方程

另一种参数优化方法


X为训练集特征矩阵,y为结果向量
正规方程解

  • 对上述式子的理解:

设误差为

还可以用矩阵写为 ,对 求导,得到 ,令其等于0,得到

即得到了使误差函数最小的参数

梯度下降和正规方程的比较:

梯度下降 正规方程
需要选择学习率 不需要
需要多次迭代 一次运算得出
当特征数量n大时也能较好适用 特征数量n较大则运算代价大
适用于各种类型的模型 只适用于线性模型,不适合逻辑回归等其他模型

当特征变量数量小于一万,通常使用标准方程法

正规方程是不可逆时可删除几个特征

六、python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def standRegress(xArr,yArr):
xMat=np.mat(xArr);yMat=np.mat(yArr).T
xTx=xMat.T*xMat
if np.linalg.det(xTx)==0:
print 'the matrix is singular,can not reverse'
return
ws=xTx.I*(xMat.T*yMat)
return ws

def lwlr(testPoint,xArr,yArr,k=1.0):
xMat=np.mat(xArr);yMat=np.mat(yArr).T
m=np.shape(xMat)[0]
weights=np.mat(np.eye(m))
for j in range(m):
diffMat=testPoint-xMat[j,:]
weights[j,j]=np.exp(diffMat*diffMat.T/(-2.0*k**2))
xTx=xMat.T*(weights*xMat)
if np.linalg.det(xTx)==0.0:
print "This matrix is singular,cannot do inverse"
return
ws=xTx.I*(xMat.T*(weights*yMat))
return testPoint*ws

def lwlrTest(testArr,xArr,yArr,k=1.0):
m=np.shape(testArr)[0]
yHat=np.zeros(m)
for i in range(m):
yHat[i]=lwlr(testArr[i],xArr,yArr,k)
return yHat