![5865417-e2270fab889458a8.jpg](https://i-blog.csdnimg.cn/blog_migrate/a88010af173b9ab97c98778d5614fff4.jpeg)
大多数的回归问题,都可以使用最小二乘法来求解参数,而求解参数的过程又通常依赖梯度下降法。不仅是回归问题,很多机器学习都是基于梯度下降来实现参数优化,因此梯度下降可以说是机器学习的核心算法之一。简单地说梯度下降利用导数,通过不断迭代,经过有限次的运算,逐渐逼近最优解。
1. 一元回归与最小二乘
直接看吴恩达老师课程中的例子。现在有一些房价和面积的数据(x,y),想找出他们之间的关系。
![5865417-7d1055555cfce22c.png](https://i-blog.csdnimg.cn/blog_migrate/d7c46fbfe6906ae927d7cd3e30e71b30.png)
我们可以大概画出散点图,通过图形分布,假设他们之间是线性关系。那么这个例子可以抽象为,求一个方程f(x) = k*x+b,使预测值f(x)与真实值y尽量接近。
![5865417-8581e534edddc06b.png](https://i-blog.csdnimg.cn/blog_migrate/184e7f94d296524050dadef671795389.png)
如何算是接近?我们定义一个新的函数来判断接近程度。这个函数叫做损失函数,用差平方来表示,[f(x)-y]2。它反映了预测值与真实值的偏离程度。差平方和则反映了所有样本的偏离大小。将参数k和b用p取代,假设共有m个样本,那么拟合问题就成了找一组p值,使如下函数值最小。
![5865417-5f59738dacd5a19f.png](https://i-blog.csdnimg.cn/blog_migrate/8a23998e4a916d776e36d3541808d79f.png)
这种拟合方法称为最小二乘法。现在我们不继续深究,因为这个一元问题用Excel就能搞定了:
![5865417-a4a87ec0e223654d.png](https://i-blog.csdnimg.cn/blog_migrate/80ff8e208047229a0ffb2727b3d924d1.png)
2. 多元回归与梯度下降
一元线性回归只是其他更复杂模型中的一个特例,实际数据也往往并不会这么简单。现在我们给数据增加一个维度,探究一下房间数量、房屋面积和价格间的关系。
![5865417-7fe09a46e37cc847.png](https://i-blog.csdnimg.cn/blog_migrate/157b222a3fd208e2c6392e8637d712ca.png)
根据上面的思路,首先假设还是线性关系。将参数统一表示为θn(或叫做权重,相当于一元中的k,b),xn为数据特征,本例中两个数据特征分别为面积和房间数量。用多元回归对房价进行拟合。这里设x0=1。
![5865417-058c20fd03130f5c.png](https://i-blog.csdnimg.cn/blog_migrate/63ce8d795512bd9995eb798eb677e8d0.png)
同样,引入经验风险J(θ),相当于上文中的S(P),表示数据总体的误差。前面乘以0.5,是方便后面的求导运算:
![5865417-c7fe979cab4619b6.png](https://i-blog.csdnimg.cn/blog_migrate/f0b4a3a7896fd4f52ea588f0abeae172.png)
为了使决策函数更接近真实值之间的关系,经验风险越小越好。到这里,最优问题就成了求最小值问题。J(θ)这个函数可以看成是这样的。
![5865417-02e682280d1eb454.png](https://i-blog.csdnimg.cn/blog_migrate/8023ade31d52a9f07f52465dae1e284d.png)
如何到达最低点,从而使J(θ)最小呢?接下来就需要梯度下降法了。首先,随机给定一组θ值,得到一个解。在这个解的基础上进行优化,让θj沿着J(θ)下降最快的方向,也就是导数的反方向移动一小步,得到一个新的θj,再继续优化,重复上述过程,多次调整后,最终沿着“path”,达到最低点。表达式如下。
![5865417-ef45412c9c2ffdd0.png](https://i-blog.csdnimg.cn/blog_migrate/8a9b46bb637736123037cdb85c0bb8c3.png)
其中“α”叫做学习率,代表了每一次优化的步长。步长太大,容易直接跳过最优解,步长太小,迭代次数过多,学习效率降低。“:=”表示从右向左赋值,新产生的值会再次迭代,直到求出最小值。
对θj求偏导数,根据加减法则及链式求导法则得到以下等式:
![5865417-383639ea86bf8708.png](https://i-blog.csdnimg.cn/blog_migrate/378593ee8b4768784cfa2de5fb27d019.png)
最终梯度下降法表达式如下:
![5865417-6a5ebbbdbef2176a.png](https://i-blog.csdnimg.cn/blog_migrate/9a30dd7321d89550ba4ce3373906c74f.png)
3. 回归问题的python实现
在python的scipy库中,提供了leastsq函数,直接实现此目的,语法如下:
scipy.optimize.leastsq(func,x0,args=(),……)
func:预测值与实际值的差,需要带有至少一个变量,并返回数值型数据。
x0:初始参数,作为学习的起点。格式为数组。
args:训练集。
leastsq函数的目标是,求得如下的一个值:
![5865417-57d5b9dedd5168ee.png](https://i-blog.csdnimg.cn/blog_migrate/bf1ef90b01f80383ab2abc3e944e90b4.png)
是不是很熟悉?把func(y)**2作为误差函数,再经过sum求和,就等于经验风险。即求一个y值,使经验风险J(θ)或S(p)最小。
Python实现过程分为以下四个步骤
(1)定义拟合函数
def f(x1, x2, p):
k0, k1, k2 = p
returnk0 +k1*x1 + k2*x2
(2)定义误差函数
def cost(p,x1,x2,y):
return y-f(x1,x2, p)
(3)初始化参数
p0=[1,1,1]
x1=np.array([2104,1600,2400,1416,3000])
x2=np.array([3,3,3,2,4])
y=np.array([400,330,369,232,540])
(4)用leastsq求解
arg = leastsq(cost,p0,args=(x1,x2,y))
print arg[0]
完整代码如下:
![5865417-34079372d8435214.jpg](https://i-blog.csdnimg.cn/blog_migrate/32311807e2473bc88e5c992fd4b9420e.jpeg)
输出
[-7.04346018e+01 6.38433756e-02 1.03436047e+02]
4. 正规方程组
梯度下降法通过多次迭代,最终求出最优解。如果想一次性求出结果,也能够实现。即利用最优解处,导数为0特征直接求解。与梯度下降法类似,用x(i)列向量表示第i个数据里所有的变量特征,θ列向量表示每个特征对应的权重,y向量表示每组数据的实际输出。每个预测值和实际值的差用如下方程表示:
![5865417-1b6d7981eaff79f6.png](https://i-blog.csdnimg.cn/blog_migrate/5f4b158cb20fa5e834eda889dec2b10d.png)
接着写出风险函数:
![5865417-2cc40aeeed9ec595.png](https://i-blog.csdnimg.cn/blog_migrate/2faf15807dd3f1916c48ba7c863164a3.png)
对风险函数求导:
![5865417-d4c1b323d192b6ba.png](https://i-blog.csdnimg.cn/blog_migrate/01a839c8a0a1803852d135f817ba9bda.png)
并使导数等于0,即可能存在的最优解:
![5865417-2352c16f9e4ec4e6.png](https://i-blog.csdnimg.cn/blog_migrate/1d7e8f783016e5468079935940fe0744.png)