cost_list,grad_list,w_list每个列表中有300个值,因为数据有3个,epoch=100,故计算了300次梯度。
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = 1
def forward(x,w):
return x*w
def cost(x,y,w):
y_pred = forward(x,w)
return (y_pred-y)**2
def gradient(x,y,w):
return 2*x*(x*w-y)
if __name__ == '__main__':
print("Predict (before training)",4,forward(4,w))
cost_list = []
w_list = []
grad_list = []
for epoch in range(100):
# cost_val = cost(x_data,y_data,w)
# grad_val = gradient(x_data,y_data,w)
# w -= 0.01*grad_val
for x,y in zip(x_data,y_data):
grad = gradient(x,y,w)
w -= 0.01*grad
print("\tgrad:",grad,"\tx:",x,"\ty:",y)
loss = cost(x,y,w)
cost_list.append(loss)
grad_list.append(grad)
w_list.append(w)
print('Epoch:',epoch+1," ",'w=',w," ",'loss=',loss)
print("Predict (after training)",4,forward(4,w))
plt.plot(w_list,cost_list)
plt.xlabel("w")
plt.ylabel("loss")
plt.show()
plt.plot(w_list,grad_list)
plt.xlabel("w")
plt.ylabel("grad")
plt.show()