本章实现了一个简单的线性回归模型,用于学习输入x和输出y之间的线性关系(y=w*x)。
一、代码细节
1.数据准备
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
- 定义了训练数据,x和y之间显然是y=2x的关系,只是我们自己知道计算机不知道。
2.模型定义
def forward(x):
return x * w
- 非常简单的线性模型,只有一个权重参数w
3.损失函数
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
- 使用均方误差(MSE)作为损失函数
4.训练循环
for w in np.arange(0.0, 4.1, 0.1):
print('w=',w)
l_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)
l_sum += loss_val
print("MSE", l_sum / 3)
w_list.append(w)
mse_list.append(l_sum / 3)
- 遍历w的可能值(0.0到4.0,步长0.1)
- 对每个w值,计算在所有训练数据上的总损失
- 计算并存储平均MSE
5.可视化
plt.plot(w_list, mse_list)
plt.xlabel('w')
plt.ylabel('Loss')
plt.show()
6.找最优解
min_mse = min(mse_list)
optimal_w = w_list[mse_list.index(min_mse)]
print(f"\nOptimal weight: {optimal_w:.1f} (MSE = {min_mse:.2f})")
二、完整代码
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]
# 前向传播函数
def forward(x):
return x * w
# 损失函数
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
# 存储权重和对应的MSE值
w_list = []
mse_list = []
# 遍历不同的权重值
for w in np.arange(0.0, 4.1, 0.1):
print("w =", w)
l_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)
l_sum += loss_val
print("\t", x_val, y_val, y_pred_val, loss_val)
# 计算并存储平均MSE
print("MSE:", l_sum / 3)
w_list.append(w)
mse_list.append(l_sum / 3)
# 可视化结果
plt.plot(w_list, mse_list)
plt.title('Loss for different weights')
plt.xlabel('w')
plt.ylabel('Loss')
plt.show()
# 找到最优权重
min_mse = min(mse_list)
optimal_w = w_list[mse_list.index(min_mse)]
print(f"\nOptimal weight: {optimal_w:.1f} (MSE = {min_mse:.2f})")