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

线性拟合模型

线性拟合模型

一、数据准备部分

importnumpyasnpimportkerasimportmatplotlib.pyplotasplt train_X=np.asarray([30.0,40.0,60.0,80.0,100.0,120.0,140.0])train_Y=np.asarray([320.0,360.0,400.0,455.0,490.0,546.0,580.0])train_X/=100.0train_Y/=100.0
  • train_Xtrain_Y是人工构造的训练数据(x 和 y)。

  • 除以 100 是为了归一化(Normalization),将数据范围从 [30-140] 和 [320-580] 缩放到 [0.3-1.4] 和 [3.2-5.8]),有助于神经网络更快收敛。

  • 这是典型的监督学习回归问题:输入 x → 预测 y。

二、可视化函数

defplot_points(x,y,title_name):plt.title(title_name)plt.xlabel('x')plt.ylabel('y')plt.scatter(x,y)plt.show()defplot_line(W,b,title_name):plt.title(title_name)plt.xlabel('x')plt.ylabel('y')x=np.linspace(0.0,2.0,num=100)y=W*x+b plt.plot(x,y)plt.show()
  • plot_points:画散点图,展示原始数据。

  • plot_line:根据斜率W和截距b画出拟合直线。

三、模型构建

model=keras.models.Sequential()model.add(keras.layers.Dense(units=1,input_dim=1))
  • 只有一层:Dense全连接层
  • units=1:只有一个神经元(输出一个值)
  • input_dim=1:输入数据是一维的(一个特征)
  • 相当于数学公式:y = Wx + b,其中:
    • W:权重(weight),相当于斜率
    • b:偏置(bias),相当于截距

四、编译模型

model.compile(optimizer='sgd',loss='mean_squared_error')
  • optimizer='sgd':使用随机梯度下降优化器
    • SGD是最基础、最经典的优化算法
    • 相比adam,SGD更简单,适合这种简单线性问题
  • loss='mean_squared_error':使用均方误差作为损失函数
    • 计算公式:MSE = Σ(y_pred - y_true)² / n
    • 这是回归问题最常用的损失函数

五、训练模型

history=model.fit(x=train_X,y=train_Y,batch_size=1,epochs=10)
  • batch_size=1批大小为1(在线学习/随机梯度下降)
    • 每看一个样本就更新一次权重
    • 梯度更新频繁,波动较大
    • 内存占用小,适合小数据集
  • epochs=10:训练10轮
    • 把7个样本反复训练10遍
    • 总共训练 7 × 10 = 70 次更新

注意history会记录训练过程中的loss变化,可以用于后续分析

六. 结果可视化

plot_line(model.get_weights()[0][0][0],model.get_weights()[1][0],title_name='Current_Model')
  • model.get_weights()[0]:获取权重W(斜率)
    • [0][0][0]是因为权重的形状是(1,1),需要索引到具体数值
  • model.get_weights()[1]:获取偏置b(截距)
    • [0]是因为偏置的形状是(1,),需要索引到具体数值

这个模型在做什么?

1. 数学本质

这个模型其实就是用神经网络的方式来实现最小二乘法线性回归

  • 要找一条直线y = Wx + b
  • 让这条直线最接近所有数据点
  • "接近"的标准是:均方误差最小

2. 训练过程(SGD)

初始化:W=随机值,b=随机值for10:for每个样本(x_i,y_i):1.计算预测值:y_pred=W*x_i+b2.计算误差:error=y_pred-y_i3.计算梯度:dW=2*error*x_i# 对W的梯度db=2*error# 对b的梯度4.更新参数:W=W-learning_rate*dW b=b-learning_rate*db

完整代码:

importnumpyasnpimportkerasimportmatplotlib.pyplotasplt train_X=np.asarray([30.0,40.0,60.0,80.0,100.0,120.0,140.0])train_Y=np.asarray([320.0,360.0,400.0,455.0,490.0,546.0,580.0])train_X/=100.0train_Y/=100.0#用于对数据点进行可视化defplot_points(x,y,title_name):plt.title(title_name)plt.xlabel('x')plt.ylabel('y')plt.scatter(x,y)plt.show()defplot_line(W,b,title_name):plt.title(title_name)plt.xlabel('x')plt.ylabel('y')x=np.linspace(0.0,2.0,num=100)y=W*x+b plt.plot(x,y)plt.show()plot_points(train_X,train_Y,title_name='Training Points')#建立线性拟合模型,由斜率和偏移两个参数构成,相当于神经元数为1的一层全连接model=keras.models.Sequential()model.add(keras.layers.Dense(units=1,input_dim=1))#成本函数采用均差误差,优化方法使用随机梯度下降model.compile(optimizer='sgd',loss='mean_squared_error')#模型迭代10个轮次,用单样本的方式进行优化history=model.fit(x=train_X,y=train_Y,batch_size=1,epochs=10)plot_line(model.get_weights()[0][0][0],model.get_weights()[1][0],title_name='Current_Model')

附解释可视化函数部分
1.散点图
def plot_points(x, y, title_name):

  • 定义一个名为plot_points的函数。

    x:横坐标数据(如你的 train_X)
    y:纵坐标数据(如你的 train_Y)
    title_name:图表的标题(字符串)

​ plt.title(title_name) # 设置图表标题
​ plt.xlabel(‘x’) # 设置x轴标签
​ plt.ylabel(‘y’) # 设置y轴标签
​ plt.scatter(x, y) # 绘制散点图
​ plt.show() # 显示图表

2.直线图
def plot_line(W, b, title_name):
plt.title(title_name) # 设置图表标题
plt.xlabel(‘x’) # 设置x轴标签
plt.ylabel(‘y’) # 设置y轴标签

​ x = np.linspace(0.0, 2.0, num=100) # 生成100个等间距的x值
​ np: numpy模块的别名
​ .linspace(): 生成等差数列(linear space)
​ 参数:
​ 0.0: 起始值(start)
​ 2.0: 结束值(stop)
​ num=100: 生成100个点

​ y = W * x + b # 计算对应的y值

​ plt.plot(x, y) # 绘制折线图(这里是直线)
​ .plot(): 绘制折线图
​ 参数:(x, y)坐标点

​ plt.show() # 显示图表

http://www.jsqmd.com/news/130897/

相关文章:

  • 高反光条码读取技术突破:京元智能DPM PDA偏振光源与多光谱引擎解析
  • 每日 AI 评测速递来啦(12.23)
  • 最小重量机器设计问题的回溯法分析
  • 2025德国留学机构综合实力榜单 - 栗子测评
  • 2025.12.23总结
  • 看着Uniswap的曲线,你想过自己做Swap吗?
  • 【轴承故障诊断】带频率稀疏学习的轴承故障诊断【含Matlab源码 14763期】
  • 新手买钓鱼竿怎么选?2025年鱼竿新手入门推荐TOP榜品牌解析 - 品牌2026
  • 鸿蒙学习实战之路-弹性布局 Flex 全攻略
  • 补充——CSS伪元素选择器,继承,优先级以及字体样式
  • 一条SQL直接跑崩288核,1.5T内存数据库
  • TypeScript 与后端开发Node.js - 实践
  • 大一新手不知道做什么?一个Arduino 闪烁LED红绿灯震惊全班同学!
  • 当中断绑核遇上大模型推理:HostBound 问题优化全解析(昇腾深度实战版)
  • 2025uv喷码机厂家推荐/uv喷码机排名 - 栗子测评
  • 121. 买卖股票的最佳时机
  • 考研初试落幕,前方星光依旧!大学生考研初试后超全攻略
  • Axelspace与Exolaunch签署多批次发射安排协议并计划发射新卫星
  • 鱼竿排名第一名到第十名推荐:十大钓鱼竿品牌排行榜,国产十大鱼竿排名盘点 - 品牌2026
  • 异常
  • 职场笔杆子必看!2025公文写作软件TOP3对比
  • 给自己做一个 ChatGPT:基于 Gradio 的本地 LLM 网页对话界面
  • 【鸿蒙开发者跨平台开发可选工具】Windows 11 安装 Android Studio 完整指南
  • Axelspace:与Pale Blue, Inc.签署在轨演示服务合同的公告
  • 面试官:大模型对齐中的 RLHF 与 DPO有什么本质区别?为何 DPO 能替代 RLHF?
  • XGBoost-机器学习【笔记向,持续加工中】
  • 鸿蒙学习实战之路-相对布局 RelativeContainer 全攻略
  • 易路iBuilder: 独立业务智能体平台,企业无需更换系统,快速构建AI就绪型组织
  • 成为博客的第一天
  • Java虚拟机面试题:内存管理(下)