python实现标准BP算法

BP 算法(Back Propagation Algorithm)是一种经典的人工神经网络训练算法,用于解决分类和回归问题。BP 算法基于梯度下降的思想,通过反向传播误差信号来调整神经网络的权重和偏置,从而实现模型的训练。

BP 算法通常由前向传播和反向传播两个过程组成。在前向传播过程中,神经网络将输入样本通过多层神经元进行计算,得到输出值。在反向传播过程中,首先计算输出值与实际标签之间的误差,然后将误差信号传递回每个神经元,从而计算出每个神经元的误差贡献。接着,BP 算法通过梯度下降的方法更新神经网络的权重和偏置,以使误差最小化。最终,BP 算法通过迭代训练得到最优的神经网络模型,可以用于进行分类和回归任务。

BP 算法的优点是能够处理复杂的非线性关系,适用于大规模的数据集和多类别分类问题。缺点是容易陷入局部最优解,训练时间较长,需要大量的训练数据。同时,在实际应用中,需要针对不同的问题选择合适的神经网络结构、学习率、激活函数等超参数,以及进行模型的正则化和参数初始化等操作,来提高模型的泛化能力和鲁棒性。

下面是使用 Python 实现标准 BP 算法的示例代码:

import numpy as np

class BPNeuralNetwork:
    def __init__(self, num_input, num_hidden, num_output, learning_rate):
        self.num_input = num_input
        self.num_hidden = num_hidden
        self.num_output = num_output
        self.learning_rate = learning_rate
        
        self.input_layer = np.zeros((num_input, 1))
        self.hidden_layer = np.zeros((num_hidden, 1))
        self.output_layer = np.zeros((num_output, 1))
        
        self.hidden_weights = np.random.randn(num_hidden, num_input)
        self.output_weights = np.random.randn(num_output, num_hidden)
        
        self.hidden_bias = np.zeros((num_hidden, 1))
        self.output_bias = np.zeros((num_output, 1))
        
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))
    
    def sigmoid_derivative(self, x):
        return x * (1 - x)
    
    def forward_propagation(self, input_data):
        self.input_layer = input_data.reshape(self.num_input, 1)
        
        # 计算隐藏层输出
        self.hidden_layer = self.sigmoid(self.hidden_weights @ self.input_layer + self.hidden_bias)
        
        # 计算输出层输出
        self.output_layer = self.sigmoid(self.output_weights @ self.hidden_layer + self.output_bias)
        
        return self.output_layer
    
    def backward_propagation(self, input_data, output_data):
        # 计算输出误差和梯度
        output_error = output_data.reshape(self.num_output, 1) - self.output_layer
        output_gradient = output_error * self.sigmoid_derivative(self.output_layer)
        
        # 计算隐藏层误差和梯度
        hidden_error = self.output_weights.T @ output_gradient
        hidden_gradient = hidden_error * self.sigmoid_derivative(self.hidden_layer)
        
        # 更新输出层权重和偏置
        self.output_weights += self.learning_rate * output_gradient @ self.hidden_layer.T
        self.output_bias += self.learning_rate * output_gradient
        
        # 更新隐藏层权重和偏置
        self.hidden_weights += self.learning_rate * hidden_gradient @ self.input_layer.T
        self.hidden_bias += self.learning_rate * hidden_gradient
        
    def train(self, input_data, output_data, num_epochs):
        for epoch in range(num_epochs):
            for i in range(input_data.shape[0]):
                x = input_data[i]
                y = output_data[i]
                self.forward_propagation(x)
                self.backward_propagation(x, y)
    
    def predict(self, input_data):
        output = np.zeros((input_data.shape[0], self.num_output))
        for i in range(input_data.shape[0]):
            output[i] = self.forward_propagation(input_data[i])
        return output

上述代码定义了一个名为 BPNeuralNetwork 的类,该类实现了标准 BP 算法的前向传播、反向传播和训练过程。在类的构造函数中,我们需要指定神经网络的输入层、隐藏层和输出层的节点数,以及学习率。在 forward_propagation 方法中,我们首先将输入数据 reshape 成列向量,并计算隐藏层和输出层的输出。在 backward_propagation 方法中,我们首先计算输出层和隐藏层的误差和梯

度,并使用梯度下降的方法更新权重和偏置。在 train 方法中,我们对整个数据集进行多次迭代训练,对于每个输入样本,先进行前向传播计算输出值,然后进行反向传播更新权重和偏置。最后,在 predict 方法中,我们可以使用训练好的神经网络模型对新数据进行预测。

下面是一个使用 BPNeuralNetwork 类的示例,该示例使用鸢尾花数据集进行分类:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder

# 导入数据集
iris = load_iris()
X, y = iris.data, iris.target

# 将标签进行 OneHot 编码
enc = OneHotEncoder()
y_onehot = enc.fit_transform(y.reshape(-1, 1)).toarray()

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)

# 构建神经网络模型并训练
nn = BPNeuralNetwork(num_input=X_train.shape[1], num_hidden=5, num_output=y_train.shape[1], learning_rate=0.1)
nn.train(X_train, y_train, num_epochs=500)

# 在测试集上进行预测并计算准确率
y_pred = nn.predict(X_test)
y_pred_label = np.argmax(y_pred, axis=1)
y_test_label = np.argmax(y_test, axis=1)
accuracy = np.mean(y_pred_label == y_test_label)
print("Accuracy: {:.2f}%".format(accuracy * 100))

在上述示例中,我们首先将原始的标签数据进行 OneHot 编码,然后使用 train_test_split 函数将数据集划分为训练集和测试集。接着,我们使用 BPNeuralNetwork 类构建神经网络模型,并使用 train 方法对训练集进行训练。最后,我们使用 predict 方法对测试集进行预测,并计算预测准确率。

需要注意的是,在实际应用中,我们需要对神经网络的超参数进行调参,如隐藏层节点数、学习率等,以及进行模型的正则化和参数初始化等操作,来提高模型的泛化能力和鲁棒性。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦_天明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值