神经网络多层感知器异或问题求解-学习篇

news2024/9/20 18:29:47

多层感知器可以解决单层感知器无法解决的异或问题
首先给了四个输入样本,输入样本和位置信息如下所示,现在要学习一个模型,在二维空间中把两个样本分开,输入数据是个矩阵,矩阵中有四个样本,样本的维度是三维,三个维度分别表示偏置,x坐标,y坐标。对应的标签Y是 区分矩阵中的样本,例如:[1,0,0]对应0,[1,0,1]对应1,以此类推。使用单层感知器无法解决此异或问题,怎么样使用多层感知器求解这个问题?
在这里插入图片描述

#输入数据 各维度表示偏置,x坐标,y坐标
X = np.array([[1,0,0],
              [1,0,1],
              [1,1,0],
              [1,1,1]])
#标签
Y = np.array([[0,1,1,0]])
#第一个网络层参数矩阵,初始化输入层权值,取值范围-1 到 1
V = (np.random.random((3,4)) - 0.5) * 2
#第二个网络层参数矩阵,初始化输入层权值,取值范围-1 到 1
W = (np.random.random((4,1)) - 0.5) * 2
使用误差反向传播算法原理

算法原理:
误差反向传播算法的基本思想是通过两个过程来实现神经网络的训练:信号的正向传播与误差的反向传播。

正向传播: 输入一个训练样本,通过神经网络的前向传播计算出输出结果。具体来说,从输入层开始,计算每一层节点的输出值,直到得到网络最终的输出结果。每一层节点的输出都是基于前一层的输出和当前层的权重、偏置计算得到的。
误差反向传播: 将输出结果与实际结果进行比较,计算出误差。然后,将误差从输出层向输入层反向传播,计算每个节点对误差的贡献,并根据贡献值调整每个节点的权重和偏置。这个过程是通过链式法则实现的,即利用误差的梯度信息来逐层调整权重和偏置。

算法步骤:
初始化: 随机初始化神经网络的权重和偏置。
输入训练样本对: 将训练样本输入到神经网络的输入层。
前向传播: 根据当前的权重和偏置,计算每一层节点的输出值,直到得到网络最终的输出结果。
计算网络输出误差: 将输出结果与实际结果进行比较,计算出误差。误差的计算通常使用损失函数,如均方误差、交叉熵损失等。
反向传播: 根据误差计算每个节点对误差的贡献,并将此贡献值反向传播回去。具体来说,对于每个输出节点,计算其误差,然后将此误差沿着连接线进行反向传播,直到到达输入层的节点。
调整权重和偏置: 根据误差贡献值,对每个权重和偏置进行调整。调整的方法通常是使用梯度下降算法,即根据误差的梯度信息来更新权重和偏置。
检查网络总误差: 检查网络的总误差是否达到精度要求。如果满足,则训练结束;如果不满足,则返回步骤2,继续训练过程。

接下来我们进行一下公式迭代:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据上面的计算,我们就可以求得Wji的参数

下面使用Python解决多层感知器异或问题

import numpy as np
import matplotlib.pyplot as plt

#输入数据
X = np.array([[1,0,0],
              [1,0,1],
              [1,1,0],
              [1,1,1]])
#标签
Y = np.array([[0,1,1,0]])
#第一个网络层参数矩阵,初始化输入层权值,取值范围-1 到 1
V = (np.random.random((3,4)) - 0.5) * 2
#第二个网络层参数矩阵,初始化输入层权值,取值范围-1 到 1
W = (np.random.random((4,1)) - 0.5) * 2

def get_show():
    #正样本
    all_positive_x = [0,1]
    all_positive_y = [0,1]
    #负样本
    all_negative_x = [0,1]
    all_negative_y = [1,0]

    plt.figure()
    plt.plot(all_positive_x, all_positive_y,'bo')
    plt.plot(all_negative_x, all_negative_y,'yo')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

#get_show()

lr = 0.11  #学习率
#激活函数(从0-1)
def sigmoid(x):
    return 1/(1+np.exp(-x))
#激活函数的导数
def dsigmoid(x):
    x = x*(1-x)
    return x
#更新权值(2个权值矩阵,V和W)
def update():
    global X,Y,V,W,lr
    L1 = sigmoid(np.dot(X,V))  #隐藏层输出(4*3)x(3*4)=(4,4)
    L2 = sigmoid(np.dot(L1,W))  #输出层输出(4,4)x(4*1)=(4,1)
    L2_delta = (Y.T - L2) * dsigmoid(L2) #输出层的误差=下一层的误差*激活函数导数*与下一层的连接权重矩阵(全为1)
    L1_delta = L2_delta.dot(W.T)*dsigmoid(L1) #隐藏层的误差=下一层的误差*激活函数导数*与下一层的连接权重矩阵
    W_C = lr*L1.T.dot(L2_delta)
    V_C = lr*X.T.dot(L1_delta)
    W = W + W_C #对W矩阵的参数更新 模型的学习
    V = V + V_C #对V矩阵的参数更新

errors = []  #记录误差
for i in range(100000):
    update() #更新权值
    if i % 1000 == 0: #输出误差
        L1 = sigmoid(np.dot(X,V))
        L2 = sigmoid(np.dot(L1,W))
        errors.append(np.mean(np.abs(Y.T-L2)))
        print("Error:",np.mean(np.abs(Y.T-L2)))
plt.plot(errors)
plt.ylabel('Errors')
plt.show()

L1 = sigmoid(np.dot(X, V))  # 隐藏层输出(4*3)x(3*4)=(4,4)
L2 = sigmoid(np.dot(L1, W))  # 输出层输出(4,4)x(4*1)=(4,1)
print(L2) #第二层的结果 概率矩阵 》0.5是一类,小于05是一类

def classify(x):
    if x > 0.5:
        return 1
    else:
        return 0

for i in map(classify, L2): #L2一共4个数
    print(i)

运行结果为:
在这里插入图片描述

#是与 标签Y = np.array([[0,1,1,0]]) 趋向一致的
[[0.01011728]
 [0.98925078]
 [0.99013233]
 [0.01323669]]
0
1
1
0

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

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

相关文章

以太坊学习

以太坊原理书 区块链的一些基础概念 账户是什么 以太坊的账户共分成两类,外部账户 (Externally Owned Account, EOA ) 与 智能合约 (Contract Account, CA )。 外部账户由 一把私钥 与该私钥对应的公开地址来表示,是普通用户的账户。智能合约账户 没…

一、SpringBoot自动装配原理

目录 一、背景二、原理 一、背景 在Spring的时候,如果我们需要引进一些第三方依赖,还行需要写一些配置类或者xml文件对第三方依赖进行配置。在SpringBoot之后,我们只需要引入这些第三方依赖的一个starter,然后在application.yaml…

pip install速度太慢的多种解决方案

目录 问题描述为什么 pip 速度这么慢?解决方案1. 使用国内镜像源2. 配置多个镜像源3. 使用第三方工具4. 手动下载后本地安装5. 优化网络环境6. 更新 pip 版本 测试效果 问题描述 在使用 Python 进行开发时,我们经常需要使用 pip 来安装第三方库。然而&am…

图片详解,最简单易懂!!!Ubuntu增强功能

文章目录 共享粘贴板共享文件夹vim 共享粘贴板 双击 输入认证用户密码 显示这个界面 命令行界面 reboot就会重新启动 虚拟机 设置下面的选项,就可以实现共享粘贴 共享文件夹 先在本机(windows)新建一个共享文件夹 再在ubuntu建一个共…

minio的下载和springboot整合minio使用

下载minio 基于docker拉取minio镜像 docker pull minio/minio 创建minio容器 先创建/root/minio/data 和 /root/minio/conf docker run -d -p 9000:9000 -p 9001:9001 --name minio \ -e "MINIO_ROOT_USERhtsdg" \ -e "MINIO_ROOT_PASSWORD12345678" \ -v…

CTK框架(十):PluginAdmin插件

目录 1.引言 2.实现原理 3.实际应用 3.1.界面控制 3.2.访问服务管理插件 4.总结 1.引言 在CTK框架(三): 插件的安装讲解了插件的安装、启动、停止和卸载方法,对于一个插件可以这样写;但是如果是在一个大型的应用程序中,里面有很多插件&…

Android SPN/PLMN 显示逻辑简介

功能描述 当设备驻网后(运营商网络),会在状态栏、锁屏界面、下拉控制中心显示运营商的名称。 此名称来源有两种: 1、SPN(Service Provider Name) 2、PLMN (Public Land Mobile Name) 功能AOSP默认逻辑SPN提供SIM卡的运营商名称预置在SIM EF中,SIM卡发行运营商名称…

GESP等级考试C++二级-ASCII码与字符

1 ASCII码介绍 ASCII码是American Standard Code for Information Interchange,即美国标准信息交换码的简称。 ASCII码的主要功能是将键盘上输入的字符(如数字、字母、特殊符号等)转换为计算机能够识别的二进制数,即每个字符都对…

Java 每日一刊(第5期):变量守护者

前言 这里是分享 Java 相关内容的专刊,每日一更。 本期将为大家带来以下内容: 量子数据宇宙的变量守护者第一章:能源错配与基本数据类型第二章:引用类型与通讯网络的崩溃第三章:作用域冲突与系统崩溃终章&#xff1…

C++的流提取(>>)(输入) 流插入(<<)(输出)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 什么是输入和输出流 流提取&#xff08;<<&#xff09;(输入) 理解&#xff1a;我们可以理解为&#xff0c;输入到io流里面&#xff0c;比如是cin&…

数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储

文章目录 栈的应用1.栈的括号匹配代码实战:问题分析:2.栈的表达式求值2.1 中缀、后缀、前缀表达式2.2 中缀表达式改写为后缀表达式(手算)2.3 后缀表达式的计算(手算)2.4 中缀表达式转前缀表达式&#xff08;手算)和计算前缀表达式2.5后缀表达式的计算(机算)2.6 中缀表达式转后缀…

win10+eclipse+ESP8266_RTOS_SDK开发环境构建

官网教程 https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/eclipse-setup.html 1. 导入工程 Build and Flash with Eclipse IDE — ESP8266 RTOS SDK Programming Guide documentation (espressif.com) 导入整个SDK&#xff0c;便于查看所有代…

网络安全 day6 --- 抓包技术HTTPS协议小程序PC应用WEB转发联动

免责声明 本免责声明适用于作者所有文章内容。使用者需明确&#xff0c;网络安全技术仅供学习和合法研究使用&#xff0c;不得用于任何非法活动&#xff0c;如未经授权的入侵、攻击或数据窃取&#xff0c;所有相关法律责任由使用者自行承担。由于网络安全操作可能带来系统崩溃、…

智慧工地数据集-可移动生产要素检测与分割

智慧工地数据集&#xff0c;可移动生产要素检测与分割数据集篇&#xff0c;超高清数据&#xff0c;拍摄于武汉火神山&#xff0c;雷神山医院。包含13种工地中主要移动目标&#xff0c;Bulldozer - 推土机 Concrete mixer - 混凝土搅拌机 Crane - 起重机 Excavator - 挖掘机 Han…

jsp+servlet+mysql机票订票管理系统

jspsevletmysql机票订票管理系统 一、系统介绍二、功能展示1.机票查询2.选择航班3.填写乘客信息4.提交定单 四、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a; 机票查询 1.航行类型 2.出发城市 3.到达城市 4.出发日期 5.返回日期 选择航班 1.航班信息 2.起飞时间…

瑞芯微rv1126 Linux 系统,修改系统时区,包有效方法

在 Linux 系统中,修改时区的步骤通常包括创建符号链接到正确的时区文件,并确保相关的配置文件已正确更新。然而,某些系统可能有额外的步骤或需要修改其他配置文件来使更改生效。以下是一些步骤。 1. 创建符号链接 ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localti…

GitLab邮箱发送邮件:如何实现自动化发信?

gitlab邮箱发送邮件设置教程&#xff1f;Gitlab邮箱配置和使用&#xff1f; GitLab不仅提供了代码版本控制、持续集成/持续部署等功能&#xff0c;还支持通过其内置的邮件功能实现自动化邮件发送。AokSend将深入探讨如何在GitLab中配置和使用邮箱发送邮件功能。 GitLab邮箱发…

如何在 Selenium 中获取网络调用请求?

引言 捕获网络请求对于理解网站的工作方式以及传输的数据至关重要。Selenium 作为一种 Web 自动化工具,可以用于捕获网络请求。本文将讨论如何使用 Selenium 在 Java 中捕获网络请求并从网站检索数据。 我们可以使用浏览器开发者工具轻松捕获网络请求或日志。大多数现代 Web…

react18基础教程系列--安装环境及packagejson文件分析

一个React项目中&#xff0c;默认会安装: react:React框架的核心react-dom:React 视图渲染的核心「基于React构建WebApp(HTML页面)J—>react-native:构建和渲染App的react-scripts: 脚手架为了让项目目录看起来干净一些&#xff0c;把webpack打包的规则及相关的插件/LOADER…

一、链表-算法总结

文章目录 一、链表1.1 提纲1.2 链表删除1.2.1 删除排序链表中的重复元素&#xff08;仅保留一个重复元素&#xff09;1.2.2 删除排序链表中的重复元素 II &#xff08;删除所有重复的元素&#xff09; 1.3 链表反转1.3.1 反转链表1.3.2 反转链表 1.4 合并链表1.4.1 合并两个有序…