简单易学的机器学习算法——神经网络之BP神经网络

简单易学的机器学习算法——神经网络之BP神经网络

一、BP神经网络的概念      BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  (三层BP神经网络模型)   BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

二、BP神经网络的流程      在知道了BP神经网络的特点后,我们需要依据信号的前向传播和误差的反向传播来构建整个网络。

1、网络的初始化      假设输入层的节点个数为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,隐含层的节点个数为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,输出层的节点个数为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

。输入层到隐含层的权重

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,隐含层到输出层的权重为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,输入层到隐含层的偏置为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,隐含层到输出层的偏置为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

。学习速率为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,激励函数为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

。其中激励函数为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

取Sigmoid函数。形式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


2、隐含层的输出      如上面的三层BP网络所示,隐含层的输出

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


3、输出层的输出

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


4、误差的计算      我们取误差公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  其中

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

为期望输出。我们记

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,则

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

可以表示为

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  以上公式中,

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

5、权值的更新      权值的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  这里需要解释一下公式的由来:   这是误差反向传播的过程,我们的目标是使得误差函数达到最小值,即

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

,我们使用梯度下降法:

  • 隐含层到输出层的权重更新
www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

则权重的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  • 输入层到隐含层的权重更新
www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

其中

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


 

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  则权重的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


6、偏置的更新      偏置的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  • 隐含层到输出层的偏置更新
www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

则偏置的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  • 输入层到隐含层的偏置更新
www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络

其中

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


 

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


  则偏置的更新公式为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


7、判断算法迭代是否结束      有很多的方法可以判断算法是否已经收敛,常见的有指定迭代的代数,判断相邻的两次误差之间的差别是否小于指定的值等等。

三、实验的仿真      在本试验中,我们利用BP神经网络处理一个四分类问题,最终的分类结果为:

www.zeeklog.com  - 简单易学的机器学习算法——神经网络之BP神经网络


MATLAB代码  主程序

%% BP的主函数

% 清空
clear all;
clc;

% 导入数据
load data;

%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);

%输入输出数据
input=data(:,2:25);
output1 =data(:,1);

%把输出从1维变成4维
for i=1:2000
    switch output1(i)
        case 1
            output(i,:)=[1 0 0 0];
        case 2
            output(i,:)=[0 1 0 0];
        case 3
            output(i,:)=[0 0 1 0];
        case 4
            output(i,:)=[0 0 0 1];
    end
end

%随机提取1500个样本为训练样本,500个样本为预测样本
trainCharacter=input(n(1:1600),:);
trainOutput=output(n(1:1600),:);
testCharacter=input(n(1601:2000),:);
testOutput=output(n(1601:2000),:);

% 对训练的特征进行归一化
[trainInput,inputps]=mapminmax(trainCharacter');

%% 参数的初始化

% 参数的初始化
inputNum = 24;%输入层的节点数
hiddenNum = 50;%隐含层的节点数
outputNum = 4;%输出层的节点数

% 权重和偏置的初始化
w1 = rands(inputNum,hiddenNum);
b1 = rands(hiddenNum,1);
w2 = rands(hiddenNum,outputNum);
b2 = rands(outputNum,1);

% 学习率
yita = 0.1;

%% 网络的训练
for r = 1:30
    E(r) = 0;% 统计误差
    for m = 1:1600
        % 信息的正向流动
        x = trainInput(:,m);
        % 隐含层的输出
        for j = 1:hiddenNum
            hidden(j,:) = w1(:,j)'*x+b1(j,:);
            hiddenOutput(j,:) = g(hidden(j,:));
        end
        % 输出层的输出
        outputOutput = w2'*hiddenOutput+b2;
        
        % 计算误差
        e = trainOutput(m,:)'-outputOutput;
        E(r) = E(r) + sum(abs(e));
        
        % 修改权重和偏置
        % 隐含层到输出层的权重和偏置调整
        dw2 = hiddenOutput*e';
        db2 = e;
        
        % 输入层到隐含层的权重和偏置调整
        for j = 1:hiddenNum
            partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
            partTwo(j) = w2(j,:)*e;
        end
        
        for i = 1:inputNum
            for j = 1:hiddenNum
                dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
                db1(j,:) = partOne(j)*partTwo(j);
            end
        end
        
        w1 = w1 + yita*dw1;
        w2 = w2 + yita*dw2;
        b1 = b1 + yita*db1;
        b2 = b2 + yita*db2;  
    end
end

%% 语音特征信号分类
testInput=mapminmax('apply',testCharacter',inputps);

for m = 1:400
    for j = 1:hiddenNum
        hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);
        hiddenTestOutput(j,:) = g(hiddenTest(j,:));
    end
    outputOfTest(:,m) = w2'*hiddenTestOutput+b2;
end

%% 结果分析
%根据网络输出找出数据属于哪类
for m=1:400
    output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
end

%BP网络预测误差
error=output_fore-output1(n(1601:2000))';

k=zeros(1,4);  
%找出判断错误的分类属于哪一类
for i=1:400
    if error(i)~=0
        [b,c]=max(testOutput(i,:));
        switch c
            case 1 
                k(1)=k(1)+1;
            case 2 
                k(2)=k(2)+1;
            case 3 
                k(3)=k(3)+1;
            case 4 
                k(4)=k(4)+1;
        end
    end
end

%找出每类的个体和
kk=zeros(1,4);
for i=1:400
    [b,c]=max(testOutput(i,:));
    switch c
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
        case 3
            kk(3)=kk(3)+1;
        case 4
            kk(4)=kk(4)+1;
    end
end

%正确率
rightridio=(kk-k)./kk


激活函数

%% 激活函数
function [ y ] = g( x )
    y = 1./(1+exp(-x));
end



Read more

【MySQL进阶·设计优化】7.4 增加中间表

【MySQL进阶·设计优化】7.4 增加中间表

【MySQL进阶·设计优化】7.4 增加中间表 * * * * 增加中间表 在数据库设计中,中间表(也称为桥接表、关联表或联接表)是一个重要的概念,它通常用于解决多对多关系的问题,或者在复杂的数据结构中提供额外的灵活性和查询效率。在MySQL中,增加中间表通常是为了优化查询性能、简化数据关系或满足特定的业务需求。 一、为什么需要中间表 1. 解决多对多关系:在关系型数据库中,两个实体之间的多对多关系不能直接通过单一的外键约束来实现。这时,就需要一个中间表来作为两个实体之间的桥梁,每个实体与中间表之间都是一对多的关系。 1. 提高查询效率:在某些复杂的查询场景中,通过引入中间表,可以将复杂的查询分解为多个简单的查询,从而提高查询效率。 1. 数据规范化:中间表有助于将数据规范化,避免数据冗余和不一致。 二、如何设计中间表 在设计中间表时,我们需要考虑以下几个方面: 1. 确定关联关系:首先,要明确哪些表之间存在关联关系,以及这些关系的性质(一对一、一对多、多对多)。 2. 定义字段:中间表应包含能够唯一标识关联关系的字段,

By Ne0inhk
不敲代码,5分钟带你认识二叉树

不敲代码,5分钟带你认识二叉树

欢迎关注微信公众号:简说Python 关注后回复:1024,可以领取精选编程学习电子书籍。 这两天和几个朋友组了个互相督促学习群,想着督促一下自己学习,也督促自己的原创输出,其实很多时候都是懒,真不是没有东西可以写了,这不,我在我的免费知识星球简说编程里开了个新的标签日常编程问题,后面我会把自己学习工作中遇到的一些问题和解决方法记录到里面,有些可以扩展的点,我会写到微信公众号里。 我定的目标是: 我简单写了个规则,大家说可以,然后,我们就开始吧,我习惯把该做的事情提前一天做(如果有时间的话)。 今天给大家分享的书籍《Python程序员面试算法宝典》第三章第一小节:什么是二叉树。 如果你是第一次看,也许,你可以看看本系列下面的文章: 今日问题 """ 介绍二叉树的基础知识 目录 1> 什么是二叉树? 2> 二叉树结点的属性 2.1>结点的度 2.2>叶子结点 2.

By Ne0inhk
【MySQL进阶·运维与架构】8.1 主从复制

【MySQL进阶·运维与架构】8.1 主从复制

【MySQL进阶·运维与架构】8.1 主从复制 * * * * * 主从复制 MySQL主从复制是MySQL数据库提供的一种高可用性和可扩展性的解决方案。通过主从复制,我们可以实现数据的实时备份、读写分离读写、负载均衡等目标,从而提高数据库的性能和稳定性。下面,我们将详细解析MySQL主从复制的原理、配置步骤以及常见问题和解决方案。 一、MySQL主从同步原理 MySQL主从复制主要基于二进制日志(Binary Log)实现。其工作原理是,主服务器(Master)上的所有数据更改都会被记录到二进制日志中,而从服务器(Slave)则通过读取这些日志中的事件,并将这些事件应用到自身数据库上,以保持与主服务器的数据同步。 主从复制的具体过程如下: 1. 主服务器将数据的所有更改实时地写入到二进制日志中。 2. 从服务器连接到主服务器,并向主服务器请求从特定的二进制日志文件的某个位置开始发送日志内容。这个位置通常是一个文件名和日志位置(log position),也被称为“二进制日志坐标”或“GTID(全局事务标识符)”。 3. 主服务器

By Ne0inhk
这是我见过入门Python最友好的办法

这是我见过入门Python最友好的办法

当下的Python到底有多火?   今年 PYPL9 月份的榜单, Python 以 28.73% 的份额封顶榜首。   相比去年同期的数据, 排行榜前十中只有 Python 份额大幅上涨了 4.5%。 Java 下降 2.1%,PHP 下降 1.0%,其它语言份额没有多少变化。 PYPL 9月榜单 现在,Python无疑是全球范围内最流行的编程语言。 在过去的 5 年中,Python的份额增长最多,达到了 18.2%。   除此之外,Python的火爆还体现在我们生活中的方方面面: 山东省将Python内容加入小学信息技术教材; 浙江省宣布将Python加入信息技术高考; 教育部将Python加入大学计算机二级考试; 摩根大通CEO宣布所有入职资产管理分析师必须强制学习Python ...   从小学到中学,从大学到职场,传统教育改革与职场新技术革命掀起了“全民学Python”的浪潮。     Python自身的优势,再加上它丰富的类库,十分适合用来解决人工智能中的问题 ,当之无愧是AI时代的第一语言。

By Ne0inhk