目录

神经网络简介

BP算法

Delta学习规则的基本原理

BP神经网络的结构 

BP神经网络的算法描述

神经网络训练一般步骤

后向传播算法的主要步骤 

优缺点

BP算法简单举例


神经网络简介

BP算法

Delta学习规则的基本原理

Delta学习规则又称梯度法或最速下降法,其要点是改变单元间的连接权重来减小系统实际输出与期望输出间的误差 

BP神经网络的结构 

BP神经网络是具有三层或三层以上的阶层型神经网络,由输入层、隐含层和输出层构成,相邻层之间的神经元全互连,同一层内的神经元无连接 

数据挖掘(6.1)--神经网络-LMLPHP

BP神经网络的算法描述

BP算法的主要思想是从后向前(反向)逐层传播输出层的误差以间接算出隐层误差。

算法分为两个阶段:

第一阶段(正向传播过程)输入信息从输入层经隐层逐层计算各单元的输出值

第二阶段(反向传播过程)输出误差逐层向前算出隐层各单元的误差,并用此误差修正前层权值

数据挖掘(6.1)--神经网络-LMLPHP

具体来说,BP算法包括以下几个步骤:

  1. 初始化模型参数(如神经元的权重和偏置值)。

  2. 前向传播计算网络的输出结果。

  3. 计算网络输出结果与真实结果之间的误差。

  4. 根据误差反向传播原理,计算每个神经元对于误差的贡献,并根据梯度下降算法更新每个神经元的权重和偏置值。

  5. 重复执行以上步骤,直到达到一定的迭代次数或损失函数收敛。 

神经网络训练一般步骤

向传播算法的主要步骤 

用随机值初始化权重

向前传播输入,对每个隐含层或输出单元,计算其输入和输出,并最终计算出预测结果

向后传播误差。更新权重和阈值(从输出层开始)

优缺点

优点

  • 非线性映射能力
  • 自学习和自适应能力
  • 泛化能力
  • 容错能力

缺点

  • 结构选择不一
  • 局部极小化、收敛速度慢
  • 预测能力和训练能力的矛盾问题
  • 样本依赖性问题

BP算法简单举例

import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

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

# 定义BP算法
def backpropagation(X, y, hidden_nodes, output_nodes, learning_rate, epochs):
    # 初始化权重
    input_nodes = X.shape[1]
    hidden_weights = np.random.normal(scale=1 / input_nodes ** 0.5, size=(input_nodes, hidden_nodes))
    output_weights = np.random.normal(scale=1 / hidden_nodes ** 0.5, size=(hidden_nodes, output_nodes))

    # 训练
    for i in range(epochs):
        # 前向传播
        hidden_inputs = np.dot(X, hidden_weights)
        hidden_outputs = sigmoid(hidden_inputs)
        output_inputs = np.dot(hidden_outputs, output_weights)
        output_outputs = sigmoid(output_inputs)

        # 计算误差
        output_error = y - output_outputs
        output_delta = output_error * output_outputs * (1 - output_outputs)

        hidden_error = np.dot(output_delta, output_weights.T)
        hidden_delta = hidden_error * hidden_outputs * (1 - hidden_outputs)

        # 更新权重
        output_weights += learning_rate * np.dot(hidden_outputs.T, output_delta)
        hidden_weights += learning_rate * np.dot(X.T, hidden_delta)

    return output_outputs

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 将标签转换为one-hot编码
y_onehot = np.zeros((y.size, y.max()+1))
y_onehot[np.arange(y.size), y] = 1

# 训练模型
output = backpropagation(X, y_onehot, hidden_nodes=5, output_nodes=3, learning_rate=0.1, epochs=10000)

# 预测结果
y_pred = np.argmax(output, axis=1)

# 计算准确率
accuracy = np.mean(y_pred == y)
print('Accuracy:', accuracy)

 输出结果:

Accuracy: 0.9933333333333333
06-08 12:04