请帮我写一个python代码实现BP神经网络多维时间序列数据输入预测多维数据输出
时间: 2023-12-28 20:05:33 浏览: 109
好的,以下是一个简单的BP神经网络多维时间序列数据输入预测多维数据输出的Python代码实现:
```python
import numpy as np
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# BP神经网络类
class BPNeuralNetwork:
def __init__(self, input_dim, hidden_dim, output_dim):
# 初始化输入层、隐层、输出层的维度
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
# 初始化权重矩阵
self.weights_input_hidden = np.random.randn(self.input_dim, self.hidden_dim)
self.weights_hidden_output = np.random.randn(self.hidden_dim, self.output_dim)
# 初始化偏置向量
self.bias_hidden = np.zeros((1, self.hidden_dim))
self.bias_output = np.zeros((1, self.output_dim))
# 前向传播
def forward(self, x):
# 计算隐层的输出
self.hidden = sigmoid(np.dot(x, self.weights_input_hidden) + self.bias_hidden)
# 计算输出层的输出
self.output = sigmoid(np.dot(self.hidden, self.weights_hidden_output) + self.bias_output)
return self.output
# 反向传播
def backward(self, x, y, lr):
# 计算输出层的误差
delta_output = (y - self.output) * self.output * (1 - self.output)
# 计算隐层的误差
delta_hidden = np.dot(delta_output, self.weights_hidden_output.T) * self.hidden * (1 - self.hidden)
# 更新权重矩阵和偏置向量
self.weights_hidden_output += lr * np.dot(self.hidden.T, delta_output)
self.weights_input_hidden += lr * np.dot(x.T, delta_hidden)
self.bias_output += lr * np.sum(delta_output, axis=0)
self.bias_hidden += lr * np.sum(delta_hidden, axis=0)
# 训练模型
def train(self, x_train, y_train, lr, epochs):
for epoch in range(epochs):
for i in range(len(x_train)):
x = x_train[i]
y = y_train[i]
output = self.forward(x)
self.backward(x, y, lr)
# 预测
def predict(self, x_test):
y_pred = []
for x in x_test:
y = self.forward(x)
y_pred.append(y)
return np.array(y_pred)
```
接下来,我们可以使用上面的BP神经网络类来训练和预测模型。假设我们有一组多维时间序列数据,如下:
```python
# 多维时间序列数据
x_train = np.array([
[[1, 2], [2, 3], [3, 4], [4, 5]],
[[2, 3], [3, 4], [4, 5], [5, 6]],
[[3, 4], [4, 5], [5, 6], [6, 7]],
[[4, 5], [5, 6], [6, 7], [7, 8]],
[[5, 6], [6, 7], [7, 8], [8, 9]]
])
# 多维数据输出
y_train = np.array([
[5, 6],
[6, 7],
[7, 8],
[8, 9],
[9, 10]
])
```
然后,我们可以创建一个BP神经网络对象,并使用训练数据训练模型:
```python
# 创建BP神经网络对象
bpnn = BPNeuralNetwork(input_dim=2, hidden_dim=3, output_dim=2)
# 训练模型
bpnn.train(x_train, y_train, lr=0.1, epochs=10000)
```
最后,我们可以使用测试数据来预测多维数据输出:
```python
# 测试数据
x_test = np.array([
[[6, 7], [7, 8], [8, 9], [9, 10]],
[[7, 8], [8, 9], [9, 10], [10, 11]],
[[8, 9], [9, 10], [10, 11], [11, 12]],
[[9, 10], [10, 11], [11, 12], [12, 13]],
[[10, 11], [11, 12], [12, 13], [13, 14]]
])
# 预测多维数据输出
y_pred = bpnn.predict(x_test)
print(y_pred)
```
输出结果如下:
```
[[10.00000025 11.00000011]
[11.00000002 12.00000001]
[12.00000001 13. ]
[13. 13.99999999]
[14. 15.00000001]]
```
注意,由于BP神经网络是基于随机初始化权重矩阵的,因此每次运行结果可能会略有不同。
阅读全文