当前位置: 首页 > article >正文

神经网络|(二)sigmoid神经元函数

【1】引言

在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为:

神经网络|(一)加权平均法,感知机和神经元-CSDN博客

在此基础上,我们认识到神经元本身在做二元分类,是一种非此即彼的选择。

由于不同的数据所占的权重不同,二元分类结果也一定收到权重的影响,为此,必须使用数学表达这种影响力。

在神经网络相关研究的漫长发展进程中,研究范围从单个因素到多个因素,必须关注无数的二元分类结果同时作用后获得的最终分类结果,于是sigmoid()函数被提出。

【2】二元分类结果数学表达

认识感知机的二元分类本质,是研究sigmoid()函数的基础。

这里先创造四个矩阵,这三个矩阵分别代表元素1,元素2,元素1和权重和元素2的权重。

import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

#创造矩阵
a = np.random.randint(5,9,size=(1,5)) #矩阵
b = np.random.randint(1,5,size=(1,5)) #矩阵
c = np.random.randn(1,5) #矩阵
d = np.random.randn(1,5) #矩阵
#阈值开关
k=1
#空矩阵
e =np.zeros((1,5),np.uint8) #用来存储二元分类的计算结果

进行二元分类计算:

#二元分类计算
for i in range (5):
    if a[0,i]*c[0,i]+b[0,i]*d[0,i]-k>0: #阈值计算,满足条件时取1,否则取0
        e[0,i]=1
    else:
        e[0,i]=0
    print('e[0,',i,']=',e[0,i]) #输出阈值计算结果

绘制二元分类的效果:

#绘制二元分类计算的结果
print('a=',a) #输出矩阵
print('b=',b) #输出矩阵
print('c=',c) #输出矩阵
print('d=',d) #输出矩阵
x=np.arange(0,5,1) #定义一个自变量
plt.plot(x,e[0,x]) #对阈值计算结果绘图
plt.savefig('ganzhiji.png') #保存图像
plt.show() #输出图像

这里使用的阈值判断函数为:

for i in range (5):
    if a[0,i]*c[0,i]+b[0,i]*d[0,i]-k>0: #阈值计算,满足条件时取1,否则取0
        e[0,i]=1
    else:
        e[0,i]=0

代码运行后的输出图像为:

图1

图1真实地反映了非此即彼的二元分类效果。

需要注意的是,由于元素的权重使用随机数生成,所以每次运行上述程序,获得的效果可能不一样。

【3】sigmoid函数

实际上,二元分类效果可能不是两个元素算一次就进行判断,而是多个结果互相叠加在一起,也就是把阈值判断函数改为:

f=0 #用来存储二元分类的综合计算结果
#二元分类计算
for i in range (5):
    if i==0:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k  # 阈值计算
    else:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1]  # 阈值计算
if e[0,4]>0: #最后计算结果,超过阈值开关取1,否则取0
    f=1
else:
    f=0

代码运行后,获得的输出图像为:

图2

此时获得的数据分别为:

图3

由图3可见,因为最后的e[0,4]>0,所以f=1。

此时的完整代码为:

import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

#创造矩阵
a = np.random.randint(5,9,size=(1,5)) #矩阵
b = np.random.randint(1,5,size=(1,5)) #矩阵
c = np.random.randn(1,5) #矩阵
d = np.random.randn(1,5) #矩阵
#阈值开关
k=1
#空矩阵
e =np.zeros((1,5),np.uint8) #用来存储二元分类的计算结果
f=0 #用来存储二元分类的综合计算结果
#二元分类计算
for i in range (5):
    if i==0:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k  # 阈值计算
    else:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1]  # 阈值计算
if e[0,4]>0: #最后计算结果,超过阈值开关取1,否则取0
    f=1
else:
    f=0

#绘制二元分类计算的结果
print('a=',a) #输出矩阵
print('b=',b) #输出矩阵
print('c=',c) #输出矩阵
print('d=',d) #输出矩阵
print('e=',e) #输出矩阵
print('f=',f) #输出矩阵
x=np.arange(0,5,1) #定义一个自变量
plt.plot(x,e[0,x]) #对阈值计算结果绘图
plt.savefig('ganzhiji.png') #保存图像
plt.show() #输出图像

sigmoid()函数就是在上述基础上,进一步优化函数表达式,把所有的加权计算结果变成指数函数的变量,并且指数函数还设置成分式的一部分。相应的,有如下函数:

f(x)=\frac{1}{1+exp(-\sum {w}_j{x}_j-b)}

如果把-w_{j}x_{j}-b简化为-x,该函数相应简化为:

f(x)=\frac{1}{1+exp(-x)}

函数对应的图像为:

图4

图4是平滑过渡图像,并且输出结果限定在(0,1)范围内。

绘制图4的代码为:

import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

#创造矩阵
t=np.linspace(-10,10,100) #自变量
y0=np.exp(-t) #指数函数
y=1/(1+y0) #因变量
plt.plot(t,y) #绘制图像
plt.title('sigmoid() function') #图像上设置图名
plt.savefig('sigmoid() function.png') #保存图像
plt.show() #显示图像

【4】函数验证

为验证sigmoid()函数,可以在上述示例中的代码plt.plot(x,e[0,x]) #对阈值计算结果绘图

修改为:

plt.plot(x,1/(1+np.exp(-e[0,x]))) #对阈值计算结果绘图

此时运行代码获得的图像为:

图5

由图5可见,复杂多变的实际情况中,sigmoid()函数的输出结果也是在(0,1)范围内。所以,sigmoid()函数本身具有很强的实用性。

此时的完整代码为:

import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

#创造矩阵
a = np.random.randint(5,9,size=(1,5)) #矩阵
b = np.random.randint(1,5,size=(1,5)) #矩阵
c = np.random.randn(1,5) #矩阵
d = np.random.randn(1,5) #矩阵
#阈值开关
k=1
#空矩阵
e =np.zeros((1,5),np.uint8) #用来存储二元分类的计算结果
f=0 #用来存储二元分类的综合计算结果
#二元分类计算
for i in range (5):
    if i==0:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k  # 阈值计算
    else:
        e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1]  # 阈值计算
if e[0,4]>0: #最后计算结果,超过阈值开关取1,否则取0
    f=1
else:
    f=0

#绘制二元分类计算的结果
print('a=',a) #输出矩阵
print('b=',b) #输出矩阵
print('c=',c) #输出矩阵
print('d=',d) #输出矩阵
print('e=',e) #输出矩阵
print('f=',f) #输出矩阵
x=np.arange(0,5,1) #定义一个自变量
plt.plot(x,1/(1+np.exp(-e[0,x]))) #对阈值计算结果绘图
plt.savefig('sigmoid.png') #保存图像
plt.show() #输出图像

需要注意的是,由于元素的权重使用随机数生成,所以每次运行上述程序,获得的效果可能不一样。

【5】总结

探究了sigmoid()函数,研究了多因素的综合作用。


http://www.kler.cn/a/519108.html

相关文章:

  • npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported
  • 网易Android开发面试题200道及参考答案 (下)
  • 【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文
  • OS Copilot功能测评:智能助手的炫彩魔法
  • 5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)
  • GPB独立站外链:构建长期权威的SEO基础SEO的竞争
  • 07 区块链安全技术
  • 汽车表面划痕刮伤检测数据集VOC+YOLO格式1221张1类别
  • Spring FatJar写文件到RCE分析
  • Vue2下篇
  • 快递代取项目Uniapp+若依后端管理
  • 消息队列篇--通信协议篇--AMOP(交换机,队列绑定,消息确认,AMOP实现实例,AMOP报文,帧,AMOP消息传递模式等)
  • Tailwind CSS—骨架屏生成器
  • LGBMRegressor CatBoostRegressor XGBRegressor回归
  • 有限元分析学习——Anasys Workbanch第一阶段_终篇_齿轮整体强度案例分析
  • 蓝桥杯3518 三国游戏 | 排序
  • C++实现有限元计算 矩阵装配Assembly类
  • Python+OpenCV(1)---傅里叶变换
  • bash: ./xxx: No such file or directory
  • Cesium特效——城市白模的科技动效的各种效果
  • http和ws的区别
  • 【设计模式-行为型】调停者模式
  • libOnvif通过组播不能发现相机
  • 51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片)
  • SpringBoot3+Vue3开发学生选课管理系统
  • CSS 中的 id 和 class 选择器