机器学习(西瓜书)-BP神经网络实现

news2024/11/19 8:07:03

原理在书上

1、首先定义两个激活函数,越阶函数和sigmoid函数

2、用感知机实现线性可分的与,或,非问题,然后用多层感知机实现线性不可分的异或问题。

3、之后搭建了一个三层神经网络,任务是判断一个数字是否>0.5。

所有的参数还有变量依托于周志华的机器学习(西瓜书)p97-p104

import numpy as np
import matplotlib.pyplot as plt

def sgn(x):
    if x>=0:
        return 1
    else:
        return 0

def sigmoid(x):
    return 1/(1+np.e**(-x))
    # return x
x=np.linspace(-10,10,100)
y=[]
for i in x:
    y.append(sigmoid(i))
plt.plot(x,y)
plt.show()
import numpy as np
import matplotlib.pyplot as plt

def sgn(x):
    if x>=0:
        return 1
    else:
        return 0

def sigmoid(x):
    return 1/(1+np.e**(-x))
    # return x
x=np.linspace(-10,10,100)
y=[]
for i in x:
    y.append(sigmoid(i))
plt.plot(x,y)
plt.show()


w1=1
w2=1
d=2
print("\n与运算")
print("x1 x2 y")
for x1 in range(2):
    for x2 in range(2):
        y = sgn(x1 * w1 + x2 * w2 -d)
        print(x1,x2,y)

w1=1
w2=1
d=0.5
print("\n或运算")
print("x1 x2 y")
for x1 in range(2):
    for x2 in range(2):
        y = sgn(x1 * w1 + x2 * w2 -d)
        print(x1,x2,y)

w1=-0.6
w2=0
d=-0.5
print("\n非运算")
print("x1 y")
for x1 in range(2):
    for x2 in range(2):
        y = sgn(x1 * w1 + x2 * w2 -d)
        print(x1,y)



w1_1=1
w1_2=-1
w2_1=-1
w2_2=1
wh_1=1
wh_2=1
d=0.5
print("\n异或运算")
print("x1 x2 y")
for x1 in range(2):
    for x2 in range(2):
        h1 = sgn(x1 * w1_1 + x2 * w2_1 -d)
        h2 = sgn(x1 * w1_2 + x2 * w2_2 - d)
        y=sgn(h1 * wh_1 + h2 * wh_2 - d)
        print(x1,x2,y)
import numpy as np
import matplotlib.pyplot as plt

def sgn(x):
    if x>=0:
        return 1
    else:
        return 0

def sigmoid(x):
    return 1/(1+np.e**(-x))
    # return x



#
#    o       j={0}
#  / | \     whj[3,1]
# o  o  o    h={0,1,2}
#  \ | /     vih[1,3]
#    o       i={0}
x=np.random.random(100)
y=(x>0.5)*1.0
v=np.random.random([1,3])#v_ih
w=np.random.random([3,1])#w_hj
dh=np.random.random(3)#隐层的阈值
dy=np.random.random(1)#输出层阈值

def ah(h,xk):  #隐层h的输入
    sum=0
    for i in range(1):
        sum+=v[i][h]*xk
    return sum

def bh(h,xk): #隐层h的输出
    return sigmoid(ah(h,xk)-dh[h])

def Bj(j,xk): #输出层的输入
    sum=0
    for h in range(3):
        sum+=w[h][j]*bh(h,xk)
    return sum

def yj(j,xk): #输出层的输出
    return sigmoid(Bj(j,xk)-dy[j])

def Ek(xk,k): #损失
    sum=0
    for j in range(1):
        sum+=(yj(j,xk)-y[k])**2
    return (1/2)*sum

def gj(j,xk,k): #梯度计算
    return yj(j,xk)*(1-yj(j,xk))*(y[k]-yj(j,xk))


def eh(h,xk,k): #梯度项
    sum=0
    for j in range(1):
        sum+=w[h][j]*gj(j,xk,k)
    return bh(h,xk)*(1-bh(h,xk))*sum

def Model(x):
    a1=ah(0,x)
    a2=ah(1,x)
    a3=ah(2,x)

    b1=bh(0,x)
    b2=bh(1,x)
    b3=bh(2,x)

    B0=Bj(0,x)

    y_=yj(0,x)
    return y_>=0.5


def Precsion():
    good=0
    for k in range(100):
        # print(y[k]==Model(x[k])*1.0)
        if y[k] == Model(x[k]) * 1.0:
            good+=1
    print("准确率:",good,"%")


def train():
    n=0.1
    j=0#输出节点编号,只有一个节点
    loss=[]#记录损失变化
    c=0
    for b in range(200):#循环迭代次数
        for k in range(100):#对每个样本进行训练
            c+=1
            xk=x[k]
            loss.append(Ek(xk, k))
            d_whj_0=n*gj(j,xk,k)*bh(0,xk)
            d_whj_1=n*gj(j,xk,k)*bh(1,xk)
            d_whj_2=n*gj(j,xk,k)*bh(2,xk)

            d_dyj_0=-1*n*gj(j,xk,k)

            d_vih_0=n*eh(0,xk,k)*xk
            d_vih_1=n*eh(1,xk,k)*xk
            d_vih_2=n*eh(2,xk,k)*xk

            d_dh_0=-1*n*eh(0,xk,k)
            d_dh_1=-1*n*eh(1,xk,k)
            d_dh_2=-1*n*eh(2,xk,k)

            w[0][0] = w[0][0] + d_whj_0
            w[1][0] = w[1][0] + d_whj_1
            w[2][0] = w[2][0] + d_whj_2
            # print("w",w[0][0],w[1][0],w[2][0])
            dy[0] = dy[0] + d_dyj_0
            # print("dy",dy[0])

            v[0][0] = v[0][0] + d_vih_0
            v[0][1] = v[0][1] + d_vih_1
            v[0][2] = v[0][2] + d_vih_2
            # print("v",v[0][0],v[0][1],v[0][2])

            dh[0]=dh[0]+d_dh_0
            dh[1]=dh[1]+d_dh_1
            dh[2]=dh[2]+d_dh_2
            # print("dh",dh[0],dh[1],dh[2])
            # print("loss===========================================", Ek(k))
        Precsion()

train()
print(Model(0.54))
print(Model(0.44))
# plt.plot(range(c),loss)
# plt.show()

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

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

相关文章

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)

思路:一个二分图是由两个集合组成的,同一个集合中的节点间不能连边,所以一个二分图最多有cnt[1]*cnt[2]条边,题目给出一个树的n-1条边,要我们添加最多的边数使他成为二分图,添加的边数就是cnt[1]*cnt[2]-n1…

docker:基于Dockerfile镜像制作完整案例

目录 摘要目录结构介绍起始目录package目录target目录sh目录init.sh脚本start.sh脚本stop.sh脚本restart.sh脚本 config目录 步骤1、编写dockerfilescript.sh脚本 2、构件镜像查看镜像 3、保存镜像到本地服务器4、复制镜像文件到指定目录,并执行init.sh脚本5、查看挂…

Redis自学之路—基础数据结构具体方法解析(五)

目录 简介 数据结果具体方法解析 字符串(String) 操作命令 set设置值 setex setnx get获取值 del删除key mset批量设置值 incr数字运算 append追加指令 strlen字符串长度 getset设置并返回原值 setrange设置指定位置的字符 getrange截取字符串 命令的时间复杂…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征,代表着产品达到了高标准的要求。从技术层面看,认证确保产品与华为鲲鹏架构深度融合,能充分释放鲲鹏芯片的高性能、低功耗优势,为集成平台的高效运行提供强大动力。在安全方面,…

使用 AMD GPU 实现 Segment Anything

Segment Anything with AMD GPUs — ROCm Blogs 作者: Sean Song 发布日期:2024年6月4日 介绍 分割任务——识别图像中哪些像素属于某对象——是计算机视觉中的一个基础任务,应用广泛,从科学图像分析到照片编辑。Segment Anyth…

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream? 我看很多回答都是“为了屏蔽消息队列的差异,使我们在使用消息队列的时候能够用统一的一套API,无需关心具体的消息队列实现”。 这样理解是有些不全面的,Spring Cloud Stream的核心是Stream&#xf…

无人机飞手入门指南

无人机飞手入门指南旨在为初学者提供一份全面的学习路径和实践建议,帮助新手快速掌握无人机飞行技能并了解相关法规知识。以下是一份详细的入门指南: 一、了解无人机基础知识 1. 无人机构造:了解无人机的组成部分,如机身、螺旋桨…

使用Mac下载MySQL修改密码

Mac下载MySQL MySQL官网链接MySQL​​​​​​ 当进入到官网后下滑到community社区,进行下载 然后选择community sever下载 这里就是要下载的界面,如果需要下载之前版本的话可以点击archives, 可能会因为这是外网原因,有时候下…

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野,发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…

three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…

【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例

本次给大家带来一篇SCI论文的全文翻译!该论文考虑了绿化程度、可步行性、安全性、形象性、封闭性和复杂性这六个指标,提出了一种基于多源地理空间大数据的新型定量评价模型,用于从老年人和专家的角度评估街道步行环境的老年友好程度&#xff…

计算机网络安全 —— 对称加密算法 DES (一)

一、对称加密算法概念# ​ 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryptio…

6.C操作符详解,深入探索操作符与字符串处理

C操作符详解,深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾: C语言是什么?编程界的‘常青树’,它的辉煌你不可不知VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

Uni-APP+Vue3+鸿蒙 开发菜鸟流程

参考文档 文档中心 运行和发行 | uni-app官网 AppGallery Connect DCloud开发者中心 环境要求 Vue3jdk 17 Java Downloads | Oracle 中国 【鸿蒙开发工具内置jdk17&#xff0c;本地不使用17会报jdk版本不一致问题】 开发工具 HBuilderDevEco Studio【目前只下载这一个就…

【Android、IOS、Flutter、鸿蒙、ReactNative 】屏幕适配

Android Java 屏幕适配 参考 今日头条适配依赖配置 添加设计屏幕尺寸 设置字体大小 通过切换不同屏幕尺寸查看字体大小 设置文本宽高 通过切换不同屏幕尺寸查看文本宽高 Android Compose 屏幕适配 <

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

Websocket如何分块处理数据量超大的消息体

若我们服务端一次性最大处理的字节数是1M,而客户端发来了2M的数据&#xff0c;此时服务端的数据就要被切割成两次传输解码。Http协议中有分块传输&#xff0c;而在Websocket也可以分块处理超大的消息体。在jsr356标准中使用javax.websocket.MessageHandler.Partial可以分块处理…

论文复现_How Machine Learning Is Solving the Binary Function Similarity Problem

1. 内容概述 前言&#xff1a;此代码库支持 USENIX Security 22 论文 《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff0c;作者包括 Andrea Marcelli 等人&#xff0c;提供了相关代码、数据集和技术细节。 关键内容&#xff1a;技术报告…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …