神经网络 —— 模拟人脑的计算方式

news2024/11/22 13:59:06

神经网络能够反映人类大脑的行为,允许计算机程序识别模式,以及解决人工智能、机器学习和深度学习领域的常见问题。

  • 人类发明的灵感来源有很多都是来自大自然,神经网络同样如此。人工神经网络是一种类似于人类神经网络的信息处理技术。但事实上,神经网络有很多种,虽然他们都统称为“神经网络”,但每种神经网络都各有其内部的机制与原理以及不同的神经网络采用不同的网络模型和学习机制。
  • 神经网络反映人类大脑的行为,允许计算机程序识别模式,以及解决人工智能、机器学习和深度学习领域的常见问题。

2.1 生物神经网络的基本原理

在生物神经网络中,每个神经元与其他神经元通过突触进行连接。

  • 人,无疑是有智能的。如果想让“人造物”具备智能,模仿人类是最朴素不过的方法论了。自然地,人们同样期望研究生物大脑的神经网络,然后效仿之,从而获得智能。人工神经网络(Artificial Neural Network, ANN)便是其中的研究成果之一。而人工神经网络的性能好坏,高度依赖于神经系统的复杂程度,它通过调整内部大量“简单单元”之间的互连权重达到处理信息的目的,并具有自学习和自适应的能力。
  • 而上述定义中的“简单单元”,就是神经网络中的最基本元素——神经元(Neuron)模型。如图所示,在生物神经网络中,每个神经元与其他神经元通过突触进行连接,神经元在工作的过程中,其他神经元的信号(输入信号)通过树突传递到细胞体(也就是神经元本体)中,细胞体把从其他多个神经元传递进来的输入信号进行合并加工,然后再通过轴突前端的突触传递给别的神经元。

神经元之间的信息传递,属于化学物质的传递。

  • 神经元之间的信息传递,属于化学物质的传递。当神经元“兴奋”时,就会向与它相连的神经元发送化学物质(神经递质,Neurotransmitter),从而改变这些神经元的电位。如果某些神经元的电位超过了一个阈值,相当于达到了阈值函数器的阈值,那么它就会被“激活”,在也就是“兴奋”起来,接着向其他神经元发送化学物质,一层接着一层传播。

2.2 M-P神经元模型

2.2.1 基本概念

M-P神经元模型实际上是对单个神经元的一种建模。

  • 在这一模型中,神经元接收来自各个其他神经元传递过来的输入信号。这些信号的表达,通常通过神经元之间连接的权重(Weight)大小来表示,神经元将接收到的输入值按照某种权重叠加起来,叠加起来的刺激强度,可如图用公式表示
  • 从公式可以看出,当前神经元按照某种“轻重有别”的方式,汇集了所有其他外联神经元的输入,并将其作为一个结果输出。但这种输出,并非直接输出,而是与当前神经元的阈值进行比较,然后通过激活函数(Activation Function)向外表达输出,在概念上这就叫感知机(Perceptron),其模型可用一下公式二来表示: 在这里, 就是所谓的“阈值(Threshold)”, 就是激活函数, 就是最终的输出。可以看出M-P模型就是一个加权求和再激活的过程,能够完成线性可分的分类问题。

2.2.2 代码实现

以经典乳腺癌为例

In [18]

#导入需要的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn.datasets
from sklearn.metrics import accuracy_score #以准确率为评价指标
from sklearn.model_selection import train_test_split #用来分割数据集
#导入数据集
from sklearn.datasets import load_breast_cancer
#分离特征和标签
# 1表示良性,0表示恶性
breast_cancer = sklearn.datasets.load_breast_cancer()
data = pd.DataFrame(breast_cancer.data,columns=breast_cancer.feature_names)
data['class'] = breast_cancer.target
data['class'].value_counts()
X = data.drop('class',axis=1)
y = data['class']
#数据集划分
#划分数据集和测试集,测试集的大小为总体数据的15%。设置stratify=y
#按照数据集中y的比例分配给train和test,使得train和test中各类别数据的比例与原数据集的比例一致。通常在数据集的分类分布不平衡的情况下会用到stratify。
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.15, stratify=y, random_state=0)
#M—P神经元模型仅能把0或1作为输入,所以我们要把数据进行处理,划分为0和1两类。
X_binarise_train =X_train.apply(pd.cut, bins=2, labels=[1,0])
X_binarise_test = X_test.apply(pd.cut, bins=2, labels=[1,0])
#获取value,用数组进行计算
X_binarise_train = X_binarise_train.values
X_binarise_test = X_binarise_test.values
#构建M-P神经元类
class MPNeuron:
    def __init__(self):
        self.b = None
    
    def model(self,x):
        return (sum(x) >= self.b)
    
    def predict(self,X):
        y = []
        for x in X:
            y.append(self.model(x))
        return np.array(y)
    
    def fit(self,X,y):
        accuracy = {}
        for b in range(X.shape[1] + 1):
            self.b = b
            y_pred = self.predict(X)
            accuracy[b] = accuracy_score(y_pred,y)
            
        best_b = max(accuracy, key = accuracy.get)
        self.b = best_b
        #打印最佳b值和最高准确率
        print('best_b:', best_b)
        print('best_accuracy:', accuracy[best_b])

#用M-P神经元训练,机器学习叫作fit,深度学习叫作train
mp_neuron = MPNeuron()
mp_neuron.fit(X_binarise_train,y_train)
#打印accuracy_score
w = mp_neuron.predict(X_binarise_test)
accuracy_score(w,y_test)

2.3 激活函数

2.3.1 基本概念

阶跃函数 — 可以将神经元输入值与阈值的差值映射为输出值1或0.若差值大于等于零则输出1,对应兴奋;若差值小于零则输出0,对应抑制。

  • 前面提到了,神经元的工作模型存在“激活(1)”和“抑制(0)”两种状态的跳变,那么理想的激活函数就应该是图中所示的阶跃函数(Step Function,阶跃函数是一种特殊的连续时间函数,是一个从0跳变到1的过程,属于奇异函数)。阶跃函数可以将神经元输入值与阈值的差值映射为输出值1或0;若差值大于等于零则输出1,对应兴奋;若差值小于零则输出0,对应抑制。
  • 但事实上,在实际使用中,阶跃函数具有不光滑、不连续等众多不“友好”的特性,使用的并不广泛。说它“不友好”的原因是,在神经网络中训练网络权重时,通常依赖对某个权重求偏导、寻极值,而不光滑、不连续等通常意昧着该函数无法“连续可导”。

S型函数(sigmoid函数)— 无论输入值的范围有多大,这个函数都可以将输出挤压在范围(0,1)之内。

  • 因此,我们通常用S型函数函数来代替阶跃函数,最常用的S型函数为sigmoid函数,如图中所示。在sigmoid函数中,无论输入值 的范围有多大,这个函数都可以将输出挤压在范围(0,1)之内,因此此这个函数又被称为“挤压函数(Squashing Function)”。这样,如果输入的值在(0,0.5)之间,那么对于Sigmoid函数,则输出大于0.5小于1,对应兴奋;如果输入值在(-0.5,0)之间,那么输出则小于0.5大于0,对应抑制。
  • 既然如此,我们又应该怎样理解激活函数呢?其实从生活中就可以找到相似的影子。比如有一个父亲为了奖励他的孩子,对他说如果下次期末总成绩90分以上就奖励100元,不到90分就没有奖励。现在我们把这一过程抽象为一个M-P神经元模型。父亲最终会有两个状态,一个是奖励100元(激活),一个是没有奖励(抑制)。输入的 、 、到 等因素为孩子的表现,比如 代表孩子今天有没有认真听课, 代表孩子有没有认真完成作业, 代表孩子考试有没有认真计算。这些表现因素乘以各自的权重相加就是孩子的期末总成绩,如果总成绩没有超过父亲奖励的阈值,则最终相减的结果小于0,经过阶跃激活函数后值为0,代表父亲处于抑制状态,也就是没有奖励。但在第二次,孩子学习更加刻苦,考试过程中也特别认真,最后乘以各因素权重后的和超过了父亲的奖励阈值,即超过了90分,则最终相减的结果大于0,此时经过阶跃激活函数后的值为1,代表父亲处于激活状态,于是奖励给了孩子100元。 这便是激活函数以及整个M-P神经元模型的基本原理。

2.3.2 代码实现

阶跃函数

In [2]

import numpy as np  
import matplotlib.pyplot as plt  
def step_function(x):  
    return np.where(x >= 0, 1, 0)   # 如果输入值大于等于0,则输出1,否则输出0
x = np.linspace(-2, 2, 1000)  # 创建一个从-2到2的等差数列,包含1000个元素  
y = step_function(x)  
plt.figure(figsize=(8, 6))  # 创建一个8x6大小的新图形  
plt.plot(x, y)  
plt.title('Step Function')  
plt.xlabel('x')  
plt.ylabel('y')  
plt.grid(True)  # 添加网格线  
plt.axis('on') #显示坐标轴
plt.show()

<Figure size 800x600 with 1 Axes>

S型函数

In [16]

# 导入numpy库,用于进行数学计算  
import numpy as np  
# 导入matplotlib库,用于绘制图形  
import matplotlib.pyplot as plt   
# 定义sigmoid函数,接受一个参数x  
def sigmoid(x):  
    # 返回1 / (1 + np.exp(-x))的结果,np.exp(-x)计算e的-x次方  
    return 1 / (1 + np.exp(-x))   
# 使用numpy的linspace函数在-10和10之间创建一个等间距的点集,结果存储在x中  
x = np.linspace(-10, 10, 1000)  
# 计算每个点的sigmoid值并存储在y中  
y = sigmoid(x)   
# 使用matplotlib的plot函数将这个函数绘制出来  
plt.plot(x, y)  
# 设置图形的标题为"Sigmoid Function"  
plt.title("Sigmoid Function")  
# 设置x轴的标签为"x"  
plt.xlabel("x")  
# 设置y轴的标签为"y"  
plt.ylabel("y")  
# 添加网格线  
plt.grid(True)  
# 显示图像  
plt.show()

<Figure size 640x480 with 1 Axes>

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

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

相关文章

【Linux系统化学习】进程终止的奥秘

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Liunx系统化学习 代码仓库&#xff1a;Gitee 目录 获取函数返回值 退出码 进程退出的场景 错误码 信号终止异常代码 进程的终止 main函数直接return exit函数 _exit函数 获取函数返回值 在C语言学…

如何像高级软件工程师一样使用vscode做开发

以一个真实的代码库为例&#xff0c;带您了解高级软件工程的关键原则是什么&#xff0c;以及如何充分利用vscode提供的各种特性来提高开发效率。您可以将学到的技巧和思想应用于任何项目。 视频地址&#xff1a; 如何像高级软件工程师一样使用vscode做开发 欢迎关注公众号&a…

ViT的极简pytorch实现及其即插即用

先放一张ViT的网络图 可以看到是把图像分割成小块&#xff0c;像NLP的句子那样按顺序进入transformer&#xff0c;经过MLP后&#xff0c;输出类别。每个小块是16x16&#xff0c;进入Linear Projection of Flattened Patches, 在每个的开头加上cls token和位置信息&#xff0c;…

云原生|对象存储|minio分布式集群的搭建和初步使用(可用于生产)

前言&#xff1a; minio作为轻量级的对象存储服务安装还是比较简单的&#xff0c;但分布式集群可以大大提高存储的安全性&#xff0c;可靠性。分布式集群是在单实例的基础上扩展而来的 minio的分布式集群有如下要求&#xff1a; 所有运行分布式 MinIO 的节点需要具有相同的访…

【Java 进阶篇】Redis 缓存优化:提升应用性能的不二选择

在现代的软件开发中&#xff0c;性能一直是开发者们追求的目标之一。对于数据库访问频繁、数据读取较慢的场景&#xff0c;使用缓存是提升性能的有效手段之一。而 Redis 作为一款高性能的内存数据库&#xff0c;被广泛用作缓存工具。本文将围绕 Redis 缓存优化进行详解&#xf…

《深入理解JAVA虚拟机笔记》并发与线程安全原理

除了增加高速缓存之外&#xff0c;为了使处理器内部的运算单元能尽量被充分利用&#xff0c;处理器可能对输入代码进行乱序执行&#xff08;Out-Of-Order Execution&#xff09;优化。处理器会在计算之后将乱序执行的结果重组&#xff0c;保证该结果与顺序执行的结果一致&#…

三台CentOS7.6虚拟机搭建Hadoop完全分布式集群(三)

这个是笔者大学时期的大数据课程使用三台CentOS7.6虚拟机搭建完全分布式集群的案例&#xff0c;已成功搭建完全分布式集群&#xff0c;并测试跑实例。 9 安装hbase 温馨提示&#xff1a;安装hbase先在master主节点上配置&#xff0c;然后远程复制到slave01或slave02 &#xf…

远程网络唤醒家庭主机(openwrt设置)

远程网络唤醒家庭主机&#xff08;openwrt设置&#xff09; 前提&#xff1a; 1.配置好主板bios的网络唤醒功能(网络教程自己百度一下找) 2.电脑开启网络唤醒功能(网络教程自己百度一下找) 3.路由器通过ddns实现域名和动态IP绑定内网穿透方法汇总_不修改光猫进行内网穿透-C…

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

2024收入最高的编程语言

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 1.Python Python 是最流行、用途最广泛的语言之一。它通常用于网络开发、数据科学、机器学习等。 以下是 Python 编程语言的一些主要用途&#xff1a; Web 开发&…

【AIGC科技展望】预测AIGC2025年的机会与挑战

2025年&#xff0c;AIGC的机会与挑战 在未来的五年里&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;将会成为一个越来越重要的领域。但是&#xff0c;伴随着机会而来的是挑战。在这篇文章中&#xff0c;我们将一起探讨AIGC的机会与挑战&#xff0c;并预测2025…

WinForm开发 - C# RadioButton(单选框) 设置默认选中或取消默认选中

WinForm开发中RadioButton组件使用过程中的小技巧。 1、属性界面操作 如果有多个组件&#xff0c;希望不显示默认选中单选框只需要将其Checked属性全部设置为False即可&#xff0c; 如果希望默认多个组件中显示默认选中&#xff0c;将其Checked属性设置为True。 2、代码实…

GEE错误——‘xxx‘ did not match any bands.

这里我们在进行影像展示的时候会出现下面的错误,主要的原因是我们虽然进行了波段运算,但是依旧无法加载,主要原因是我们没有将计算过后的波段信息进行添加到我们的一个多波段影像,这里我们首先来看看代码出现的错误提示。当然这里只是给出了主要的问题,其实在进行波段运算…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

权重函数设计

1e4/(0.5*s^21*s1) 1.4125 抑制驱动器饱和 1e-4*(s1)/(0.001*s1) 10*(s10)/(s1000) 1e-6*(s1)/(0.001*s1) [0.01,0.1],[0.001,1] 0.5*(0.05*s1)/(0.0001*s0.01)

Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

在Android笔记&#xff08;二十二&#xff09;&#xff1a;Paging3分页加载库结合Compose的实现网络单一数据源访问一文中&#xff0c;实现了单一数据源的访问。在实际运行中&#xff0c;往往希望不是单纯地访问网络数据&#xff0c;更希望将访问的网络数据保存到移动终端的SQL…

windows高效的文件夹管理工具QTTabBar

1、介绍&#xff1a; 功能介绍视频https://www.bilibili.com/video/BV13y4y1V782/?spm_id_from333.880.my_history.page.click&vd_sourceef5003729aa0776908befb4d20108803 这个视频很坑&#xff0c;介绍了功能&#xff0c;但没介绍安装方法 2、下载&#xff1a; 下载链…