用python代码自己搭建BP神经网络,用训练集数据(BPdata_tr.txt)实现y=x1的平方+x2的平方
时间: 2024-10-06 14:03:58 浏览: 35
在Python中搭建一个基本的反向传播(Back Propagation,简称BP)神经网络来解决线性回归问题,例如y = x1^2 + x2^2,我们可以使用`numpy`库来进行矩阵操作,并自定义激活函数。以下是一个简单的例子:
```python
import numpy as np
# 定义输入、输出数据(假设数据在文件BPdata_tr.txt中)
def load_data(filename):
with open(filename, 'r') as file:
data = []
for line in file.readlines():
x, y = [float(i) for i in line.strip().split()]
data.append((x, y))
return np.array(data)
# 加载训练数据
data = load_data('BPdata_tr.txt')
X = data[:, :-1] # 特征部分
y = data[:, -1] # 目标值
# 设定神经网络结构:1层隐藏节点,输入特征数,输出目标数
input_nodes, hidden_nodes, output_nodes = X.shape[1], 5, 1 # 假设隐含层有5个节点
learning_rate = 0.1
epochs = 10000
# 初始化权重
weights_input_hidden = np.random.uniform(-1, 1, (input_nodes, hidden_nodes))
weights_hidden_output = np.random.uniform(-1, 1, (hidden_nodes, output_nodes))
for epoch in range(epochs):
# 前向传播
hidden_layer_input = np.dot(X, weights_input_hidden)
hidden_layer_output = sigmoid(hidden_layer_input) # 使用sigmoid激活函数
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output)
predicted_output = sigmoid(output_layer_input) # 对输出也使用sigmoid,虽然对于线性问题通常不用激活函数
# 计算误差并反向传播
error = predicted_output - y
d_output_error = error * sigmoid_derivative(predicted_output)
delta_hidden = np.dot(d_output_error, weights_hidden_output.T) * sigmoid_derivative(hidden_layer_output)
d_weights_hidden_output = np.dot(hidden_layer_output.T, d_output_error)
d_weights_input_hidden = np.dot(X.T, delta_hidden)
# 更新权重
weights_hidden_output -= learning_rate * d_weights_hidden_output
weights_input_hidden -= learning_rate * d_weights_input_hidden
def sigmoid(x):
return 1 / (1 + np.exp(- x)
# 模型训练完成后,你可以用测试集验证预测结果
# 假设存在文件BPdata_te.txt,类似处理即可
```
这个例子是一个基础的神经网络实现,实际应用中可能会需要更复杂的优化策略(如梯度下降的变种)以及更好的初始化方法。注意这里的sigmoid函数用于非线性转换,如果目标函数本身就是线性的,则可以省略激活函数。
阅读全文