代数与逻辑:作业四 神经网络

news2024/9/21 11:16:58

代数与逻辑:作业四 神经网络

文章目录

  • 代数与逻辑:作业四 神经网络
    • 一、作业要求
    • 二、简述神经网络模型
    • 三、编程实现感知机模型与二隐层神经网络
      • 1、感知机模型
      • 2、二隐层神经网络
    • 四、选择公开数据集,测试感知机模型与二隐层神经网络性能

一、作业要求

  1. 简述神经网络模型
  2. 编程实现感知机模型与二隐层神经网络
  3. 选择公开数据集,测试感知机模型与二隐层神经网络性能

二、简述神经网络模型

神经网络(Neural Networks,NN)是由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。神经网络具有大规模并行、分布式存储和处理、自组织、自适应和自学能力,特别适合处理需要同时考虑许多因素和条件的、不精确和模糊的信息处理问题。神经网络的发展与神经科学、数理科学、认知科学、计算机科学、人工智能、信息科学、控制论、机器人学、微电子学、心理学、光计算、分子生物学等有关,是一门新兴的边缘交叉学科。

神经网络的基础在于神经元。

神经元是以生物神经系统的神经细胞为基础的生物模型。在人们对生物神经系统进行研究,以探讨人工智能的机制时,把神经元数学化,从而产生了神经元数学模型。
大量的形式相同的神经元连结在—起就组成了神经网络。神经网络是一个高度非线性动力学系统。虽然,每个神经元的结构和功能都不复杂,但是神经网络的动态行为则是十分复杂的;因此,用神经网络可以表达实际物理世界的各种现象。

神经网络模型是以神经元的数学模型为基础来描述的。人工神经网络(ArtificialNuearlNewtokr)s,是对人类大脑系统的一阶特性的一种描。简单地讲,它是一个数学模型。神经网络模型由网络拓扑.节点特点和学习规则来表示。神经网络对人们的巨大吸引力主要在下列几点:

  1. 并行分布处理。
  2. 高度鲁棒性和容错能力。
  3. 分布存储及学习能力。
  4. 能充分逼近复杂的非线性关系。

在控制领域的研究课题中,不确定性系统的控制问题长期以来都是控制理论研究的中心主题之一,但是这个问题一直没有得到有效的解决。利用神经网络的学习能力,使它在对不确定性系统的控制过程中自动学习系统的特性,从而自动适应系统随时间的特性变异,以求达到对系统的最优控制;显然这是一种十分振奋人心的意向和方法。

人工神经网络的模型现在有数十种之多,应用较多的典型的神经网络模型包括BP神经网络、Hopfield网络、ART网络和Kohonen网络。

在这里插入图片描述

三、编程实现感知机模型与二隐层神经网络

1、感知机模型

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 
import joblib
plt.style.use("fivethirtyeight")

class Perceptron:
  def __init__(self, eta, epochs):
    self.weights = np.random.randn(3) * 1e-4 # 随机权重分配
    print(f"训练前的初始权重: n{self.weights}")
    self.eta = eta # 学习率
    self.epochs = epochs 


  def activationFunction(self, inputs, weights):
    z = np.dot(inputs, weights) # z = W * X
    return np.where(z > 0, 1, 0) # 激活函数
  def fit(self, X, y):
    self.X = X
    self.y = y

    X_with_bias = np.c_[self.X, -np.ones((len(self.X), 1))] 
    print(f"X 偏差: n{X_with_bias}")

    for epoch in range(self.epochs):
      print("--"*10)
      print(f"for epoch: {epoch}")
      print("--"*10)

      y_hat = self.activationFunction(X_with_bias, self.weights) # 向前传播
      print(f"前向传播后的预测值: n{y_hat}")
      self.error = self.y - y_hat
      print(f"错误: n{self.error}")
      self.weights = self.weights + self.eta * np.dot(X_with_bias.T, self.error) # 反向传播
      print(f"epoc后更新权重:n{epoch}/{self.epochs} : n{self.weights}")
      print("#####"*10)


  def predict(self, X):
    X_with_bias = np.c_[X, -np.ones((len(X), 1))]
    return self.activationFunction(X_with_bias, self.weights)  # 预测功能

  def total_loss(self):
    total_loss = np.sum(self.error)
    print(f"总体损耗: {total_loss}")
    return total_loss

def prepare_data(df):
    X=df.drop("y",axis=1)
    y=df["y"]
    return X,y
AND = {
    "x1": [0,0,1,1],
    "x2": [0,1,0,1],
    "y": [0,0,0,1],
}

df = pd.DataFrame(AND)

X,y = prepare_data(df)

ETA = 0.3 # 0 和 1
EPOCHS = 10

model = Perceptron(eta=ETA, epochs=EPOCHS)
model.fit(X, y)# 调用函数

model.total_loss()

运行的结果是:

训练前的初始权重: n[-7.00846923e-05 -3.71909786e-05 -6.15635785e-05]
X 偏差: n[[ 0.  0. -1.]
 [ 0.  1. -1.]
 [ 1.  0. -1.]
 [ 1.  1. -1.]]
--------------------
for epoch: 0
--------------------
前向传播后的预测值: n[1 1 0 0]
错误: n0   -1
1   -1
2    0
3    1
Name: y, dtype: int64
epoc后更新权重:n0/10 : n[ 2.99929915e-01 -3.71909786e-05  2.99938436e-01]
##################################################
--------------------
for epoch: 1
--------------------
前向传播后的预测值: n[0 0 0 0]
错误: n0    0
1    0
2    0
3    1
Name: y, dtype: int64
epoc后更新权重:n1/10 : n[ 5.99929915e-01  2.99962809e-01 -6.15635785e-05]
##################################################
--------------------
for epoch: 2
--------------------
前向传播后的预测值: n[1 1 1 1]
错误: n0   -1
1   -1
2   -1
3    0
Name: y, dtype: int64
epoc后更新权重:n2/10 : n[ 2.99929915e-01 -3.71909786e-05  8.99938436e-01]
##################################################
--------------------
for epoch: 3
--------------------
前向传播后的预测值: n[0 0 0 0]
错误: n0    0
1    0
2    0
3    1
Name: y, dtype: int64
epoc后更新权重:n3/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 4
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n4/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 5
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n5/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 6
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n6/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 7
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n7/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 8
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n8/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
--------------------
for epoch: 9
--------------------
前向传播后的预测值: n[0 0 0 1]
错误: n0    0
1    0
2    0
3    0
Name: y, dtype: int64
epoc后更新权重:n9/10 : n[0.59992992 0.29996281 0.59993844]
##################################################
总体损耗: 0

2、二隐层神经网络

# importing the library
import numpy as np

# 创建输入数组
X=np.array([[1,0,1,0],[1,0,1,1],[0,1,0,1]])
print ('\n 输入:')
print(X)

# 创建输出数组
y=np.array([[1],[1],[0]])
print ('\n 实际输出:')
print(y)

# 定义 Sigmoid 函数
def sigmoid (x):
    return 1/(1 + np.exp(-x))

# Sigmoid 函数的导数
def derivatives_sigmoid(x):
    return x * (1 - x)

# 初始化变量
epoch=5000 # 训练迭代次数
lr=0.1 # 学习率
inputlayer_neurons = X.shape[1] # 数据集中的特征数量
hiddenlayer_neurons = 3 # 隐藏层神经元数量
output_neurons = 1 # 输出层神经元数量

# 初始化权重和偏差
wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))
bh=np.random.uniform(size=(1,hiddenlayer_neurons))
wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))
bout=np.random.uniform(size=(1,output_neurons))

# 训练模型
for i in range(epoch):

    # 前向传播
    hidden_layer_input1=np.dot(X,wh)
    hidden_layer_input=hidden_layer_input1 + bh
    hiddenlayer_activations = sigmoid(hidden_layer_input)
    output_layer_input1=np.dot(hiddenlayer_activations,wout)
    output_layer_input= output_layer_input1+ bout
    output = sigmoid(output_layer_input)

    # 反向传播
    E = y-output
    slope_output_layer = derivatives_sigmoid(output)
    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
    d_output = E * slope_output_layer
    Error_at_hidden_layer = d_output.dot(wout.T)
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
    wout += hiddenlayer_activations.T.dot(d_output) *lr
    bout += np.sum(d_output, axis=0,keepdims=True) *lr
    wh += X.T.dot(d_hiddenlayer) *lr
    bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr

print ('\n 模型的输出:')
print (output)

运行的结果是:

 输入:
[[1 0 1 0]
 [1 0 1 1]
 [0 1 0 1]]

 实际输出:
[[1]
 [1]
 [0]]

 模型的输出:
[[0.98491117]
 [0.97408061]
 [0.03540449]]

四、选择公开数据集,测试感知机模型与二隐层神经网络性能

首先,可以使用scikit-learn库中的load_*函数来加载公开数据集,例如load_iris()来加载鸢尾花数据集。

然后,可以使用Perceptron或MLPClassifier类来实例化感知机模型或2隐层神经网络模型,并使用fit()函数来训练模型。

最后,可以使用score()函数来评估模型的性能,或使用cross_val_score()函数来使用交叉验证来评估模型性能。

from sklearn.datasets import load_iris
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import Perceptron
from sklearn.model_selection import cross_val_score

iris = load_iris()
X, y = iris.data, iris.target

#使用感知机模型
perceptron = Perceptron()
scores = cross_val_score(perceptron, X, y)
print("感知机模型: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

#使用2隐层神经网络模型
mlp = MLPClassifier(hidden_layer_sizes=(2,))
scores = cross_val_score(mlp, X, y)
print("2隐层神经网络: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

运行的结果是:

感知机模型: 0.73 (+/- 0.13)
2隐层神经网络: 0.35 (+/- 0.27)

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

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

相关文章

如何高效学习?一年学完麻省理工4年计算机课程

斯科特.杨用用10天拿下线性代数,用1年时间学完麻省理工大学4年的计算机课程,他是如何做到的?他在这本书《如何高效学习》中做了具体阐述。 斯科特.杨很早就发现,在美国有一半的学生在死记硬背,这些学生并不知道使用整体…

动手学区块链学习笔记(二):区块链以及工作量证明算法

引言 紧接上文,在介绍完区块链中的加密解密以及公钥私钥等算法后,本篇开始正式进入区块链概念与一个简单区块链系统的实现过程介绍。 区块链技术介绍 什么是区块链? 区块链,就是一个又一个区块组成的链条。每一个区块中保存了一…

制造企业数据/经营分析框架

背景 随着大数据技术发展以及数字化转型概念的普及,传统企业特别是制造业,也开始投入人力、资金,建立自己的数据分析团队,期望通过数据分析赋能企业的发展/转型。尽管,国内华为、美的、海尔、三一、徐工等制造业龙头企…

挡不住,逃不过,还是阳了

自从放开后,身边的🐏陆陆续续多了起来。现在都不敢在食堂吃饭了,每次都是打包到工位吃,上班时也是都戴着口罩。每天回家后都是一顿扫射,用医用酒精做全身消毒。但是,还是没挡住,该来的还是来了。…

Leetcode:450. 删除二叉搜索树中的节点(C++)

目录 问题描述: 实现代码与解析: 递归: 原理思路: 含有内存释放版: 问题描述: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜…

Day860.高性能数据库连接池HiKariCP -Java 并发编程实战

高性能数据库连接池HiKariCP Hi,我是阿昌,今天学习记录的是关于高性能数据库连接池HiKariCP的内容。 实际工作中,总会难免和数据库打交道; 只要和数据库打交道,就免不了使用数据库连接池。 业界知名的数据库连接池…

2023/1/15 JS-作用域与作用域链

1 作用域 理解 - 就是一块"地盘", 一个代码段所在的区域,它是静态的(相对于上下文对象), 在编写代码时就确定了 分类: 全局作用域函数作用域 没有块作用域(ES6有了) -->(java语言也有) if (true) {var a 3}console.log(a); // 3作用&am…

用互联网思维做产品,做超出用户预期的产品

做出超出用户预期的产品,做出让用户惊喜和兴奋的产品。超越用户期望极致体验极致服务极致产品(极致产品功能情感温度)关心、关注、尊重用户理解用户理解人性用户参与。只有深刻了解,深刻理解用户,深刻理解人性,才能做出好的产品。…

Maven安装教程讲解

目录一、下载安装JDK二、下载 Maven三、配置 Maven 环境变量四、配置 Maven 仓库地址五、配置 Maven 镜像六、配置 Maven JDK七、IDE配置 Maven八、IDE新建 Maven 项目九、IDE执行 Maven 命令一、下载安装JDK 教程:https://blog.csdn.net/weixin_43888891/article/…

【阶段四】Python深度学习09篇:深度学习项目实战:循环神经网络处理时序数据项目实战:CNN和RNN组合模型

本篇的思维导图: 项目背景 时间序列数据集中的所有数据都伴随着一个时戳,比如股票、天气数据。这个数据集,是科学家们多年间用开普勒天文望远镜观察并记录下来的银河系中的一些恒星的亮度。广袤的宇宙,浩瀚的星空在过去很长一段时间里,人类是没有办法证明系外行星…

关于一次python服务性能的问题分析定位

今天项目遇到一个比较棘手的问题,我们做的接口平台,提供了一个给用户自己编辑关键字的逻辑,发现对应服务的cpu基本都满了,并且通过扩容的方式也没有好转,也同样被打满。 找了测试的同学了解了下,发现他们使…

Enterprise JavaBean 简介

Enterprise JavaBean 简介 在顶层我们使用的框架是面向服务的,而在其之下的开发方法面向组件,最基层的便是面向对象面向过程的JAVA编程。 面向过程和面向对象是两种具体程序设计时的编程范式,他们没有本质区别,只是使用不同的方…

【Linux】Linux命令行git和Linux调试器-gdb的使用

文章目录一、Linux命令行git1. git是什么2. Gitee上创建仓库,克隆仓库到本地3. git三板斧二、Linux调试器-gdb的使用1. debug和release的区别2. 常用命令一、Linux命令行git 1. git是什么 git是一个开源的分布式版本控制系统,可以有效、高速地处理从很…

分享52个Java源码,总有一款适合您

Java源码 分享52个Java源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。 源码下载链接:https://pan.baidu.com/s/1YpNL5QWwQ18Y-KRmFHFs5g?pwdqc8w …

吴恩达机器学习课程笔记:监督学习、无监督学习

1.吴恩达机器学习课程笔记:监督学习、无监督学习 吴恩达机器学习系列课程:监督学习 吴恩达机器学习系列课程:无监督学习 仅作为个人学习笔记,若各位大佬发现错误请指正 机器学习的学习算法:监督学习、无监督学习、半…

1591_AURIX_TC275_PMU_Flash的保护

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 可以支持保护功能的Flash是前面文档中呼出来的几块,其中DFlash由于多模块公用,还有具体的拆分。PFlash可以进行两方面的保护,一个是错误的读取方式保护&…

python列表(list)底层实现

list Python内存管理中的基石 Python中所有类型创建对象时,底层都是与PyObject和PyVarObject结构体实现,一般情况下由单个元素组成对象内部会使用PyObject结构体(float)、由多个元素组成的对象内部会使用PyVarObject结构体 2个…

应用层——电子邮件(SMTP、POP3、IMAP)

目录 1. 电子邮件系统及组成结构 1.1 电子邮件 1.2 电子邮件系统的组件 2. SMTP(邮件发送协议) 2.1 SMTP的特征 2.2 SMTP的基本操作 2.3 SMTP协议的基本流程 2.4 SMTP交互与应答 2.5 SMTP与HTTP的对比 3. 邮件报文格式与MIME 3.1 电子邮件格式 3.2 多用途网际…

STM32时钟系统原理和作用

时钟对于单片机来讲类似于心脏对于人体,单片机通过时钟信号控制单片机工作。 1.时钟系统工作流程 时钟源输入----被分频或倍频----输出至系统/外设/外部接口 2.时钟分类 RC时钟精度低,体积小, OSC时钟精度高,体积大。 3.部分…

5.多层感知机

5.多层感知机 目录 感知机 基本内容训练感知机感知机存在的问题总结 多层感知机 隐藏层 单隐藏层-单分类 激活函数 ReLU函数sigmoid函数tanh函数总结 多类分类 多层感知机的从零开始实现 初始化模型参数激活函数模型损失函数训练 多层感知机的简洁实现 模型模型选择、欠拟合和…