news 2026/2/24 15:24:52

线性拟合模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性拟合模型

线性拟合模型

一、数据准备部分

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() # 显示图表

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 18:20:49

Java虚拟机面试题:内存管理(下)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

作者头像 李华
网站建设 2026/2/18 23:39:10

KeyShot许可证激活步骤及使用指南

一、KeyShot许可证激活步骤 获取许可证文件:从官方渠道或授权合作伙伴处获取KeyShot许可证文件。 打开KeyShot软件:启动软件后,您将看到许可证激活界面。 输入许可证信息:在界面中输入许可证文件的名称、许可证密钥等必要信息。 选…

作者头像 李华
网站建设 2026/2/7 19:04:31

网络编程基础:OSI 模型与 TCP/IP 协议栈详解

作为网络编程的入门核心,理解网络分层模型是掌握数据通信逻辑的关键。本文将拆解 OSI 七层模型的功能,并对比 TCP/IP 协议栈的简化设计,帮你快速建立网络通信的底层认知。一、OSI 七层模型:网络通信的 “标准框架”OSI&#xff08…

作者头像 李华
网站建设 2026/2/22 14:52:32

EagleTrader交易员采访|不遵守交易规则,真的是自由吗?

对很多交易员来说,真正的困难,从来不是行情本身。而是在一次次盈利与回撤之间,仍然愿意相信规则;是在没有掌声、没有监督的交易日里,持续做出那些“看起来不那么刺激”的选择。这类情况也往往只会被少数人长期坚持。朱…

作者头像 李华