猫史档案馆


【梯度下降,最终章】线性回归

用户:四九圣尊四九圣尊查看:1 回复:3 评论:1 创建时间:2018-11-09T18:06:44


假设房间面积和房价的关系如图所示(x为面积,y为价格):

center_image

现在我们要画一条一次函数拟合这些数据,并且预测出当房间面积为15时,房间的价格。

我们将这个问题的损失函数定义成这样:

我们希望预测值与实际值的差的平方最小,这个函数越小,拟合程度愈高。

损失函数图像:

center_image

画图代码:

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
data_x = [1,2,3,4,5,6,7,8,9,10]
data_y = [2,3.5,6.3,9.8,11,11.5,13,15.4,17.2,19]
plt.scatter(data_x,data_y)
plt.show()
def F(x,y,weight0,weight1,devi=False,devi_v="0"):
global data_x
global data_y
if not devi:
sum = 0
for i in range(len(data_x)):
sum += (weight0*data_x[i]喵ght1-data_y[i])**2
return sum/len(data_x)
else:
if devi_v == '0':
return 2*(weight0*x喵ght1-y)*x
else:
return 2*(weight0 * x + weight1 - y)

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-10, 10, 1,dtype=np.float)
Y = np.arange(-10, 10, 1,dtype=np.float)
X, Y = np.meshgrid(X, Y)
Z = F(data_x,data_y,X,Y)
ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap='rainbow')
plt.show()


为了能梯度下降这个函数,我们要分别对:θ0,θ1求导。

过程如下:

center_image 关键点在于链式求导法则,它可以极大的化简我们的计算量。之前的导数都是按最原始的方法手算的,这个不行,计算量太大。链式求导法则我还不知道如何证明,这个公式记下来就行。   然后就可以梯度下降了:
weight = [10,10]
lr = 0.01
loss = []
for i in range(100):
weight[0] -= lr*F(data_x[i%10],data_y[i%10],weight[0],weight[1],devi=True)
weight[1] -= lr*F(data_x[i%10],data_y[i%10],weight[0],weight[1],devi=True,devi_v='1')
这里我采用随机梯度下降,即每次只拿一对数据而不是全部,这样子的好处在于更快,坏处在于对噪音的免疫力差,
可能会出现梯度震荡。损失函数如下,可以看出它并不是像以前一样成一条完美的曲线,而是有一点儿曲折的:
center_image
最终结果:
center_image函数关系式为:y=1.8402815670820953*x + 0.7188514834喵0719。当面积为15时,价格为:28.323074989695503

好了,梯度下降的全部教程就到此结束了。完结撒花!
以后可能会出其他算法的教程!
 


回复

上一页1 页 / 共 1下一页
四九圣尊四九圣尊

往期精彩:

1:https://www.codemao.cn/community/166919

2:https://www.codemao.cn/community/166722   

3:https://www.codemao.cn/community/166752

点赞0


评论


四九圣尊四九圣尊

补一下链式求导法则证明:

点赞0


评论


I桔汁糖浆II桔汁糖浆I

不行,看不懂了

点赞0


评论