问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

机器学习基础:梯度下降(以线性回归为例)

创作时间:
作者:
@小白创作中心

机器学习基础:梯度下降(以线性回归为例)

引用
CSDN
1.
https://m.blog.csdn.net/maodajitui/article/details/145999259

梯度下降是机器学习中一种常用且重要的优化算法,广泛应用于各种模型的参数优化。本文将通过一个简单的线性回归案例,详细讲解梯度下降算法的基本原理和实现过程。

梯度下降:通过让损失函数最小(即理想状态是其导数为0),来找到最佳权重等参数的方法。即该状态下获得的自变量x的权重w及截距b所构成的公式(见代码),能够输出最接近真实值的预测值。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'  # 用于解决matplotlib绘图不显示中文的问题,没问题可忽略。
# 1. 生成模拟数据
np.random.seed(42)  # 固定随机种子,确保结果可复现
m = 100             # 样本数量
x = np.random.rand(m, 1) * 2  # 特征x范围 [0, 2)
true_w = 3          # 真实权重(斜率)
true_b = 5          # 真实偏置(截距)
y = true_w * x + true_b + np.random.randn(m, 1) * 0.5  # 生成y,添加高斯噪声
# 2. 初始化参数
w = 0.0   # 初始权重
b = 0.0   # 初始偏置
eta = 0.1 # 学习率
n_iters = 50  # 迭代次数
# 存储训练过程中的损失和参数历史(用于可视化)
losses = []
weights = [w]
biases = [b]
# 3. 梯度下降迭代
for epoch in range(n_iters): #既可以设置迭代次数,也可以设置损失函数之差的阈值
    # 计算预测值
    y_pred = w * x + b
    
    # 计算损失(均方误差)
    loss = np.mean((y_pred - y)**2)
    losses.append(loss)
    
    # 计算梯度
    error = y_pred - y
    grad_w = (1/m) * np.sum(x * error)  # 权重梯度
    grad_b = (1/m) * np.sum(error)      # 偏置梯度
    
    # 更新参数
    w = w - eta * grad_w
    b = b - eta * grad_b
    
    # 记录参数历史
    weights.append(w)
    biases.append(b)
# 4. 输出最终结果
print(f"真实参数:w = {true_w}, b = {true_b}")
print(f"训练结果:w = {w:.4f}, b = {b:.4f}")
# 5. 可视化
plt.figure(figsize=(15, 5))
# 预测直线与原始数据
plt.subplot(1, 2, 1)
plt.scatter(x, y, s=10, label="原始数据")
plt.plot(x, w*x + b, c='red', lw=2, label=f"预测直线: y = {w:.2f}x + {b:.2f}")
plt.xlabel("x (特征)")
plt.ylabel("y (目标变量)")
plt.legend()
# 损失函数下降过程
plt.subplot(1, 2, 2)
plt.plot(range(n_iters), losses, marker='o', linestyle='--', c='green')
plt.xlabel("迭代次数")
plt.ylabel("均方误差 (MSE)")
plt.title("损失函数下降过程")
plt.grid(True)
plt.show()
  

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号