梯度下降法和最小二乘法,python实现梯度下降算法
上周在实验室,姐姐说了这样一个问题。对于线性回归,最小二乘法和梯度下降法得到的权值是一样的,对此我有相当不同的看法。如果两种解题方法的等价性确实可以根据数学公式来证明,但是这个说法是否真的成立就很明显了,还有很多其他的考虑在里面。以下是我个人的看法:
1.首先,在讨论最小二乘法和梯度下降法对一个数据集进行线性拟合的结果是否相同之前,我们要确定数据集确实符合线性模型。如果没有,结果会很有意思。
这种情况在之前的博客里已经介绍过了,网址如下:
2.再者,在讨论两种方法的结果是否相同之前,实际编码过梯度下降法的人必须知道这样一件事,那就是步长,也就是每次修改权重时的权重比。虽然凸优化问题对初始点不敏感,但是步长的设置会影响最终收敛时权值的准确性,甚至会引起权值振荡的想象。下面是具体的实验代码和结果:
最小二乘法:
#!/usr/bin/env python
#编码:UTF-8
将numpy作为np导入
将matplotlib.pyplot作为plt导入
随机种子(0)
N=10
X=np.linspace(-3,3,N)
Z=-5.0 X np.random.random(N)
P=np.ones((N,1))
P=np.c_[P,X]
t=np.linalg.pinv(P)
w=np.dot(t,Z)
打印“安装后的重量:”
打印w
A=np.dot(P,w)-Z
打印“拟合损失函数值:”
打印np.dot(A,A)/2结果:
梯度下降法:
#!/usr/bin/env python
#编码:UTF-8
将numpy作为np导入
将matplotlib.pyplot作为plt导入
随机种子(0)
N=10
X=np.linspace(-3,3,N)
Z=-5 X np.random.random
P=np.ones((N,1))
P=np.c_[P,X]
阿拉法=0.001
定义乐趣():
W=np.random.random(2)
for _ in xrange(1000000000):
A=(np.dot(P,W)-Z)
W0=alafa*( np.sum(A))
W1=alafa*( np.dot(A,X))
如果abs(W0) abs(W1) 0.000001:
破裂
W[0]=W[0]-W0
W[1]=W[1]-W1
返回W
list_global=[]
for _ in xrange(100):
list_global.append( fun())
list _ global . sort(key=lambda x:x[0])
对于list_global中的k:
打印k
结果:
[-4.38413472 1.01451241]
[-4.38413469 1.01451241]
[-4.38413469 1.01451241]
[-4.38413468 1.01451241]
[-4.38413468 1.01451241]
[-4.38413464 1.01451241]
[-4.38413463 1.01451241]
[-4.38413461 1.01451241]
[-4.38413461 1.01451241]
[-4.3841346 1.01451241]
[-4.38413459 1.01451241]
[-4.38413458 1.01451241]
[-4.38413457 1.01451241]
[-4.38413457 1.01451241]
[-4.38413457 1.01451241]
[-4.38413455 1.01451241]
[-4.38413454 1.01451241]
[-4.38413451 1.01451241]
[-4.38413446 1.01451241]
[-4.38413444 1.01451241]
[-4.38413444 1.01451241]
.
.
.从梯度下降法可以看出,由于初始点不同,最终的优化结果略有不同,但考虑到精度,可以认为所有结果都是一致的。此时支持学姐的说法。
如果你改变步长,那就是
可用结果:
[-4.3842247 1.01451241]
[-4.38422468 1.01451241]
[-4.38422468 1.01451241]
[-4.38422467 1.01451241]
[-4.38422465 1.01451241]
[-4.38422464 1.01451241]
[-4.3842246 1.01451241]
[-4.38422459 1.01451241]
[-4.38422458 1.01451241]
[-4.38422457 1.01451241]
[-4.38422455 1.01451241]
[-4.38422455 1.01451241]
[-4.38422453 1.01451241]
[-4.38422452 1.01451241]
[-4.38422452 1.01451241]
[-4.38422452 1.01451241]
[-4.38422451 1.01451241]
[-4.3842245 1.01451241]
..
.
.此时,运行结果与上次实验略有不同。可以发现,这种差异是由于步长的设置造成的,也就是说,步长的不同导致了最终结果的精度不同。
这次我们又改变了步长,此时运行结果没有出来。可以说上面的程序在这个步长下是跑不出结果的。修改如下:
#!/usr/bin/env python
#编码:UTF-8
将numpy作为np导入
将matplotlib.pyplot作为plt导入
随机种子(0)
N=10
X=np.linspace(-3,3,N)
Z=-5 X np.random.random
P=np.ones((N,1))
P=np.c_[P,X]
alafa=0.1
定义乐趣():
W=np.random.random(2)
for _ in xrange(100):
A=(np.dot(P,W)-Z)
W0=alafa*( np.sum(A))
W1=alafa*( np.dot(A,X))
W[0]=W[0]-W0
W[1]=W[1]-W1
打印W
乐趣()
结果如下:
[-4.38423372 2.30949239]
[-4.38423372 -2.43876754]
[ -4.38423372 10.22325895]
[ -4.38423372 -23.54214502]
[ -4.38423372 66.49893222]
[ -4.38423372 -173.61060709]
[ -4.38423372 466.68149774]
[ -4.38423372 -1240.76411513]
[ -4.38423372 3312.42418586]
[4.38423372 e 00-8.82941128 e 03]
[2.35488166 e 04]
[ -4.38423372e 00 -6.27931245e 04]
[ -4.38423372e 00 1.67452052e 05]
[ -4.38423372e 00 -4.46535085e 05]
[ -4.38423372e 00 1.19076395e 06]
[4.38423372 e 00-3.17536680 e 06]
[4.38423372 e 00 8.46764853 e 06]
[ -4.38423371e 00 -2.25803924e 07]
[ -4.38423372e 00 6.02143834e 07]
[ -4.38423371e 00 -1.60571685e 08]
[4.38423375 e 00 4.28191164 e 08]
[ -4.38423373e 00 -1.14184310e 09]
.
.
.
[2.14824842 e 17 2.17682829 e 33]
[ 1.31051609e 17 -5.80487543e 33]
[ -7.91285594e 17 1.54796678e 34]
[ 1.97572602e 18 -4.12791142e 34]
[ -3.55829721e 18 1.10077638e 35]
[ 1.11990981e 19 -2.93540367e 35]
[3.30730877 e 19 7.82774313 e 35]
[ 5.54712838e 19 -2.08739817e 36]
20 5.56639512e 36
[ 2.91589608e 20 -1.48437203e 37]
[3.95832542 e 37]
[5.95842939 e 21-1.0555344 e 38]
[ -5.37525017e 21 2.81480918e 38]
[ 2.48478953e 22 -7.50615783e 38]
[ -6.58215412e 22 2.00164209e 39]
[ 4.17748787e 23 -5.33771223e 39]
[7.91177033 e 23 1.42338993 e 40]
[ 1.14310428e 24 -3.79570648e 40]
[2.72545834 e 24 1.01218839 e 41]
[ 5.01166690e 24 -2.69916905e 41]
[ -2.59368341e 25 7.19778413e 41]
[3.59601679e 25 -1.91940910e 42]可见其权值是发散的,不断波动的。
再次改变步长,
运行结果:
[-2.31385021 1.5972534 ]
[-3.55608032 0.31522322]
[-4.05297236 1.85365944]
[-4.25172917 0.00753598]
[-4.3312319 2.22288413]
[-4.36303299 -0.43553365]
[-4.37575343 2.75456769]
[-4.3808416 -1.07355392]
[-4.38287687 3.52019201]
[-4.38369098 -1.99230311]
[-4.38401662 4.62269104]
[-4.38414688 -3.31530194]
[-4.38419898 6.21028963]
[-4.38421982 -5.22042025]
[-4.38422816 8.49643161]
[-4.38423149 -7.96379062]
[ -4.38423283 11.78847605]
[ -4.38423336 -11.91424395]
[ -4.38423357 16.52902005]
[ -4.38423366 -17.60289675]
[ -4.38423369 23.35540341]
[ -4.38423371 -25.79455679]
[ -4.38423371 33.18539545]
[ -4.38423372 -37.59054724]
[ -4.38423372 47.34058399]
[ -4.38423372 -54.57677348]
..
..
..
[4.38423372 e 00 2.61036000 e 06]
[4.38423372 e 00-3.13242977 e 06]
[ -4.38423372e 00 3.75891795e 06]
[ -4.38423372e 00 -4.51069931e 06]
[4.38423372 e 00 5.41284140 e 06]
[ -4.38423372e 00 -6.49540745e 06]
[ -4.38423372e 00 7.79449117e 06]
[4.38423372 e 00-9.35338718 e 06]
[ -4.38423372e 00 1.12240668e 07]
[4.38423372 e 00-1.34688780 e 07]
[ -4.38423372e 00 1.61626558e 07]
[4.38423372 e 00-1.93951847 e 07]
[2.32742239 e 07]
[ -4.38423371e 00 -2.79290665e 07]
[ -4.38423372e 00 3.35148820e 07]
[-4.38423371e 00 -4.02178562e 07]是的,我们可以看到在这个步长下,常数项权重收敛,x项权重仍然波动。
由此可见,最小二乘法和梯度下降法能否得到相同的权重结果,还是一个相当值得探讨的问题。
==============================================================
对于,梯度递减重量振荡的附加解释:
在梯度下降问题中,如上图所示,W是权重的实值,W1是梯度下降过程中实值的估计。在此之前,所有权重的所有估计值(即历史估计值,或者在迭代过程中逼近真实值的过程中)都在真实值的一侧,W2是第一个估计值越过真实值到另一侧的权重值,W 是W1在真实值另一侧的对称值。如果在这一点上,是收敛的。在这种情况下,步长的选择可以使权重收敛。
如果W2比W’离真实值更远,W3一定比W1离真实值W更远。在这一点上,重量估计是有分歧的。
具体示意图如下:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。