import numpy as np import matplotlib.pyplot as plt# 步骤1: 生成模拟数据 np.random.seed(0) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + 2 * X**2 + np.random.randn(100, 1)# 步骤2: 定义线性模型 (我们从随机权重开始) w = np.random.randn(2, 1) b = np.random.randn(1)# 步骤3: 定义损失函数 (均方误差) def mse(y_pred, y_true):return ((y_pred - y_true) ** 2).mean()# 步骤4: 使用梯度下降来优化模型参数 learning_rate = 0.01 epochs = 100# 记录每次迭代的损失,用于画图 losses = []# 准备一个颜色列表,用于绘制不同颜色的直线 colors = plt.cm.rainbow(np.linspace(0, 1, epochs))fig, ax = plt.subplots()# 绘制数据点 ax.scatter(X, y, label="Data")# 扩展X值以绘制连续的线条 X_plot = np.linspace(X.min(), X.max(), 100).reshape(-1, 1) X_plot_ext = np.hstack((X_plot, X_plot**2))for epoch in range(epochs):# 扩展特征X_ext = np.hstack((X, X**2))# 预测y_pred = X_ext @ w + b# 计算损失loss = mse(y_pred, y)losses.append(loss)# 梯度下降dy_pred = 2 * (y_pred - y)dw = X_ext.T @ dy_pred / len(X_ext)db = dy_pred.sum(axis=0) / len(X_ext)# 更新权重和偏置w -= learning_rate * dwb -= learning_rate * db# 绘制当前拟合的直线,使用不同的颜色y_plot_pred = X_plot_ext @ w + bax.plot(X_plot, y_plot_pred, color=colors[epoch], label=f"Epoch {epoch + 1}")# 设置图例和标签 ax.set_xlabel("X") ax.set_ylabel("y") ax.legend()plt.show()# 绘制损失下降的曲线 plt.plot(losses) plt.title("Loss over epochs") plt.xlabel("Epoch") plt.ylabel("Loss") plt.show()