其他分享
首页 > 其他分享> > 数据挖掘神经网络—R实现

数据挖掘神经网络—R实现

作者:互联网

神经网络

人工神经网络是生物神经网络在某种简化意义下的技术复现,作为一门学科,它的主要任务是根据生物神经网络的原理和实际应用的需要建造实用的人工神经网络模型,设计相应的学习算法,模拟人脑的某种智能活动,然后在技术上实现出来用以解决实际问题。因此,生物神经网络主要研究智能的机理;人工神经网络主要研究智能机理的实现,两者相辅相成。生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神经元相连,形成一个高度复杂高度灵活的动态网络。作为一门学科,生物神经网络主要研究人脑神经网络的结构、功能及其工作机制,意在探索人脑思维和智能活动的规律。

一、神经网络概述

随着人们对感知机兴趣的衰退,神经网络的研究沉寂了相当长的时间。80年代初期,模拟与数字混合的超大规模集成电路制作技术提高到新的水平,完全付诸实用化,此外,数字计算机的发展在若干应用领域遇到困难。这一背景预示,向人工神经网络寻求出路的时机已经成熟。美国的物理学家Hopfield于1982年和1984年在美国科学院院刊上发表了两篇关于人工神经网络研究的论文,引起了巨大的反响。人们重新认识到神经网络的威力以及付诸应用的现实性。随即,一大批学者和研究人员围绕着 Hopfield提出的方法展开了进一步的工作,形成了80年代中期以来人工神经网络的研究热潮。

1. 神经网络算法思想

在生物神经网络中,每个神经元的树突接受来自之前多个神经元输出的电信号,将其组合成更强的信号。如果组合后的信号足够强,超过阀值,这个神经元就会被激活并且也会发射信号,信号则会沿着轴突到达这个神经元的终端,再传递给接下来更多的神经元的树突,如下图所示。

仿照生物神经网络,构建多层人工神经网络,每一层的人工神经元都与其前后层的神经元相互连接,如图2所示。在每个连接上显示了相关的连接权重,较小的权重将弱化信号,而较大的权重将放大信号。对于神经网络中的单个神经元而言, 人工神经元的前半端(图3中红色虚线框)相当于生物神经元的树突,是输入端,用来接受多个神经元输出的信号并进行组合;人工神经元的后半端(图3中绿色虚线框)相当于生物神经元的轴突,是输出端,用来输出信号给接下来更多的神经元;前后端中间的分界线是激活函数,相当于生物神经元的阀值函数,用来对输入的组合信号判断是否达到阀值,如果达到阀值则该神经元激活,向输出端输出信号,否则抑制信号,不进行输出。

因此,神经网络的基本原理是将神经网络的输出值y与训练样本中标定的真实输出值进行比较,计算出输出误差,之后再使用这个误差值来指导前后两层中每两个神经元之间连接权重的调整,进而逐步改善神经网络的输出值,直至与训练样本的真实输出值之间的误差达到很小,在设定的可容忍范围内为止。可以看出,前后两层中每两个神经元之间的连接权重就是神经网络需要进行学习的内容,对这些连接权重持续进行优化,才能使神经网络的输出越来越好,达到我们满意的结果。

3.神经网络正向计算输出
如上图2所示,输入信号从第一层(也就是输入层)进入神经网络后,不管自输入层以后到底有多少层,都可以使用以下两步来计算经过各层后的输出信号:一是利用连接权重来调节从前一层中各神经元输入的信号并进行组合;二是对组合之后的信号应用激活函数,生成该层的输出信号。而对于第一层的输入层而言,仅仅表示输入层中每个神经元的输入而已,对输入层中每个神经元不使用激活函数。因此,用强大的矩阵运算来表示以上所描述的自输入层以后每一层神经网络的正向输出值的话,则为:

[公式][公式]

其中,公式(1)就是利用连接权重来调节从前一层中各神经元输入的信号并进行组合,[公式]是组合后的信号矢量,[公式]是该层的各神经元与前一层的各神经元之间的连接权重矩阵,[公式]是前一层的输入信号矢量;公式(2)是对组合之后的信号应用激活函数并生成该层的输出信号,[公式]是该层的输出信号矢量,[公式]是所采用的激活函数(也就是S阀值函数)。

  1. 神经元
    神经元(neuron)是神经网络的基本计算单元,也被称作节点(node)或者单元(unit)。它可以接受来自其他神经元的输入或者是外部的数据,然后计算一个输出。每个输入值都有一个权重(weight),权重的大小取决于这个输入相比于其他输入值的重要性。然后在神经元上执行一个特定的函数 f, 定义如下图所示,这个函数会该神经元的所有输入值以及其权重进行一个操作。

2. 神经网络的计算步骤

三层神经网络的代码框架
在以上描述的神经网络的基本原理以及相关计算公式的基础上,可以使用Python语言制作三层但不限每层中节点数目的神经网络。因此,一个神经网络类至少应该包括以下三个函数:

初始化函数——设定输入层、中间层和输出层节点的数目,设置学习率的大小, 随机初始化输入层和中间层以及中间层和输出层之间的连接权重矩阵。
训练函数——给定训练集样本后,正向计算输出值并根据样本标定的真实值算出误差值,再反向传播误差算出中间层的误差值,最后计算出误差函数相对于连接权重的斜率并利用梯度下降法更新输入层和中间层以及中间层和输出层之间的连接权重矩阵。
查询函数——给定输入后,计算出自输入层以后每一层神经网络的正向输出值并输出神经网络的最终值。

3. B-P神经网络

如下图所示,这个神经网络分为3个网络层,分别是输入层,隐藏层和输出层,每个网络层都包含有多个神经元,每个神经元都会跟相邻的前一个层的神经元有连接,这些连接其实也是该神经元的输入。根据神经元所在层的不同,前向神经网络的神经元也分为三种,分别为:
输入神经元:位于输入层,主要是传递来自外界的信息进入神经网络中,比如图片信息,文本信息等,这些神经元不需要执行任何计算,只是作为传递信息,或者说是数据进入隐藏层。
隐藏神经元:位于隐藏层,隐藏层的神经元不与外界有直接的连接,它都是通过前面的输入层和后面的输出层与外界有间接的联系,因此称之为隐藏层,上图只是有1个网络层,但实际上隐藏层的数量是可以有很多的,远多于1个,当然也可以没有,那就是只有输入层和输出层的情况了。隐藏层的神经元会执行计算,将输入层的输入信息通过计算进行转换,然后输出到输出层。
输出神经元:位于输出层,输出神经元就是将来自隐藏层的信息输出到外界中,也就是输出最终的结果,如分类结果等。
前向网络中,信息是从输入层传递到输出层,只有前向这一个方向,没有反向传播,也不会循环(不同于RNN,它的神经元间的连接形成了一个循环)。

二、 神经网络R实现

1. 神经网络的数据结构

决策树用到的数据结构如下图所示。

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

2. R处理程序

rm(list = ls())
install.packages("party")
library(party)
data(iris)              #数据输入
head(iris,5)    
#建构决策树模型
output<-ctree(Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,iris)
plot(output)
plot(output,type="simple")


3. 计算结果

predtree<-predict(output,iris)   #利用预测集进行预测
table(iris$Species,predtree,dnn=c("真实值","预测值"))    #输出混淆矩阵
           预测值
真实值       setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         49         1
  virginica       0          5        45                #决策树模型的评估

4.泛化外推预测

row1=c(4.5,2.7,3.1,4.2,0)
names(row1)<-c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species")
row1=t(row1)
row1=as.data.frame(row1)              #泛化数据
lei<-predict(output,row1)
[1] virginica                         #所属类别
Levels: setosa versicolor virginica 

三、总结

2021年6月9日,英国《自然》杂志发表一项人工智能突破性成就,美国科学家团队报告机器学习工具已可以极大地加速计算机芯片设计。研究显示,该方法能给出可行的芯片设计,且芯片性能不亚于人类工程师的设计,而整个设计过程只要几个小时,而不是几个月,这为今后的每一代计算机芯片设计节省数千小时的人力。这种方法已经被谷歌用来设计下一代人工智能计算机系统。研究团队将芯片布局规划设计成一个强化学习问题,并开发了一种能给出可行芯片设计的神经网络。

参考文献

(神经网络的基本原理)[https://zhuanlan.zhihu.com/p/68624851]

标签:输出,实现,神经网络,信号,数据挖掘,setosa,输入,神经元
来源: https://www.cnblogs.com/haohai9309/p/16216336.html