使用python写一个有关水质信息的BP网络(8个输入,1个输出,5个隐藏节点),并写一个main实现将训练集投入网络训练,训练后将测试集投入得出预测输出
时间: 2023-11-27 09:53:19 浏览: 29
好的,以下是一个简单的BP神经网络的实现(使用numpy库):
```python
import numpy as np
# sigmoid激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# sigmoid的导数
def sigmoid_derivative(x):
return x * (1 - x)
# BP神经网络类
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
# 初始化权重和偏置
self.weights1 = np.random.rand(input_size, hidden_size)
self.bias1 = np.zeros((1, hidden_size))
self.weights2 = np.random.rand(hidden_size, output_size)
self.bias2 = np.zeros((1, output_size))
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.weights1) + self.bias1
self.a1 = sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.weights2) + self.bias2
self.a2 = sigmoid(self.z2)
return self.a2
def backward(self, X, y, output):
# 反向传播
self.error = output - y
self.delta2 = self.error * sigmoid_derivative(output)
self.weights2 -= np.dot(self.a1.T, self.delta2)
self.bias2 -= np.sum(self.delta2, axis=0)
self.delta1 = np.dot(self.delta2, self.weights2.T) * sigmoid_derivative(self.a1)
self.weights1 -= np.dot(X.T, self.delta1)
self.bias1 -= np.sum(self.delta1, axis=0)
def train(self, X, y):
output = self.forward(X)
self.backward(X, y, output)
def predict(self, X):
return self.forward(X)
# 测试数据
X_train = np.array([[1, 2, 3, 4, 5, 6, 7, 8],
[2, 3, 4, 5, 6, 7, 8, 9],
[3, 4, 5, 6, 7, 8, 9, 10],
[4, 5, 6, 7, 8, 9, 10, 11],
[5, 6, 7, 8, 9, 10, 11, 12],
[6, 7, 8, 9, 10, 11, 12, 13],
[7, 8, 9, 10, 11, 12, 13, 14],
[8, 9, 10, 11, 12, 13, 14, 15]])
y_train = np.array([[0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9]])
X_test = np.array([[9, 10, 11, 12, 13, 14, 15, 16],
[10, 11, 12, 13, 14, 15, 16, 17]])
# 初始化神经网络
nn = NeuralNetwork(8, 5, 1)
# 训练神经网络
for i in range(10000):
nn.train(X_train, y_train)
# 测试神经网络
print(nn.predict(X_test))
```
这个实现的神经网络有8个输入、5个隐藏节点和1个输出。在main函数中,首先创建了训练集和测试集的numpy数组,然后初始化了神经网络,并对训练集进行了10000次训练。最后,将测试集输入到神经网络中,得到了预测输出。