pytorch 学习-2.线性模型
1.pytorch安装
2.线性模型_哔哩哔哩_bilibili
2.1 代码复现:
# numpy是一个用于科学计算的库,提供了多维数组对象和各种派生的对象(如掩码数组和矩阵),以及用于数组操作的各种函数。
import numpy as np
# matplotlib是一个绘图库,pyplot是它的一个子模块,用于创建简单的图表、直方图、功率谱、条形图、错误图、散点图等。
import matplotlib.pyplot as plt# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]# 定义模型 预测函数
def predict(w, x):return w * x
# 定义损失函数 均方误差
def loss(w, x, y):return (y - predict(w, x)) ** 2w_list = []
mse_list = []# 遍历w的取值范围
for w in np.arange(0.0, 4.1, 0.1):print("w =", w)w_list.append(w)l_sum = 0 #在w取值下,损失函数的和# 遍历训练数据集for x_val, y_val in zip(x_data, y_data):y_pred_val = predict(w, x_val) # 计算预测值loss_val = loss(w, x_val, y_val) # 计算损失值l_sum += loss_val # 累加损失值print("\t", x_val, y_val, y_pred_val, loss_val)# 计算MSEprint("MSE =", l_sum / len(x_data))mse_list.append(l_sum / len(x_data))# 绘制损失函数图像
plt.plot(w_list, mse_list)
plt.xlabel('w') # x轴标签
plt.ylabel('loss') # y轴标签
plt.show() # 显示图像
运行结果:
2.2 出现的问题:
2.2.1 缺少numpy库
Traceback (most recent call last): File "D:\桌面\pythonProject2\main.py", line 1, in <module> import numpy as np ModuleNotFoundError: No module named 'numpy'
出现原因:系统中同时安装了多个 Python 环境(例如,系统自带的 Python 和 Anaconda),可能会导致冲突。确保你在运行脚本时使用的是 Anaconda 的 Python 环境。
解决方法:
在设置中找到python编辑器,添加本地编辑器,并在下载的Anaconda中找到python.exe,点击确定即可。
2.2.2 缺少matplotlib
库
File "D:\桌面\pythonProject2\main.py", line 3, in <module> import matplotlib.pyplot as plt ModuleNotFoundError: No module named 'matplotlib'
这个错误表明你的 Python 环境中缺少matplotlib
库。matplotlib
是一个第三方库,需要先安装才能导入使用。
pip install matplotlib
2.2.3 NumPy 2.3.1 与某些模块(如 Matplotlib)的兼容性问题。
我尝试了一下重新安装matplotlib后它自动帮我解决了兼容问题。如上图所示
2.3 作业:
import numpy as np
import matplotlib.pyplot as plt
#np.array()函数用于将列表或元组转换为数组。不用for循环来逐一调用函数,可以直接将列表或元组转换为数组。
# 由于x_data和y_data是一个NumPy数组,函数中的操作会逐元素进行。x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([2.0, 4.0, 6.0])# 定义线性回归模型
def predict(w, x, b):return w * x + b
# 定义损失函数
def loss(w, b, x, y):return (y - predict(w, x, b)) ** 2
#w,b的预测范围
# np.arange 用于生成一系列数字,在这里用于生成w和b的预测范围
w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(-2.0, 2.1, 0.1)# 创建一个二维数组来存储mse值
mse_list = np.zeros((w_list.size, b_list.size))# enumerate 是一个 Python 内置函数,它允许你在遍历列表的同时获取每个元素的索引值。
for i, w in enumerate(w_list):for j, b in enumerate(b_list):# np.mean是NumPy库中的一个函数,用于计算数组中所有元素的平均值# np.mean(a, axis=None, dtype=None, out=None, keepdims= < novalue >)# a : 输入数组。# axis : 数组的轴,默认为None,表示沿所有轴计算。# dtype : 输出数组的数据类型,默认为None,表示保持原始数据类型。# out : 输出数组,默认为None,表示不输出。# keepdims : 如果为True,则保留输出数组的维度,即使原数组的维度为1。mse = np.mean(loss(w, b, x_data, y_data))# 计算均方误差mse_list[i, j] = mseprint(f"w={w:.1f} b={b:.1f} mse={mse:.2f}")# 绘制MSE值
fig = plt.figure()# 创建一个图形框
ax3d = fig.add_subplot(projection='3d') # 创建一个三维的绘图工程,add_subplot()方法用于向图形中添加子图。
w_list_grid, b_list_grid = np.meshgrid(w_list, b_list) # 生成网格数据ax3d.plot_wireframe(w_list_grid, b_list_grid, mse_list, cmap='rainbow') # 绘制曲面图
plt.xlabel('w') # 设置x轴标签
plt.ylabel('b') # 设置y轴标签
plt.title('MSE as a function of w and b') # 设置标题
plt.show() # 显示图形
运行结果:
# ax.plot_wireframe(w,b,mse_list,cmap='rainbow')
ax.plot_surface(w,b,mse_list,cmap='rainbow')#修改后,如下图所示