标准梯度下降是在权值更新前对所有样例汇总误差,
而随机梯度下降的权值是通过考查某个训练样例来更新的。
在原来梯度下降的基础上,只需要在循环体内做一些改动,从五组数据中任取一组进行不断训练迭代
x=random.randint(0,4)
随机梯度下降训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。
完整代码:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import random
import matplotlib.pyplot as plt
x = np.array([[2104,3], [1600,3], [2400,3], [1416,2],[3000,4]])
t = np.array([400,330,369,232,540])
alpha = 0.1
theta0 = np.random.random()
theta1 = np.random.random()
theta2 = np.random.random()
theta=np.array([theta1,theta2])
eps = 10e-4
for i in range(0,2):
e0 = 0.5 * (np.sum((x[:, i] * theta[i])) + theta0 - t[i])
e1 = e0 * x[1, i]
e2 = e0 * x[2, i]
while e0 >= eps or e1 >= eps or e2 >= eps:
x=random.randint(0,4) #从5组数据中随机选取一组进行迭代
i=0
theta0 = theta0 - alpha * e0
theta1 = theta1 - alpha * e1
theta2 = theta2 - alpha * e2
i+=1
print(theta0, theta1, theta2)
fig1=plt.figure()#创建一个绘图对象
ax=Axes3D(fig1)#用这个绘图对象创建一个Axes对象(有3D坐标)
X1,X2=np.mgrid[0:10000:500j, 0:50:500j] # 从0到10000生成500个房间平米数X1,从0到50生成500个房间数X2
h=theta0+(theta1*X1+theta2*X2)
plt.title("Graph") #图像标题
ax.plot_surface(X1, X2, h , rstride=1, cstride=1, cmap=plt.cm.coolwarm, alpha=0.5) #用取样点(x,y,z)去构建曲面
ax.set_xlabel('X1 Room Size', color='b')
ax.set_ylabel('X2 Number of Room', color='g')
ax.set_zlabel('h Price of House', color='b')
plt.show()#显示模块中的所有绘图对象
运行结果: