当前位置: 首页 > news >正文

基于简单神经网络的线性回归

一、概述

本代码实现了一个简单的神经网络进行线性回归任务。通过生成包含噪声的线性数据集,定义一个简单的神经网络类,使用梯度下降算法训练网络以拟合数据,并最终通过可视化展示原始数据、真实线性关系以及模型的预测结果。

二、依赖库

  1. numpy:用于数值计算,包括生成数组、进行随机数操作、执行数学运算等。
  2. matplotlib.pyplot:用于数据可视化,绘制散点图和折线图以展示数据和模型的预测结果。

三、代码详解

1. 生成数据集

python

np.random.seed(42)
x = np.linspace(-10, 10, 100)
y = x + np.random.normal(0, 1, x.shape)  # 添加噪声

  • np.random.seed(42):设置随机数种子,确保每次运行代码时生成的随机数序列相同,从而使结果可复现。
  • np.linspace(-10, 10, 100):生成一个包含 100 个元素的一维数组x,元素均匀分布在 - 10 到 10 之间。
  • x + np.random.normal(0, 1, x.shape):生成因变量y,它基于真实的线性关系y = x,并添加了均值为 0、标准差为 1 的高斯噪声。np.random.normal(0, 1, x.shape)生成与x形状相同的随机噪声数组。

2. 定义神经网络(线性回归)

python

class SimpleNN:
    def __init__(self):
        self.w = np.random.randn()  # 权重
        self.b = np.random.randn()  # 偏置

    def forward(self, x):
        return self.w * x + self.b  # 前向传播

    def loss(self, y_true, y_pred):
        return np.mean((y_true - y_pred) **2)  # 均方误差

    def gradient(self, x, y_true, y_pred):
        dw = -2 * np.mean(x * (y_true - y_pred))  # 权重的梯度
        db = -2 * np.mean(y_true - y_pred)       # 偏置的梯度
        return dw, db

    def train(self, x, y, lr=0.01, epochs=1000):
        for epoch in range(epochs):
            y_pred = self.forward(x)
            dw, db = self.gradient(x, y, y_pred)
            self.w -= lr * dw  # 更新权重
            self.b -= lr * db  # 更新偏置
            if (epoch + 1) % 100 == 0:
                print(f'Epoch [{epoch+1}/{epochs}], Loss: {self.loss(y, y_pred):.4f}')

  • __init__方法:初始化神经网络的权重self.w和偏置self.b,使用np.random.randn()生成随机的初始值。
  • forward方法:实现前向传播,根据输入x、权重self.w和偏置self.b计算输出y_pred,即y_pred = self.w * x + self.b
  • loss方法:计算预测值y_pred和真实值y_true之间的均方误差(MSE),公式为np.mean((y_true - y_pred) ** 2)
  • gradient方法:计算权重self.w和偏置self.b的梯度。dw是权重的梯度,计算公式为-2 * np.mean(x * (y_true - y_pred))db是偏置的梯度,计算公式为-2 * np.mean(y_true - y_pred)
  • train方法:使用梯度下降算法训练神经网络。在指定的epochs(训练轮数)内,每次迭代进行前向传播计算预测值y_pred,然后计算梯度dwdb,根据学习率lr更新权重self.w和偏置self.b。每 100 轮打印一次当前轮数和损失值。

3. 训练模型

python

model = SimpleNN()
model.train(x, y, lr=0.01, epochs=1000)

  • SimpleNN():创建一个SimpleNN类的实例model
  • model.train(x, y, lr=0.01, epochs=1000):调用modeltrain方法,使用生成的数据集xy,学习率lr=0.01,训练轮数epochs=1000进行训练。

4. 可视化结果

python

y_pred = model.forward(x)
plt.scatter(x, y, label='Data points')
plt.plot(x, x, color='red', label='y = x')
plt.plot(x, y_pred, color='green', label='Predicted')
plt.legend()
plt.show()

  • model.forward(x):使用训练好的模型model对数据集x进行前向传播,得到预测值y_pred
  • plt.scatter(x, y, label='Data points'):绘制原始数据集的散点图,标签为Data points
  • plt.plot(x, x, color='red', label='y = x'):绘制真实的线性关系y = x的折线图,颜色为红色,标签为y = x
  • plt.plot(x, y_pred, color='green', label='Predicted'):绘制模型预测结果的折线图,颜色为绿色,标签为Predicted
  • plt.legend():显示图例,方便区分不同的图形。
  • plt.show():显示绘制好的图形。

四、注意事项

  1. 本代码实现的是一个简单的线性回归神经网络,实际应用中可能需要更复杂的模型结构和优化方法。
  2. 学习率lr和训练轮数epochs是超参数,可能需要根据具体数据和任务进行调整以获得更好的训练效果。
  3. 代码中使用的均方误差损失函数和梯度计算公式是针对线性回归问题的常见选择,但在其他问题中可能需要使用不同的损失函数和梯度计算方法。

完整代码

import numpy as np
import matplotlib.pyplot as plt

# 1. 生成数据集
np.random.seed(42)
x = np.linspace(-10, 10, 100)
y = x + np.random.normal(0, 1, x.shape)  # 添加噪声

# 2. 定义神经网络(线性回归)
class SimpleNN:
    def __init__(self):
        self.w = np.random.randn()  # 权重
        self.b = np.random.randn()  # 偏置

    def forward(self, x):
        return self.w * x + self.b  # 前向传播

    def loss(self, y_true, y_pred):
        return np.mean((y_true - y_pred) **2)  # 均方误差

    def gradient(self, x, y_true, y_pred):
        dw = -2 * np.mean(x * (y_true - y_pred))  # 权重的梯度
        db = -2 * np.mean(y_true - y_pred)       # 偏置的梯度
        return dw, db

    def train(self, x, y, lr=0.01, epochs=1000):
        for epoch in range(epochs):
            y_pred = self.forward(x)
            dw, db = self.gradient(x, y, y_pred)
            self.w -= lr * dw  # 更新权重
            self.b -= lr * db  # 更新偏置
            if (epoch + 1) % 100 == 0:
                print(f'Epoch [{epoch+1}/{epochs}], Loss: {self.loss(y, y_pred):.4f}')

# 3. 训练模型
model = SimpleNN()
model.train(x, y, lr=0.01, epochs=1000)

# 4. 可视化结果
y_pred = model.forward(x)
plt.scatter(x, y, label='Data points')
plt.plot(x, x, color='red', label='y = x')
plt.plot(x, y_pred, color='green', label='Predicted')
plt.legend()
plt.show()

相关文章:

  • 【Vue3入门1】01-Vue3的基础 + ref reactive
  • 什么是 DAO?
  • 深入解析libsunrpc:构建分布式系统的核心RPC库
  • [Windows] AI智能音频分离软件SpleeterGui v2.9.5.0【官方中文版】
  • 基于BERT的序列到序列(Seq2Seq)模型,生成文本摘要或标题
  • vue3,element-plus 表格搜索过滤数据
  • 高效团队开发的工具与方法 引言
  • MySQL是怎么保障ACID特性的
  • Docker 容器基础技术:namespace
  • Python----计算机视觉处理(Opencv:直方图均衡化)
  • 本周安全速报(2025.3.18~3.24)
  • GeoServer与MapServer:两款常用的开源地理空间服务器
  • 通过 ECNWP 洋流、海浪可视化开发的方法和架构
  • 破局AI落地困局 亚信科技“四位一体手术刀“切开产业智能三重枷锁
  • 【嵌入式学习2】内存管理
  • Android Compose 框架的 ViewModel 委托深入剖析(二十)
  • 小试牛刀-Turbine数据分发
  • FPGA_YOLO(二)
  • Python Web 框架之 Flask
  • 全文通读:126页华为IPD集成产品开发与DFX实战【文末附可编辑PPT下载链接】
  • 中共中央、国务院关于表彰全国劳动模范和先进工作者的决定
  • 连演三场,歌剧《义勇军进行曲》在上海西岸大剧院上演
  • 美情报机构攻击中国大型商用密码产品提供商,调查报告公布
  • 国家发改委:是否进口美国饲料粮、油料不会影响我国粮食供应
  • 从 “沪惠保” 到 “沪骑保”看普惠保险的 “上海样式”
  • 第二部以“法典”命名的法律!生态环境法典编纂迈出“关键步”