zip函数:略
meshgrid (画三维图形常用函数)
meshgrid中的结果X是以第一参数x在垂直方向上的复制和堆叠。
meshgrid中的结果Y是以第二参数y的转置(变为列向量)在水平方向上的复制和堆叠。
课中讲的用y=wx拟合数据
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]
####实现线性模型y=wx拟合上述数据并画图
def loss(x, y,y_pred):
return (y_pred - y) ** 2 #某点的loss是差值的平方
def main():
# 穷举法
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1): #w从0.0到4.0步长0.1
print("w=", w)
loss_sum = 0
for x_val, y_val in zip(x_data, y_data): #zip函数
y_pred_val = x_val*w #在当前权值下计算预测值
loss_val = loss(x_val, y_val,y_pred_val) #计算当前点的loss值
loss_sum += loss_val
print('\t', x_val, y_val, y_pred_val, loss_val)
print('MSE=', loss_sum / 3) #计算平均loss值
w_list.append(w)
mse_list.append(loss_sum / 3)
plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()
课后作业:用y=wx+b拟合数据并画3维图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#这里设函数为y=wx+b
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
def forward(x):
return x * w + b
def loss(x,y):
y_pred = forward(x)
return (y_pred-y)*(y_pred-y)
mse_list = []
W=np.arange(0.0,4.1,0.1)
B=np.arange(0.0,4.1,0.1)
[w,b]=np.meshgrid(W,B) #w和b都是41*41的矩阵,不过w是从W的角度,b是从B的角度
l_sum = 0
for x_val, y_val in zip(x_data, y_data): #用了meshgrid只需要循环3次
y_pred_val = forward(x_val) #这样可以一次计算41*41个
print(y_pred_val)
loss_val = loss(x_val, y_val) #一次计算41*41个loss
l_sum += loss_val #总共加3次,3个点的loss矩阵加起来
fig = plt.figure() #创建画板
ax = Axes3D(fig) #3d图形
ax.plot_surface(w, b, l_sum/3)
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('mse')
plt.show()
绘制3d曲面
使用
ax.plot_wireframe
效果如图,仅使用线框进行绘制
使用
ax.scatter
效果如图,散点图