R机器学习:神经网络算法的理解与实操,实例解析

news/2025/1/7 13:56:12/文章来源:https://www.cnblogs.com/Codewar/p/18650925

神经网络算法是一种模仿生物神经网络(尤其是人脑)结构和功能的算法。它由大量相互连接的节点(称为神经元)组成,这些神经元组织成层,通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演着至关重要的角色,尤其擅长处理复杂的模式识别、分类和预测问题。今天给大家介绍下这个算法。

回忆一下高中生物知识,高中的时候我们学过生物神经元:

生物神经元通过树突接收信号,通过轴突发送信号。神经元之间通过突触连接,信号的强弱由突触的“强度”控制。在人工神经网络中,人工神经元模拟了生物神经元的工作原理。它也接收多个输入,每个输入与一个权重相乘,最后通过激活函数生成输出。

整个过程其实是类似的:在生物神经元中,信号由树突接收,经过突触传递到下一个神经元。而在人工神经元中,输入信号经过加权和激活函数后生成输出信号,类似地传递到下一层神经元,类比如图示:

 

神经网络的基本组成包括:

  • 神经元(Neuron): 神经网络的基本单元,也称为节点。每个神经元接收来自其他神经元的输入信号,通过加权求和并应用激活函数进行处理,然后将输出信号传递给其他神经元。
  • 连接(Connection): 神经元之间的连接,每个连接都有一个权重(Weight),表示连接的强度。权重决定了输入信号对输出信号的影响程度。
  • 层(Layer): 神经元按层组织,常见的层包括: 输入层(Input Layer): 接收外部输入信号。 隐藏层(Hidden Layer): 位于输入层和输出层之间,负责对输入信号进行复杂的处理。一个神经网络可以有多个隐藏层,构成深度神经网络。 输出层(Output Layer): 输出最终的计算结果。
  • 激活函数(Activation Function): 应用于神经元输出的函数,引入非线性特性,使神经网络能够处理非线性问题。常用的激活函数包括 Sigmoid、ReLU、Tanh 等。

神经网络层的图示如下:

 

 

就是这么个意思,大家千万不要被神经网络这么高级的名词吓到,其实基本构成还是很简单的。

神经网络的工作原理:

我们依然先来回忆一下生物大脑的学习:大脑通过突触可塑性学习和调整神经元之间的连接强度。通过反复的学习和经验积累,突触的强度会发生变化,从而影响信息的处理方式。

神经网络的学习(反向传播)也是这样:神经网络的学习过程就是通过反向传播算法来调整神经元之间的权重。神经网络会根据预测结果和实际结果之间的误差,调整连接权重,以减少预测误差。

类比解释一下就是:在大脑中,学习是通过调整突触强度来改变神经元之间的连接。在神经网络中,学习是通过调整权重来优化模型的输出。这个权重调整的过程就是训练的过程,调整的过程也涉及到一些优化算法比如梯度下降,但是你都不需要去记,你只需要记住神经网络就是输入数据:数据从输入层进入网络,网络又可分为好几层。输入的时候每个输入有一个“权重”(类似重要性)和一个“偏置”(调整值)。然后通过激活函数对计算结果应用一个数学函数,让输出更灵活,比如让它可以表示“非线性关系”。最后输出结果:经过层层计算,得到预测结果。

神经网络通过以下两个主要过程进行工作:

  • 前向传播(Forward Propagation): 输入信号从输入层开始,逐层传递到隐藏层,最终到达输出层。在每个神经元中,输入信号与连接权重相乘并求和,然后应用激活函数得到输出。
  • 反向传播(Backpropagation): 将输出结果与实际值之间的误差反向传播回网络,根据误差调整连接权重,使网络的输出更接近实际值。这个过程通常使用梯度下降等优化算法。

神经网络又可以可以分为多种类型,常见的包括:

  • 前馈神经网络(Feedforward Neural Network): 信息单向传递,没有循环或反馈连接。常用于分类和回归问题。
  • 循环神经网络(Recurrent Neural Network,RNN): 具有循环连接,可以处理序列数据,例如文本、语音等。
  • 卷积神经网络(Convolutional Neural Network,CNN): 专门用于处理图像和视频等具有空间结构的数据。
  • 自编码器(Autoencoder): 用于数据降维、特征提取等。
  • 生成对抗网络(Generative Adversarial Network,GAN): 用于生成新的数据样本。

实操演示

我们依然是用iris数据集来做一个简单的神经网络分类模型,先用neuralnet 包来做,具体代码如下:

model <- neuralnet(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris, hidden = c(5),      # 隐藏层的神经元数量linear.output = FALSE)  # 因为这是分类任务,不需要线性输出
summary(model)
plot(model)

上面代码中需要注意hidden (hidden = c(5))这个参数:

  • hidden指定隐藏层的结构。可以通过调整这个参数来控制模型的复杂度,增加隐藏层数量或神经元数量。c(5)表示网络有一个隐藏层,且该层包含5个神经元,输出如下:

 

 

图中每条箭头线上标注的数字就是连接权重,表示输入信号对目标神经元的影响大小。例如,从Petal.Width到某隐藏层神经元的一条箭头上标注的数字4.93165,表示Petal.Width的输入被放大了4.93165倍后传递到该隐藏层神经元。

每个隐藏层神经元和输出层神经元都有一个偏置节点(图中顶部标记为1的圆圈)。偏置项通过权重(蓝色箭头上的数字)调节网络的输出,从而增加模型的灵活性。

随意瞅一下该模型分类的准确性哦。只能说真牛,是比前两篇文章中介绍的算法都牛的哦:

 

nnet 包也可以用来做神经网络分析,但是只能做单层神经网络,有局限性,代码如下:结果就不贴出来了:

library(nnet)
# 训练一个包含一个隐藏层的多层感知器
nn <- nnet(iris[, 1:4], class.ind(iris$Species), size = 3, softmax = TRUE)
predictions <- predict(nn, iris[, 1:4], type = "class")
table(predictions, iris$Species)
plotnet(nn)

运行代码后也可以出图,但这个图有点呆哦,不太好看的样子:

 

神经网络的可视化

再单开一块给大家介绍下模型可视化的技巧,对于neuralnet生成的神经网络模型我们可以用plot.neuralnet函数来出图,有很多的参数可以调节,例如我想将输入节点颜色设置为蓝色,隐藏层节点颜色设置为绿色,输出层节点颜色设置为红色,字体大小调整为10我就可以写出如下代码:

plot(nn_model,rep = "best",      # 显示最佳模型col.entry = "blue",# 输入节点颜色col.hidden = "green", # 隐藏层节点颜色col.out = "red",   # 输出层节点颜色show.weights = TRUE, # 显示权重值fontsize = 10)     # 调整字体大小

运行代码后输出如下,其余的参数也都可以调整试试:

 

同样的我们用nnet包做出模型后也可以使用plotnet函数输出模型图,也有很多可以调整的参数,circle_col 参数设置输入层和其余层的节点颜色。circle_cex 控制节点的大小, cex_text 和 cex_val 设置节点标签和权重文字的字体大小,比如我想让输入层为蓝色,其余层为绿色,并且设置文字和节点圈圈的大小我就可以写出如下代码:

plotnet(nn, alpha = 0.8, circle_col = list("blue", "red"), circle_cex = 3, cex_text = 1, cex_val = 0.6, 
        # pos_col = "darkgreen", 
        # neg_col = "red", max_sp = F)

运行后输出如下,大家也可自己调整参数看看哦:

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

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

相关文章

jenkins导出单个作业

进入下面页面,下载jenkin-cli.jar包。java -jar jenkins-cli.jar -s http://192.168.1.205:8080 -auth admin:xxx get-job job1 > job1.xml

DesignWare IP使用——层次化综合加快总体综合速度

记录一下目前综合时遇到的一点小问题。 目前的设计的计算模块里大量使用了DW IP,包括浮点除法器,浮点加减法器,浮点乘法器,浮点求根器,浮点比较器等每个各32个,直接综合的话会发现这些大的计算单元每个都需要进行mapping,会导致综合的总时长长的难以想象(可能需要数天的…

python 长数据转宽数据

import pandas as pd# 长格式数据 df_long = pd.DataFrame({id: [A, A, B, B, C, C],year: [2020, 2021, 2020, 2021, 2020, 2021],value: [10, 15, 20, 25, 30, 35] })print(df_long) df_wide = df_long.pivot(index=id, columns=year, values=value) print(df_wide)

第十八次作业

1、sql注入漏洞中,常见的防护方案有哪些?请简述原理和用法 类型转换: 将输⼊强制转换为整数/浮点 ⽤于整数/浮点类型的输⼊参数处理,可防⽌SQL注⼊。 intval($input) floatval() floor() (int)$input $input + 0 特殊字符转义: addslashes 在单引号()、双引号(")、反…

【自动化测试】Pytest之conftest详解

conftest介绍 pytest中定义个conftest.py来实现数据,参数,方法、函数的共享。 conftest.py 的文件名称是固定的, pytest 会自动识别该文件,可以理解成一个专门存放 fixture 的配置文件。一个工程下可以建多个 conftest.py 文件,一般我们都是在工程根目录下设置的 conftest…

【Spring开发】 老板爱瞎改权限怎么办:注解+AOP 打造复杂权限体系

引言一、权限控制的基本概念二、系统需求分析三、库表设计四、权限控制的注解设计五、切面实现六、权限控制的业务逻辑实现七、结论引言 在软件开发的世界里,权限控制是确保数据安全和业务流程合规性的关键。然而,当老板或管理层频繁地调整权限设置时,这不仅会打乱开发节奏,…

01.03 CW 模拟赛 T2. game

思路 先把赛时的思路搬一下你发现确定两个人的起始点, 其实是可以确定 \(\rm{Alice}\) 的选点可能的, 考虑写个代码验证一下 具体的, 就是分成两个弧, \(\rm{Alice}\) 可以选择一个弧的优势(过半), 然后其他的劣势 感觉现在是猜结论, 全靠感性, 我也不知道怎么解释这个问题 那么…

1.3 可压缩流:喷管和机翼

1.3 可压缩流:喷管和机翼 前言 劳张、劳江必看,劳高请随缘。 超音速喷嘴 基本 对于等熵流动,给出速度变化和管道截面面积变化的关系式: \[\begin{equation}(M^2-1)\frac{dV}{V}=\frac{dA}{A} \end{equation} \]对该公式分3种情况讨论:低速、亚音速,M<1:此时\(M^2-1&l…

C++程序运行的三种方式

1、源代码的注释,2、c++运行方式一、例程 编一个程序,计算机随机产生一个整数(1至5),自己输入一个整数,若两数相同,则输出“恭喜你,中奖了!奖金10元”,否则输出“没中奖,请付费2元”;同时公布中奖号码。 #include <iostream> #include <cstdlib> …

25.01.03

-1喜欢我 \(O(n^2 \log^2 n)\) 过 \(2e5\) 吗😋_ _ _ _ _ _ Ciallo~(∠・ω< )⌒★A 有解的一个必要不充分条件是: 设 \(L_i\) 表示 \(l \le i\) 的左端点数量,\(R_i\) 表示 \(r < i\) 的右端点数量,对于每个位置 \(i\) 满足 \(L_i \ge i \wedge R_i < i\)。 意…

MES 包装 称重 测试备忘

称的功能都差不多,需要MES适配不同品牌的称。 串口输出2中模式:可以调节 精度:精度0.1g 精度是0.001kg 第一种(默认):不停的串口输出。 输出速度很快,容易导致程序死掉。 第二种模式:重量稳定输出。 下面是重量稳定输出模式截图: ------ erwa.cn 二娃测试备忘

深度学习基础理论————训练加速(单/半/混合精度训练)/显存优化(gradient-checkpoint)

主要介绍单精度/半精度/混合精度训练,以及部分框架(DeepSpeed/Apex) 不同精度训练 单精度训练(single-precision)指的是用32位浮点数(FP32)表示所有的参数、激活值和梯度 半精度训练(half-precision)指的是用16位浮点数(FP16 或 BF16)表示数据。(FP16 是 IEEE 标准…