实现线性模型(y=wx+b)并输出loss的3D图像
import numpy as np
import matplotlib.pyplot as plt
# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [1.9, 3.9, 5.9]
# W和B定义了权重w和偏置b的范围,分别从0到4(步长为0.1),和从-2到2(步长为0.1)
# .round(1)是对生成的数组进行四舍五入保留一位小数的操作
W = np.arange(0.0, 4.1, 0.1).round(1)
B = np.arange(-2.0, 2.1, 0.1).round(1)
# 生成网格坐标矩阵
# np.meshgrid()的作用就是根据给定的一维数组,生成一个网格坐标矩阵,其中每个点的坐标都是由这些数组的元素组成的
w, b = np.meshgrid(W, B)
# 定义模型:y = x * w - b
def forward(x):
return x * w + b
# 损失函数
def loss(y_pre, y):
return (y_pre - y) ** 2
l_sum = 0 # 计算损失之和
for x_val, y_val in zip(x_data, y_data):
y_pre = forward(x_val)
loss_val = loss(y_pre, y_val)
l_sum += loss_val
mse = l_sum / len(x_data)
# 定义figure,创建一个新的图形对象,如果不定义figure,它将会覆盖之前存在的坐标系
# figsize=(10, 10): 指定了图形的大小为宽度和高度都是10英寸
# dpi=300: 设置图形的分辨率为300像素每英寸
fig = plt.figure(figsize=(10, 10), dpi=300)
# 创建一个3D坐标轴
# plt.axes(): 这是 Matplotlib 中用于创建坐标系的函数。当设置 projection='3d'时,它会创建一个三维坐标系对象
ax = plt.axes(projection='3d')
# ax.plot_surface 表示在3D坐标轴ax上绘制损失函数的曲面图
# w,b,mse是x,y,z轴所需的数据
# rstride:行步长,默认为1、cstride:列步长,默认为1,这些参数影响绘制表面图时网格的密度,如果设置为 2,则每隔一个行(列)元素绘制一个
# cmap: 颜色映射,即用来对 Z 轴数据进行颜色映射的 colormap。
# 在这个例子中,设置为 'rainbow',表示使用彩虹色的颜色映射方案。
# 可以选择不同的 colormap,比如 'viridis'、'coolwarm' 等
surf = ax.plot_surface(w, b, mse, rstride=1, cstride=1, cmap='coolwarm')
# 设置z轴的显示范围
ax.set_zlim(0, 40)
# 设置图标
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('Loss')
# 添加文本标签(0.2,2,43)表示在x,y,z上的位置
ax.text(0.2, 2, 43, 'Cost Value', color='black')
# 增加颜色条
# 颜色条会根据surf对象的数据进行着色,shrink=0.5 指定了颜色条相对于默认大小的缩小比例为 0.5,aspect=5 控制了颜色条的长宽比为 5
fig.colorbar(surf, shrink=0.5, aspect=5)
fig.show()
参数cmap='coolwarm'时图形颜色为:
参数cmap='rainbow'时图形颜色为:
定义figure,会创建一个新的图形对象,修改代码里的内容时在运行他不会覆盖之前已经创建好的图形