训练集共m个样本,第i个样本
线性回归模型
1.用向量表示
-
假设函数
Hypothesis:h(x)=wTx+b -
参数
Parameters:w,b -
损失函数
CostFunction:J(w,b)=12m∑mi=1(h(x(i))−y(i))2 -
优化目标
Goal:minimizeJ(w,b)
2.参数求解方法:
2.1Gradient Descent 梯度下降
-
步骤:
1.初始化
w1,w2...,wd,b
2.同步更新所有参数,使J(w,b) 不断减小。(α 是学习率)
wj:=wj−α∂∂wjJ(w,b)(j=1,...,d)
b:=b−α∂∂bJ(w,b)
3.重复步骤2直至收敛 -
推导:
计算偏导数
因为J(w,b)=12m∑i=1m(h(x(i))−y(i))2=12m∑i=1m((w1x(i)1+w2x(i)2+...+wdx(i)d+b)−y(i))2
所以∂∂wjJ(w,b)==1m∑i=1m((w1x(i)1+w2x(i)2+...+wdx(i)d+b)−y(i))x(i)j1m∑i=1m(h(x(i))−y(i))x(i)j ∂∂bJ(w,b)==1m∑i=1m((w1x(i)1+w2x(i)2+...+wdx(i)d+b)−y(i))1m∑i=1m(h(x(i))−y(i))
则参数更新公式为wj:=wj−α1m∑mi=1(h(x(i))−y(i))x(i)j b:=b−α1m∑mi=1(h(x(i))−y(i)) 这里需要注意的一点,正确的参数更新方式为同步更新,例如输入只有一维时
y=w1x1+b
正确的参数更新:⎧⎩⎨⎪⎪⎪⎪temp0=w1−α∂∂w1J(w1,b)temp1=b−α∂∂bJ(w1,b)w1=temp0b=temp1
错误的参数更新:{w1=w1−α∂∂w1J(w1,b)b=b−α∂∂bJ(w1,b)
错误原因:没有同步更新,w1 先更新,然后再更新b,而此时更新b用了更新后的w1 ,而不是本来的w1 。
2.2Normal Equation 正规方程
解析法求解参数 :对cost function求导,令导数为0,求得参数。
-
简单情况举例
输入只有一维特征y=wx+b ,优化目标minimizeJ(w,b)=J(w,b)=12m∑mi=1(wx(i)+b−y(i))2
求导{∂∂wJ(w,b)=1m∑mi=1(wx(i)+b−y(i))x(i)∂∂bJ(w,b)=1m∑mi=1(wx(i)+b−y(i))
令导数为0,求得⎧⎩⎨⎪⎪w=∑mi=1(y(i)−b)x(i)∑mi=1x(i)2b=∑mi=1(y(i)−wx(i))m -
通常情况,多维特征
m个样本,d维特征。为了计算简便,通常把w,b 统一起来,给x增加一列1,b作为w0 ,如下:
则J(w)=12m(XW−Y)2=12m(XW−Y)T(XW−Y)
求导∂∂wJ(w)==12m(XW−Y)T(XW−Y)12m(XTXW−XTY)
令导数等于0,得到W=(XTX)−1XTY
n*n矩阵求逆运算的时间复杂度是O(n3) 。(XTX) 是(d+1)*(d+1)维,所以当特征维数d很大时,计算将花费很长时间。
2.3两种方法比较
一般,当特征维数小于10000时,正规方程计算是一个很好的方法,当特征维数多于10000时,通常采用梯度下降方法。
像线性回归这样简单的模型可通过对损失函数求导,令导数为0,解得最优解所对应的参数。但对复杂的模型来说,求导过程可能相当复杂,只能用梯度下降法不断向最优解处逼近。
参考资料:
1.Andrew Ng的Machine Learning课程
2.《机器学习》周志华
3.http://blog.csdn.net/stdcoutzyx/article/details/9101621