从简单线性回归到TensorFlow深度学习

大家好,人工智能近年来变得越来越流行,学习人工智能的需求也随之增加,尤其是许多IT专业人士希望利用机器学习的强大功能,但面临不小的挑战,尤其是在理论和数学上。

步骤1:线性回归

线性回归是一种统计学中常用的回归分析方法,用于建立一个自变量和一个或多个因变量之间的关系模型。在线性回归中,我们假设自变量和因变量之间存在一个线性关系,即因变量的值可以通过对自变量进行线性组合来预测。

线性回归可以用于解决各种问题,例如根据房屋面积、卧室数量、地理位置等因素来预测房价,或者根据广告投入、用户点击率等因素来预测销售额等。

在线性回归中,我们通常使用最小二乘法来估计模型参数,即通过最小化预测值与实际值之间的差异来确定自变量的系数。线性回归还可以通过引入多项式项、交互项等来建立更复杂的模型,以更好地适应实际情况。

下图通过随机生成一些数据,并进行了可视化:

import numpy as np
import matplotlib.pyplot as plt
from helpers import generate_data_lin, plot_linear_model, plot_loss_historyX, y = generate_data_lin(samples=100)
plot_data(X, y)

 将初始斜率和截距设为0:

# 初始化模型系数
slope = 0
bias  = 0# 绘制未经训练的模型
plot_linear_model(X, y, slope, bias)

 实现损失函数、计算模型系数的梯度:

learning_rate = 0.01
epochs = 100
loss_history = []# TODO: 实现损失函数(MSE)
def loss(X, y, slope, bias):return 0# TODO: 计算模型系数的梯度
def gradient(X, y, slope, bias):return 0, 0for i in range(epochs):    # 计算梯度slope_g, bias_g = gradient(X, y, slope, bias)# 更新系数slope -= slope_g * learning_ratebias  -= bias_g  * learning_rate# 更新损失历史loss_history.append(loss(X, y, slope, bias))plot_linear_model(X, y, slope, bias)
plot_loss_history(loss_history)

在这个例子中使用的超参数不多,使用少量的超参数(学习率和周期数)有助于更好地理解它们在训练过程中的作用。

步骤2:多项式回归

从线性回归开始,多项式回归将说明如何添加其他非线性特征(有效地增加模型的复杂性),使我们能够建模更复杂的数据。

由于最终目标是实现神经网络,固定系数的数量可以降低抽象级别。这就是为什么我们通常会使用三次多项式的原因:

图片

import numpy as np
import matplotlib.pyplot as plt
from helpers import generate_data_poly, plot_poly_model, plot_loss_historyX_train, y_train, X_test, y_test = generate_data_poly(samples=100, test_ratio=0.2)
plot_data(X_train, y_train, X_test, y_test)

 

# 用任意的值初始化模型系数
model_coefs = np.array([0, 0.1, 0.1, -0.1])# 绘制未经训练的模型
plot_poly_model(X_train, y_train, model_coefs)

 和之前一样,实现损失函数(MSE)并计算模型系数的梯度:

learning_rate = 0.01
epochs = 100
train_loss_history = []
test_loss_history = []# TODO: 实现损失函数(MSE)
def loss(X, y, model_coefs):return 0# TODO: 计算模型系数的梯度
def gradient(X, y, coef):d0 = 0d1 = 0d2 = 0d3 = 0return np.array([d0, d1, d2, d3])for i in range(epochs):    # 计算梯度coefs_g = gradient(X, y, model_coefs)# 更新系数model_coefs -= codefs_g * learning_rate# 更新损失历史train_loss_history.append(loss(X_train, y_train, model_coefs))test_loss_history.append(loss(X_test, y_test, model_coefs))plot_poly_model(X_test, y_test, model_coefs)
plot_loss_history(train_loss_history, test_loss_history)

步骤3:神经网络回归

最后,我们可以基于简单线性回归和多项式回归,从计算图的角度来处理神经网络,可以将神经网络看作手动计算特征的模型。

从三次多项式(四个系数)到具有四个神经元的神经网络的转变非常无缝。这种比较是神经网络可以被视为对任意数量的计算单元(神经元)的抽象的绝佳说明。尽管每个神经元的单独能力较弱,但在数量较大时它们变得非常强大,因为它们使我们能够统一地计算梯度,从而显著地简化了训练过程。

使用TensorFlow创建神经网络模型:

import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input
from helpers import generate_data_poly, plot_nn_modelX_train, y_train, X_test, y_test = generate_data_poly(samples=100, test_ratio=0.2)model = Sequential([Input(1),Dense(4, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=50,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 修改模型,使用Dense(32, activation='relu')

model = Sequential([Input(1),Dense(32, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=300,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 修改模型,再添加一个Dense(16, activation='relu')

model = Sequential([Input(1),Dense(32, activation='relu'),Dense(16, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=300,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 

综上所述,在机器学习和统计学中,模型参数是指用来描述模型的一组数值或向量。这些参数可以被调整或优化,以使模型能够更好地拟合训练数据,从而提高模型的预测性能。

模型参数的意义通常取决于具体的模型类型。例如,在线性回归中,模型参数包括自变量的系数和截距项,它们描述了自变量和因变量之间的线性关系。在神经网络中,模型参数包括每个神经元的权重和偏置项,它们描述了神经元之间的连接方式和激活规律。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNN架构解析——GRU模型

目录 GRU模型实现优点和缺点 GRU模型 实现 优点和缺点

【C语言day06】

逻辑或运算如果前表达式为真,后表达式不计算,第一次循环时i为0,执行i,第二次循环时i为1,是个真值,不再执行i,也就死循环了 在C语言中,一个函数如果不写返回值类型,那么就…

【MyBatis 学习三】子段不一致问题 多表查询 动态SQL

目录 一、解决Java实体类属性与数据库表字段不一致问题 🌷现象1:显示字段不对应:使用ResultType查询结果为null; 🌷解决办法:字段不对应:使用ResultMap解决。 二、数据库的多表查询 &#…

【Spring Cloud Alibaba】Sentinel运行原理

文章目录 前言1、基本原理2、SphU.entry()2.1、StringResourceWrapper2.2、Entry 3、entry.exit()4、Context 前言 本文基于sentinel-1.8.0版本 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保…

ajax axios json

目录 一、ajax概述 1. 概念 2. 实现方式 (1)原生的JS实现方式(了解) (2) JQeury实现方式 二、axios 介绍 三、axios使用 1. axios 发送get/post请求 2. axios验证用户名称是否存在 四、json 1. …

设计模式——观察者模式

文章目录 1 概述2 实现3 总结 1 概述 观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸&am…

vue3+ts+elementui-plus二次封装弹框

一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…

【Docker】Consul的容器服务更新与发现

目录 一、Consul二、什么是服务注册与发现1.2什么是consul1.3consul提供的一些关键特性 二、Consul部署2.1环境配置2.2Consul服务器配置1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2.3 registrator服务器配置1. 安装 Gliderlabs/Registrator2. 测试服务…

【数据挖掘】PCA/LDA/ICA:A成分分析算法比较

一、说明 在深入研究和比较算法之前&#xff0c;让我们独立回顾一下它们。请注意&#xff0c;本文的目的不是深入解释每种算法&#xff0c;而是比较它们的目标和结果。 如果您想了解更多关于PCA和ZCA之间的区别&#xff0c;请查看我之前基于numpy的帖子&#xff1a; PCA 美白与…

Leetcode-每日一题【114.二叉树展开为链表】

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…

9个可用于图片转文本的最佳免费 OCR 软件

光学字符识别 (OCR) 软件可帮助将不可编辑的文档格式&#xff08;例如 PDF、图像或纸质文档&#xff09;转换为可编辑和可搜索的机器可读格式。 OCR 应用程序通常用于从 PDF 和图像中捕获文本&#xff0c;并将文本转换为可编辑格式&#xff0c;例如 Word、Excel 或纯文本文件。…

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

C++OpenCV(6):图像阈值操作

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图像阈值化 图像阈值化 阈值又叫临界值&#xff0c;是指一个效应能够产生的最低值或最高值。 例如我们选择的阈值为125&#xff0c;则…

智能网关实现混凝土搅拌机无人自动化

“以前的搅拌站生产时&#xff0c;是需要人工巡检的&#xff0c;运送物料和搅拌时产生的大量粉尘污染和噪音&#xff0c;让工人苦不堪言。但是如果有了物联网搅拌站监测系统智慧园区项目落地后&#xff0c;工人也不用去现场忍受噪音和粉尘了。” 行业痛点 传统模式下的混泥土…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析&#xff0c;生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务&#xff0c;通过将相似的文本样本分组&#xff0c;可以帮助我们发现隐藏在文本数据中的模式和结…

力扣题库刷题笔记73--矩阵置零

1、题目如下&#xff1a; 2、个人Python代码实现 3、个人Python代码思路 a、声明2个空数组p、q&#xff0c;用于存放值为0的元素matrix[i][j]的下标 b、首先遍历二维数组matrix&#xff0c;找到值为0的元素matrix[i][j]&#xff0c;将下标i加入数组p&#xff0c;将下标j加入数…

高通WLAN框架学习(37)-- TDLS(Tunneled Direct Link Setup)通道直接链路建立

一 TDLS概述 隧道直连设置(TDLS)基于IEEE 802.11z-2010IEEE标准802.11z标准(无线局域网介质访问控制(MAC)和物理层(PHY)规范。 TDLS允许与同一AP关联的设备之间建立直接链路。Wi-Fi Direct允许设备之间直接连接,而不需要AP。Wi-Fi联盟认证可用于IEEE 802.11a和802.11g设备的T…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

入局元宇宙,所谓的无限可能到底在哪里?

最近的热点新闻表明&#xff0c;人们似乎认为元宇宙已经走向“死亡”。但实际上&#xff0c;市场应该重新定义对元宇宙的看法&#xff0c;以及正视它最大的机会所在——游戏领域。 1937年5月6日&#xff0c;一架名为兴登堡号的巨大氢能齐柏林飞艇飞临新泽西州曼彻斯特镇上空&a…