微信号:djangoSpace

介绍:开发者平台

梯度下降法求解线性回归之python实现

2016-04-05 14:44 just_do_it_123

源码链接:

链接:http://pan.baidu.com/s/1mirirsk 密码:bfbw


线性回归其实就是寻找一条直线拟合数据点,使得损失函数最小。直线的表达式为:


其中m为数据点总数。 

现在我们使用梯度下降法求解函数J的最小值,梯度下降法原理示意图如下:



如上图所示,只要自变量x沿着负梯度的方向变化,就可以到达函数的最小值了,反之,如果沿着正梯度方向变化,就可以到达函数的最大值。我们要求解J函数的最小值,那么就要求出每个w的梯度和b的梯度,由于梯度太大,可能会导致自变量沿着负梯度方向变化时,J的值出现震荡,而不是一直变小,所以在梯度的前面乘上一个很小的系数a。

由以上可以总结出w和b的更新公式:


梯度公式(其实就是求导而已): 


系数a如果随着迭代的进行越来越小的话,有利于防止迭代后期震荡的发生,是算法收敛,a的更新公式:


其中i是迭代次数,起始为0 
下面为使用python具体实现梯度下降法求解线性回归 
原始数据:


x = np.arange(-2,2,0.1)
y = 2*x+np.random.random(len(x))
x = x.reshape((len(x),1))
y = y.reshape((len(x),1))

开始迭代:

for i in range(maxgen):
    alpha = 1/float(i+1)+alpha0
    e = np.dot(x,seta.reshape((len(seta),1)))+b-y # 二维列向量
    mse = np.linalg.norm(e)
    delta_seta = np.dot(e.T,x)[0]
    delta_seta_norm = np.linalg.norm(delta_seta)
    b = b-alpha*np.sum(e)
    seta = seta-alpha*delta_seta    
   print u'迭代次数:',i    
   print u'梯度:',delta_seta_norm,'seta',seta,'b:',b,'mse',mse        print 'alpha:',alpha,'sum(e):',sum(e)

算法运行结果: 



如上图所示,最后梯度的值逐渐降为0,说明达到的J的极值点。


 
djangoSpace 更多文章 为什么要学习julia这门语言? 遗传算法的matlab实现 python VS matlab 使用R和Python计算AUC(干货) 十行以内,你写过哪些比较酷的 Matlab 代码?
猜您喜欢 javascript跨域及JSONP的原理与应用 干货 ▏Web开发者不可不知的15条编码原则 技术攻坚(一)Android插件化 最美应用-从 Android 研发工程师的角度 の 厨房故事 D, GO, Rust 三者,谁最有可能取代 C