import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设函数y=2x+1
x_data = [1.0, 2.0, 3.0]
y_data = [3.0, 5.0, 7.0]
# 定义函数
def forward(x):
return x * w + b
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
# 定义三个数组,分别放w,b,mse
w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(0.0, 4.1, 0.1)
[w, b] = np.meshgrid(w_list, b_list)
mse_list = []
loss_sum = 0
# 循环执行方法
for x_val, y_val in zip(x_data, y_data):
y_pred_val = forward(x_val)
loss_val = loss(x_val, y_val)
loss_sum += loss_val
print('\n', x_val, y_val, loss_val)
mse_list.append(loss_sum / 3)
print(f'MES={loss_sum / 3}')
# 3D 图
figure = plt.figure()
ax = Axes3D(figure)
ax.plot_surface(w, b, loss_sum / 3)
plt.show()
注意:
1、np.meshgrid用来画3D图形的,参数是数组,返回值也是数组
2、Axes3D的包为:
from mpl_toolkits.mplot3d import Axes3D
3、zip(x_data,y_data):是将这两个数组对应的纵坐标重新组合成多个数组
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]