【大数据】机器学习------神经网络模型

一、神经网络模型

1. 基本概念
神经网络是一种模拟人类大脑神经元结构的计算模型,由多个神经元(节点)组成,这些节点按照不同层次排列,通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输入,通过加权求和和激活函数处理后将结果传递给下一层。

在这里插入图片描述

2. 数学公式
对于一个具有 L L L 层的神经网络,第 l l l 层第 j j j 个神经元的输入 z j l z_j^l zjl 可以表示为:
在这里插入图片描述

其中 w i j l − 1 w_{ij}^{l-1} wijl1 是第 l − 1 l-1 l1 层第 i i i 个神经元到第 l l l 层第 j j j 个神经元的连接权重, a i l − 1 a_i^{l-1} ail1 是第 l − 1 l-1 l1 层第 i i i 个神经元的输出(激活值), b j l b_j^l bjl 是第 l l l 层第 j j j 个神经元的偏置。

激活函数 a j l = f ( z j l ) a_j^l = f(z_j^l) ajl=f(zjl),常见的激活函数有:

  • Sigmoid 函数在这里插入图片描述

  • ReLU 函数在这里插入图片描述

  • Tanh 函数在这里插入图片描述

二、感知机与多层网络

1. 感知机
感知机是一种最简单的神经网络,可用于二分类任务。对于输入向量 x = ( x 1 , x 2 , ⋯   , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1,x2,,xn),感知机的输出为:
在这里插入图片描述

其中 (sign) 函数为符号函数,当 (z\geq0) 时,(sign(z)=1);当 (z<0) 时,(sign(z)=-1)。

2. 多层感知机(MLP)
多层感知机包含多个隐藏层,能够解决非线性可分问题。

代码示例:感知机

import numpy as np


class Perceptron:
    def __init__(self, input_size, learning_rate=0.01, epochs=100):
        self.weights = np.random.rand(input_size)
        self.bias = np.random.rand(1)
        self.learning_rate = learning_rate
        self.epochs = epochs

    def activation(self, z):
        return 1 if z >= 0 else -1

    def predict(self, x):
        linear_output = np.dot(x, self.weights) + self.bias
        return self.activation(linear_output)

    def train(self, X, y):
        for _ in range(self.epochs):
            for x, label in zip(X, y):
                prediction = self.predict(x)
                update = self.learning_rate * (label - prediction)
                self.weights += update * x
                self.bias += update


# 示例数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([-1, -1, -1, 1])

# 初始化感知机
perceptron = Perceptron(input_size=2)

# 训练感知机
perceptron.train(X, y)

# 预测
print(perceptron.predict([1, 1]))

在这里插入图片描述

代码解释

  • __init__ 方法初始化感知机的权重、偏置、学习率和训练轮数。
  • activation 是激活函数,这里使用简单的符号函数。
  • predict 计算感知机的输出。
  • train 方法根据训练数据更新权重和偏置。

三、误差逆传播算法(BP 算法)

BP 算法用于训练多层神经网络,通过计算输出误差并将其反向传播更新权重和偏置。

1. 前向传播
计算每层的输入和输出:
在这里插入图片描述

2. 反向传播
计算输出层误差:
在这里插入图片描述

对于隐藏层:
在这里插入图片描述

权重更新公式:
在这里插入图片描述

偏置更新公式:
在这里插入图片描述

代码示例:BP 算法实现

import numpy as np


def sigmoid(z):
    return 1 / (1 + np.exp(-z))


def sigmoid_derivative(z):
    return sigmoid(z) * (1 - sigmoid(z))


class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.weights_input_hidden = np.random.rand(self.input_size, self.hidden_size)
        self.weights_hidden_output = np.random.rand(self.hidden_size, self.output_size)
        self.bias_hidden = np.random.rand(self.hidden_size)
        self.bias_output = np.random.rand(self.output_size)

    def forward(self, x):
        self.z_hidden = np.dot(x, self.weights_input_hidden) + self.bias_hidden
        self.a_hidden = sigmoid(self.z_hidden)
        self.z_output = np.dot(self.a_hidden, self.weights_hidden_output) + self.bias_output
        self.a_output = sigmoid(self.z_output)
        return self.a_output

    def backward(self, x, y, learning_rate):
        # 计算输出层误差
        output_error = y - self.a_output
        output_delta = output_error * sigmoid_derivative(self.z_output)
        # 计算隐藏层误差
        hidden_error = np.dot(output_delta, self.weights_hidden_output.T)
        hidden_delta = hidden_error * sigmoid_derivative(self.z_hidden)
        # 更新权重和偏置
        self.weights_hidden_output += learning_rate * np.outer(self.a_hidden, output_delta)
        self.bias_output += learning_rate * output_delta
        self.weights_input_hidden += learning_rate * np.outer(x, hidden_delta)
        self.bias_hidden += learning_rate * hidden_delta


# 示例数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# 初始化神经网络
nn = NeuralNetwork(input_size=2, hidden_size=2, output_size=1)

# 训练
for epoch in range(10000):
    for x, target in zip(X, y):
        nn.forward(x)
        nn.backward(x, target, learning_rate=0.1)


# 预测
print(nn.forward([1, 1]))
```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/65389eb31fe24fbea5bf766e92472d30.png)

**代码解释**- `sigmoid` 和 `sigmoid_derivative` 函数分别计算 sigmoid 函数及其导数。
- `NeuralNetwork` 类包含初始化权重和偏置、前向传播和反向传播的方法。
- `forward` 计算网络的输出。
- `backward` 计算误差并更新权重和偏置。


**四、全局最小与局部最小**

**1. 概念**
- **全局最小**:在整个参数空间中,损失函数达到的最小点。
- **局部最小**:在参数空间的某个局部区域内,损失函数达到的最小点,但不是全局最小。

**2. 解决方法**
- 随机初始化权重。
- 使用模拟退火等算法。


**五、其他常见神经网络**

**1. 卷积神经网络 (CNN)**
主要用于图像处理,利用卷积层提取特征,通过池化层降低维度。

**代码示例:使用 Keras 实现 CNN**
```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
import numpy as np


# 构建简单的 CNN 模型
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(10, activation='softmax')
])


# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])


# 示例数据
X = np.random.random((100, 28, 28, 1))
y = np.random.randint(0, 10, (100,))


# 训练模型
model.fit(X, y, epochs=10)

代码解释

  • Conv2D 是卷积层,MaxPooling2D 是池化层,Flatten 将多维数据展平,Dense 是全连接层。
  • model.compile 配置模型的优化器和损失函数。
  • model.fit 进行模型训练。

2. 循环神经网络 (RNN)
适用于序列数据,如文本、时间序列,通过隐藏状态保存序列信息。

代码示例:使用 Keras 实现 RNN

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
import numpy as np


# 构建简单的 RNN 模型
model = Sequential([
    SimpleRNN(50, activation='relu', input_shape=(10, 1)),
    Dense(1)
])


# 编译模型
model.compile(optimizer='adam', loss='mse')


# 示例数据
X = np.random.random((100, 10, 1))
y = np.random.random((100, 1))


# 训练模型
model.fit(X, y, epochs=10)

代码解释

  • SimpleRNN 是简单循环神经网络层。
  • 其余部分与 CNN 示例类似,包括模型的编译和训练。

六、深度学习
深度学习是使用具有多个层次的神经网络进行学习的技术,通过大量数据和强大的计算能力训练复杂的网络结构,在图像识别、语音识别、自然语言处理等领域取得了巨大成功。

通过以上内容,你可以对神经网络的各个知识点有一个全面的了解,包括基本的数学公式、不同类型神经网络的实现代码,以及如何使用流行的深度学习框架(如 Keras)进行模型的构建和训练。不同的网络结构和算法可以根据具体的任务和数据特点进行选择和优化,以达到更好的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明&#xff1a; –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明&#xff1a; –…

Unity shader中真的可以动态关闭Stencil Test吗?

这个问题很多年前就有人问了&#xff1a; https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是&#xff1a; set [_StencilComp] to CompareFunction.Disabled to disable the Stencil Op completely. 但是我测试…

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…

win10电脑 定时关机

win10电脑 定时关机 https://weibo.com/ttarticle/p/show?id2309405110707766296723 二、使用任务计划程序设置定时关机打开任务计划程序&#xff1a; 按下“Win S”组合键&#xff0c;打开搜索框。 在搜索框中输入“任务计划程序”&#xff0c;然后点击搜索结果中的“任务…

初识JAVA-面向对象的三大特征之多态

1. 重温面向对象 面向对象是一种解决问题的思想&#xff0c;它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;&#xff0c;主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…

2024年11月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(一)

软考高级系统架构设计师考试包含三个科目&#xff1a;信息系统综合知识、系统架构设计案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午综合知识科目的选择题&#xff0c;同时附带参考答案、解析和所涉知识点。 由于机…

【STM32-学习笔记-8-】I2C通信

文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器&#xff08;软件I2C&#xff09;1、模块内部电路2、寄存器地…

Angular-生命周期及钩子函数

什么是生命周期 Angular 创建和渲染组件及其子组件&#xff0c;当它们绑定的属性发生变化时检查它们&#xff0c;并在从 DOM 中移除它之前销毁它们。生命周期函数通俗的讲就是组件创建、组件更新、组件销毁的时候会触发的一系列的方法。当 Angular 使用构造函数新建一个组件或…

【计算机网络】深入浅出计算机网络

第一章 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成一种重要的信息服务基础设施 CNNIC 中国互联网网络信息中心 因特网概述 网络、互联网和因特网 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路…

Golang——rune和byte

本文详细介绍Golang中的两种字符类型rune和byte&#xff0c;介绍他们的区别&#xff0c;编码方式和简单的使用。 文章目录 byte 类型rune 类型UTF-8 与 Unicode 的关系byte和rune的主要区别Go的默认编码方式遍历方式遍历 byte遍历 rune补充 字符还原从 byte 序列还原字符串从 r…

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…

java springboot3.x jwt+spring security6.x实现用户登录认证

springboot3.x jwtspring security6.x实现用户登录认证 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它用于在网络应用环境中传递声明。通常&#xff0c;JWT用于身份验证和信息交换。JWT的一个典型用法是…

代码随想录刷题day07|(数组篇)58.区间和

目录 一、数组理论基础 二、前缀和 三、相关算法题目 四、总结 五、待解决问题 一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 代码随想录 (programmercarl.com) 特点&#xff1a; 1.下标从0开始&#xff0c;内存中地址空间是连续的 2.查询快&…

专用小软件,完全免费,非常丝滑

今天给大家介绍一个专门将PDF数电发票合并打印的软件&#xff0c;这个软件可以批量操作&#xff0c;完全免费没有任何的广告。 电子发票专用批量打印工具 免费批量使用 软件无需安装&#xff0c;解压之后双击这个图标就能直接使用了。 点击右上角的加号&#xff0c;选中需要打…

安装虚拟机VMware遇到的问题

问题1&#xff1a;进入如下界面&#xff0c;不知道如何操作 解决办法 键盘⬇️&#xff0c;选择“Reset the system”回车 问题2&#xff1a;系统存放位置我给放在了VMware安装目录&#xff0c;具体D:\software\VMware\Windows安装不行 解决办法&#xff1a;D:\software\virt…

Matlab 具有周期性分布的死角孔的饱和空气多孔材料的声学特性

本文对直主孔含侧空腔&#xff08;死角&#xff09;的饱和空气多孔介质中的声传播进行了理论和数值研究。侧腔位于沿每个主孔周期性间隔的“节点”上。研究了侧向空腔分布中周期性的影响&#xff0c;并单独考虑了紧间隔死角的低频极限。结果表明&#xff0c;吸附系数和透射损失…

Vue如何构建项目

目录 1.安装Node.js 2.换源(建议) 3.选择一个目录 4.创建一个vue项目 5.验证是否成功 1.安装Node.js 安装18.3或更⾼版本的 Nodejs 点击下载->Node.Js中文网 node -v npm -v 安装好后在windows的cmd窗口下运行 如果能运行出结果就说明安装好了。 2.换源(建议) //…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

MacOS 下 Memory Analyzer 启动报错

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

sql模糊关联匹配

需求目标&#xff1a; 建立临时表 drop table grafana_bi.zbj_gift_2024;USE grafana_bi; CREATE TABLE zbj_gift_2024 (id INT AUTO_INCREMENT PRIMARY KEY,userName VARCHAR(255),giftName VARCHAR(255),giftNum INT,points INT,teacher VARCHAR(255),sendDate DATETIME,…