用户:四九圣尊查看:1 回复:3 评论:1 创建时间:2018-11-09T18:06:44
假设房间面积和房价的关系如图所示(x为面积,y为价格):
现在我们要画一条一次函数拟合这些数据,并且预测出当房间面积为15时,房间的价格。
我们将这个问题的损失函数定义成这样:
我们希望预测值与实际值的差的平方最小,这个函数越小,拟合程度愈高。
损失函数图像:
画图代码:
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求导。
过程如下:
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')
这里我采用随机梯度下降,即每次只拿一对数据而不是全部,这样子的好处在于更快,坏处在于对噪音的免疫力差,
可能会出现梯度震荡。损失函数如下,可以看出它并不是像以前一样成一条完美的曲线,而是有一点儿曲折的:
最终结果:函数关系式为:y=1.8402815670820953*x + 0.7188514834喵0719。当面积为15时,价格为:28.323074989695503
好了,梯度下降的全部教程就到此结束了。完结撒花!
以后可能会出其他算法的教程!
往期精彩:
1:https://www.codemao.cn/community/166919
2:https://www.codemao.cn/community/166722
3:https://www.codemao.cn/community/166752
点赞0
评论
补一下链式求导法则证明:
点赞0
评论