双层神经网络实现非线性回归——机器学习

news2025/8/13 18:14:15

目录

一、算法思想

二、算法原理

三、算法分析

四、源程序代码

五、运行结果及分析


一、算法思想


        在两层神经网络之间,必须有激活函数连接,从而加入非线性因素,提高神经网络的能力。所以,我们先从激活函数学起,一类是挤压型的激活函数,常用于简单网络的学习;另一类是半线性的激活函数,常用于深度网络的学习。

        万能近似定理,是深度学习最根本的理论依据。

        万能近似定理声明了在给定网络具有足够多的隐藏单元的条件下,配备一个线性输出层和一个带有任何挤压性质的激活函数的隐藏层的前馈神经网络,能够以任何想要的误差量近似任何从一个有限维度的空间映射到到另一个有限维度空间的可测的函数。

二、算法原理


        激活函数决定是否传递信号。在这种情况下,只需要带有一个参数(阈值)的简单阶梯函数。

 

 

        一般而言,我们构造的模型都是线性的,但是在实际应用过程中,遇到的很多问题其实是非线性的,这个时候,就需要在模型中应用激活函数,从而提高模型的性能。

激活函数优点:可以将连续值映射到01之间,将问题转化为概率问题,值大于0.5时是正例。
激活函数缺点:可能导致梯度消失和梯度爆炸问题;因为其中含有幂运算,所以计算机处理时会很耗时。

三、算法分析


 首先明确两点:

(1)前向传播求损失,反向传播回传误差。

(2)每个神经元都可以根据误差修正权重。

神经网络前向算法:

前向算法的作用是计算输入层结点对隐藏层结点的影响,

也就是说,神经网络前向算法网络正向的走一遍:输入层->隐藏层->输出层

神经网络反向推导:

(1)计算总误差

(2)隐藏层的权重更新

(3)更新权重

四、源程序代码


import numpy as np
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
def deriv_sigmoid(x):
    fx = sigmoid(x)
    return fx * (1 - fx)
def mse_loss(y_true, y_pred):
    return ((y_true - y_pred) ** 2).mean()
class OurNeuralNetwork:
    def __init__(self):
        self.w1 = np.random.normal()
        self.w2 = np.random.normal()
        self.w3 = np.random.normal()
        self.w4 = np.random.normal()
        self.w5 = np.random.normal()
        self.w6 = np.random.normal()
        self.b1 = np.random.normal()
        self.b2 = np.random.normal()
        self.b3 = np.random.normal()
    def feedforward(self, x):
        h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
        h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
        o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
        return o1
    def train(self, data, all_y_trues):
        learn_rate = 0.1
        epochs = 1000  # 遍历整个数据集的次数
        for epoch in range(epochs):
            for x, y_true in zip(data, all_y_trues):
                # --- 做一个前馈(稍后我们将需要这些值)
                sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
                h1 = sigmoid(sum_h1)
                sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
                h2 = sigmoid(sum_h2)
                sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
                o1 = sigmoid(sum_o1)
                y_pred = o1
                d_L_d_ypred = -2 * (y_true - y_pred)
                d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)
                d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)
                d_ypred_d_b3 = deriv_sigmoid(sum_o1)
                d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
                d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
                d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
                d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
                d_h1_d_b1 = deriv_sigmoid(sum_h1)
 
                # Neuron h2
                d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
                d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
                d_h2_d_b2 = deriv_sigmoid(sum_h2)
                self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
                self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
                self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
                self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
                self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
                self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2
                self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
                self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
                self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
            if epoch % 100 == 0:
                y_preds = np.apply_along_axis(self.feedforward, 1, data)
                loss = mse_loss(all_y_trues, y_preds)
                print("训练 %d 次模型错误率: %.3f" % (epoch, loss))
data = np.array([
    [-2, -1],  # Alice
    [25, 6],  # Bob
    [17, 4],  # Charlie
    [-15, -6],  # Diana
])
all_y_trues = np.array([
    1,  # Alice
    0,  # Bob
    0,  # Charlie
    1,  # Diana
])
network = OurNeuralNetwork()
network.train(data, all_y_trues)



import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-10,10)
y_sigmoid=1/(1+np.exp(-x))
plt.plot(x,y_sigmoid,'r-')
plt.title('sigmoid')
plt.show()

五、运行结果及分析


 

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

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

相关文章

线代——求逆矩阵的快捷方法

通常,求逆矩阵有两种方法: 方法一: 方法二: 但是,对于特殊矩阵,如: 1、二阶矩阵 A[abcd]A \begin{bmatrix} a & b\\ c & d \end{bmatrix}A[ac​bd​],其逆矩阵 A−11ad−bc[d−b−ca…

FienReport在线报表工具-大数据集导出示例

前言 在企业管理中,报表可以以图表等简洁的方式向用户显示数据,从而提高工作效率。许多公司紧跟信息技术的潮流,已经应用了报表软件工具。“我们企业想用一个报表工具,你有推荐吗?”这是这两年被问到最多的问题&#…

MySQL 进阶 怎么去了解MySQL的架构原理

前言 在了解 MySQL 原理之前,对我而言 MySQL 就是一个黑盒子,我写的SQL 语句通过服务发送给 MySQL 数据库,然后数据库就执行 SQL 语句,返回一些查询结果或做一些操作。然后就没然后了。。。再深入一点,就是知道某些 S…

机器学习-聚类算法

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录聚类算法1. K-Means算法1.1. 理论基础1.2. 具体代码1.2.1. 数据集1.2.2. 自定义k-means算法类1.2.3. 测试模块1.3. 效果展示1.3.1.…

Flink 多流转换

多流转换分流使用侧输出流基本合流操作联合(Union)连接(Connect)基于时间的合流——双流联结(Join)窗口联结(Window Join)间隔联结(Interval Join)窗口同组联…

C#界面里Form.IsMdiContainer 属性的使用

C#界面里Form.IsMdiContainer 属性的使用 由于屏幕的局限,以及软件需求的复杂,并且还需要方便使用, 面对这样的任务,就需要好好地考虑使用多窗口的界面设计。 因为每一个窗口可以实现不同的功能,这样方便把相关的功能放在一起,不同的功能分为不同的窗口。 这样既可解决屏…

PC_DRAM

动态 RAM(DRAM)的刷新 刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程 根据这个特点,可以估计刷新电路执行趟耗费的时间大致和访存时间相当 刷新放大器及读放大器均起此作用 由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问…

OceanBase 4.0 all-in-one 版本如何离线升级 obd

今天遇到了一个问题,现象是这样的。 问题出现的原因: 在测试 ob 4.0 allinone 版本时,我用了自动部署的方式(autodeploy),发现部署完的集群无法启动,错误原因可以参考这里:https:/…

three.js之缓冲类型几何体顶点

文章目录简介构成代码顶点构成图形核心代码顶点的位置与颜色BufferAttribute颜色差值法向量不设置法向量顶点索引不复用顶点复用顶点专栏目录请点击 简介 顶点一般使我们在创建模型的时候使用的,他一般对应buffer类型的几何体,使用BufferGeometry创建 点…

有效备考浙大MEM的五个好习惯建议

作为去年上岸浙大mem项目的学长,很多身边计划备考的朋友都在咨询如何才能一年上岸,我在去年拿到了203分的成绩,在不影响工作和生活的前提下,自己认为有效备考浙大mem项目要基本做到五大好习惯,特别针对我们在职人群&am…

软件测试面试题及答案 这个可以免费白嫖的题库不要错过了

对于很多新手软件测试人来说,除了掌握扎实的专业技能之外,你还需要一份个互联网软件测试工程师面试题库才能在万千面试者中杀出重围,成功拿下offer。 一般软件测试的面试分为三轮:笔试,HR面试,技术面试。前…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社区疫情防控管理系统nt4k1

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了,确实,从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做,创…

HTML学生个人网站作业设计:宠物网站设计——宠物网站带会员登陆表单验证功能7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 |宠物网页设计 | 保护动物网页 | 鲸鱼海豚主题 | 保护大象 | 等网站的设计与制作 | HTML宠物网页设计 | HTML期末大学生网页设计作业,Web大学…

怎么裁剪视频时长?建议收藏这些方法

我们经常会在业余的时间,观看一些视频来放松自己。小伙伴们平时有没有喜欢看的视频呢?有时视频中会出现一些比较精彩的片段,如果我们想要将这些精彩片段分享给好友,还需要跟他们说跳转到视频的哪个位置,在操作上有些麻…

量化交易进行回测时有哪些有意义的统计指标?

做量化少不了要做回测,因为回测做好了才能进行梯度研究分析,但是回测报中,需要包含哪些指标呢?下面分享一下,小编觉得还比较有意义的统计指标,以及参照分析的原则与意义。 策略收益率:这部份没得…

2022Q3母婴行业三大热门赛道总结

本篇我们将继续来分析22年Q3季度中母婴行业的高增长概念。 在母婴行业中,我们发现了3个高增长品类,分别是:果泥、辅食料理机、婴儿湿巾。 一、营养辅食类高增长概念——果泥 在婴幼儿阶段,除了母乳和婴幼儿奶粉之外,后…

[打卡笔记]-RK3399平台开发入门到精通系列视频-Linux 设备树

14天学习训练营导师课程: 内核笔记《RK3399平台开发入门到精通系列视频》 14天学习训练营导师课程:周贺贺《ARMv8/ARMv9架构-快速入门》 前言 学习了一下雪松老师的视频课程,然后做出本文笔记。 如果您也想baipiao,开通学习会员&…

计算机网络复习——第五章传输层

Today, ready to go home,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 《计算机网络》(谢希仁)内容总结 (javaguide.cn) 重点知识: Today, at home,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 进程(process&…

Python字符串及正则表达式

一: 字符串可以用单引号或双引号来创建,也可以用三引号来创建多行字符串。 String_1 加快发展 String_2 "促进生产" String_3 """吾家吾国, 吾家吾国, 吾家吾国, 吾家吾国。""…

JDBC在IDEA中配置mysql过程及编程详解

目录 jdbc编程简介 1.导入jar包 2.建立数据库连接 2.1 创建数据源,描述数据库服务器在哪 2.2 实现一个mysql客户端,通过网络和服务器进行通信 3.使用代码操作数据库 3.1 增删改操作 增加操作 更新操作 删除操作 3.2 查询操作 4.断开连接,释放资源 jdbc编程简介 J…