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

news2025/1/14 4:16:02

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

步骤1:线性回归

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt
from helpers import generate_data_lin, plot_linear_model, plot_loss_history

X, 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, 0

for i in range(epochs):    
    # 计算梯度
    slope_g, bias_g = gradient(X, y, slope, bias)
        
    # 更新系数
    slope -= slope_g * learning_rate
    bias  -= 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_history

X_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 = 0
    d1 = 0
    d2 = 0
    d3 = 0
    return 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_model

X_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.coloradmin.cn/o/780684.html

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

相关文章

Centos7:http/PhP升级

系列文章目录 RHCE第0章:RHCE开始前的准备 RHCE第1章:Web服务器(上) RHCE第1章:Web服务器(下) RHCE第2章:DNS服务 RHCE第3章:DHCP服务器 RHCE第4章:Firewall…

第一天基础名词

文章目录 一、域名1、域名的概念2、域名注册3、域名的分类 二、DNS1、DNS的概念2、DNS解析3、本地hosts文件与DNS的关系4、如何查看本地Hosts文件 三、CDN1、CDN的概念2、CDN原理(1)回顾域名解析(2)CDN原理 3、常见DNS攻击 四、脚…

【C语言】结构体与offsetof实现

远看山有色,近听水无声。春去花还在,人来鸟不惊。 — 唐代王维《画》 这篇博客我们会详细介绍结构体相关知识,干货满满。 结构体的声明🍀 一般来说结构体应该有成员列表和变量列表这两个基础的模式。 例如描述一个学生&#xf…

Windows下YUICompress实现js、css混淆压缩

首先,我们针对Linux下的部分命令进行Windows系统的对应实现 ls————cmd /c dir/b rm————cmd /c del mv————cmd /c move pwd————cmd /c chdir 注:cmd /c是执行完命令后关闭命令行窗口、cmd /k是执行完命令后不关闭命令行窗口、cmd /c sta…

Vue第五篇:电商网站登录时vuex的使用

页面: 代码资源见:https://download.csdn.net/download/benben044/88071987 其中css使用开源库的UI,Main里面的元素是一张截图。 通过vuecli脚手架生成的代码架构如下: 一、入口组件App.vue解析 主页面主要由两部分组成&#x…

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

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

OSI七层模型和TCP/IP四层模型以及五层模型

OSI七层模型(Open System Interconnect)即开放系统互连参考模型,是由ISO(International Organization for Standardization)国际标准化组织提出的,用于计算机或通信系统间互联的标准体系。 从上到下可分为…

Flask 导航栏,模版渲染多页面

项目结构 app.py from flask import Flask, render_templateapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/secondpage) def secondpage():return render_template(secondpage.html)app.route(/threepage) def threepage():ret…

Linux驱动开发实战(一)——设备驱动模型

文章目录 前言设备驱动模型概述设备驱动模型的功能sysfs文件系统sysfs文件系统的目录结构 设备驱动模型的核心数据结构kobject结构体设备属性kobj_type 注册kobject到sysfs中的实例设备驱动模型结构kset集合kset与kobject的关系kset相关的操作函数注册kobject到sysfs中的实例实…

绘出「星辰大海」:华为云Astro轻应用新手指南-第一章

第1章 旅程的开端 发现Astro轻应用地图 第1站:创建账户 首先,你需要在华为云Astro官网注册专属账号。若已有华为账户,可直接登录。 在官网点击「立即使用」,即可跳转至「登录界面」 在「登录界面」点击「注册」,注册…

后端(四):博客系统项目

咱们在这里实现的是后端项目,前端代码就提一提,不全做重点介绍,在开始讲解这个博客系统项目之前,我们先看看这个项目的前端界面: 登录界面: 个人主页: 博客详情页: 写博客页&#x…

Python实战

官方文档 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 LearnPythonPython 实现功能点demo

Mac苹果系统安装双系统Windows10 Windows11 BOOTCAMP

Mac系统安装双系统Windows10 BOOTCAMP详细 1.下载Windows系统2.开始安装3.安装驱动4.默认启动5.备注 1.下载Windows系统 注意一下所有安装全程接充电器操作,以免安装过程中电脑断电带来不必要影响。 从下列方式选择合适的系统进行下载。 MSDN https://msdn.itelly…

【NLP】无服务器问答系统

一、说明 在NLP的眼见的应用,就是在“ 当你在谷歌上提出一个问题并立即得到答案时会发生什么?例如,如果我们在谷歌搜索中询问谁是美国总统,我们会得到以下回答:Joe Biden;这是一个搜索问题,同时…

概率论的学习和整理--番外14:如何理解 dutu输光定理

解决问题 1 dutu 拿100是赌一次好,还是100次1元的好? 一般的地方,如果不是公平赌局,而期望是负数的话 其实du次数越多越亏 2 1%就基本能决定胜负 了 3 千万不要陷入常人思维,用筹码数量思考,输光为止&am…

选读SQL经典实例笔记10_高级查询

1. 结果集分页 1.1. 只有做过了排序,才有可能准确地从结果集中返回指定区间的记录 1.2. DB2 1.3. Oracle 1.4. SQL Server 1.5. sql select salfrom ( select row_number() over (order by sal) as rn,salfrom emp) xwhere rn between 1 and 5 SAL ----800 95…

周末作业 c++

将顺序栈&#xff0c;循环队列定义成模板类型&#xff1a; #include <iostream>using namespace std;template <typename T,int Maxsize> class seqstack { private:T data[Maxsize];int top; public:seqstack() //无参构造{top-1;cout<<"无参构造…

jenkins使用企业微信进行审批

该篇文章实现了基于企业微信进行审批的功能&#xff08;也支持其他的webhook&#xff09; 前提是进行sharelibrary的配置 一、首先我们使用jenkins的sharelibrary进行审批人全局参数的设置&#xff08;该步骤是为了当审批人变动时不需要该每个pipeline只改动全局变量即可&…

❤️创意网页:抖音汉字鬼抓人小游戏复刻——附带外挂(“鬼鬼定身术”和“鬼鬼消失术”)坚持60秒轻轻松松(●‘◡‘●)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

《零基础入门学习Python》第053讲:论一只爬虫的自我修养

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 马上我们的教学就要进入最后一个章节&#xff0c;Pygame 嗨爆引爆全场&#xff0c;但由于发生了一个小插曲&#xff0c;所以这里决定追加一个章节&#xff0c;因为…