写一个BP神经网络python代码,要求输入层含 2 个神经元,输出层含 1 个神经 元,隐含层含 3 个神经元; 2) 最大迭代步数为 1000 步; 3) 学习速率设置为 0.005; 4) 误差容许值为 0.001; 5) 动量常数设置为 0.5。并绘制预测结果图
时间: 2024-05-05 19:17:55 浏览: 165
以下是符合您要求的BP神经网络Python代码:
```
import numpy as np
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义BP神经网络类
class BPNN():
def __init__(self, input_nodes, hidden_nodes, output_nodes):
self.input_nodes = input_nodes
self.hidden_nodes = hidden_nodes
self.output_nodes = output_nodes
# 初始化权重和偏置
self.w_ih = np.random.normal(0.0, pow(self.hidden_nodes, -0.5), (self.hidden_nodes, self.input_nodes))
self.b_h = np.zeros((self.hidden_nodes, 1))
self.w_ho = np.random.normal(0.0, pow(self.output_nodes, -0.5), (self.output_nodes, self.hidden_nodes))
self.b_o = np.zeros((self.output_nodes, 1))
# 初始化动量常数
self.momentum = 0.5
# 训练网络
def train(self, inputs, targets, max_iter=1000, learning_rate=0.005, error_tolerance=0.001):
for i in range(max_iter):
# 前向传播
hidden_inputs = np.dot(self.w_ih, inputs) + self.b_h
hidden_outputs = sigmoid(hidden_inputs)
final_inputs = np.dot(self.w_ho, hidden_outputs) + self.b_o
final_outputs = sigmoid(final_inputs)
# 计算误差
output_errors = targets - final_outputs
hidden_errors = np.dot(self.w_ho.T, output_errors)
# 更新权重和偏置
self.w_ho += learning_rate * np.dot(output_errors * final_outputs * (1 - final_outputs), hidden_outputs.T)
self.b_o += learning_rate * output_errors * final_outputs * (1 - final_outputs)
self.w_ih += learning_rate * np.dot(hidden_errors * hidden_outputs * (1 - hidden_outputs), inputs.T)
self.b_h += learning_rate * hidden_errors * hidden_outputs * (1 - hidden_outputs)
# 使用动量更新权重和偏置
self.w_ho += self.momentum * (self.w_ho - self.w_ho_prev)
self.b_o += self.momentum * (self.b_o - self.b_o_prev)
self.w_ih += self.momentum * (self.w_ih - self.w_ih_prev)
self.b_h += self.momentum * (self.b_h - self.b_h_prev)
# 记录前一次的权重和偏置
self.w_ho_prev = self.w_ho
self.b_o_prev = self.b_o
self.w_ih_prev = self.w_ih
self.b_h_prev = self.b_h
# 计算误差
error = np.mean(np.abs(output_errors))
if error < error_tolerance:
break
# 预测
def predict(self, inputs):
hidden_inputs = np.dot(self.w_ih, inputs) + self.b_h
hidden_outputs = sigmoid(hidden_inputs)
final_inputs = np.dot(self.w_ho, hidden_outputs) + self.b_o
final_outputs = sigmoid(final_inputs)
return final_outputs
# 测试代码
import matplotlib.pyplot as plt
# 生成数据
x = np.linspace(-5, 5, 100)
y = np.sin(x)
# 创建神经网络
nn = BPNN(input_nodes=2, hidden_nodes=3, output_nodes=1)
# 训练神经网络
inputs = np.array([x, y])
targets = np.array([y])
nn.train(inputs, targets)
# 预测结果
predictions = nn.predict(inputs)
# 绘制预测结果图
plt.plot(x, y, label='Ground Truth')
plt.plot(x, predictions[0], label='Predictions')
plt.legend()
plt.show()
```
请注意,这个代码只是一个简单的示例,实际应用中可能需要进行更多的调试和优化。
阅读全文