“x_y_Vx_Vy.npy”存储了一个1000行4列的数组,代表了1000个不同时刻,物体的4个状态(x, y, Vx, Vy),用 np.load 加载。 1. 分割数据,创建模型,训练模型,能够根据前N个状态,预测物体的第N+1个状态;希望每个学生的N有所差异,每个学生创建的模型有所差异;每个学生的训练过程有所差异; 2. 训练完成之后,用最初的0~99号准确数据,预测100~199号数据;预测过程中,只有0~99号数据是原始准确数据,其余数据必须用新预测的值;画图展示100~199号准确数据与100~199号预测数据的差异
时间: 2023-12-08 15:05:17 浏览: 72
GZ.rar_ gz_atmosphere2vy_site:www.pudn.com_university payroll_离退
1. 分割数据,创建模型,训练模型
根据题目要求,我们需要对数据进行分割,然后创建模型,训练模型。为了让每个学生的模型有所差异,我们可以考虑使用不同的深度、不同的节点数、不同的激活函数等,这里我们以简单的三层神经网络为例进行训练。
代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
# 加载数据
data = np.load('x_y_Vx_Vy.npy')
# 数据分割
train_data = data[:800]
test_data = data[800:]
# 特征和标签的提取
x_train, y_train = train_data[:, :3], train_data[:, 3]
x_test, y_test = test_data[:, :3], test_data[:, 3]
# 创建模型
model = Sequential()
model.add(Dense(64, input_dim=3, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='linear'))
# 编译模型
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(x_train, y_train, epochs=50, batch_size=16)
# 保存模型
model.save('model.h5')
```
在上述代码中,我们首先使用 np.load() 函数加载数据,然后将数据分为训练集和测试集。接着,我们提取了每个样本的前三个状态作为特征,最后一个状态作为标签。然后我们使用 keras 库创建了一个三层神经网络。该神经网络包含一个输入层、两个隐藏层和一个输出层。其中,输入层的节点数为3,第一个隐藏层的节点数为64,第二个隐藏层的节点数为32,输出层的节点数为1。激活函数分别为 relu 和 linear。在模型编译时,我们使用了 Adam 优化器来最小化均方误差(mse)。最后,我们使用 fit() 函数来训练模型,并将训练好的模型保存到 model.h5 文件中。
2. 预测并画图展示
训练完成之后,我们可以使用最初的0~99号准确数据,预测100~199号数据。预测过程中,只有0~99号数据是原始准确数据,其余数据必须用新预测的值。然后我们可以将100~199号准确数据与100~199号预测数据的差异进行画图展示。
代码如下:
```python
# 加载模型
model = load_model('model.h5')
# 预测数据
y_pred = []
for i in range(200):
if i < 100:
y_pred.append(test_data[i, 3])
else:
x = np.array([y_pred[i-100], test_data[i-1, 0], test_data[i-1, 1]])
x = x.reshape(1, -1)
y = model.predict(x)
y_pred.append(y[0, 0])
# 计算误差
error = np.abs(test_data[:, 3] - y_pred)
# 画图展示
plt.plot(range(100, 200), test_data[100:, 3], label='True Data')
plt.plot(range(100, 200), y_pred[100:], label='Predicted Data')
plt.plot(range(100, 200), error[100:], label='Error')
plt.legend()
plt.show()
```
在上述代码中,我们首先使用 load_model() 函数加载训练好的模型。然后,我们使用 for 循环从100~199号数据中逐个预测数据,并将预测结果保存到 y_pred 列表中。具体地,当 i 小于100时,我们直接将测试集中的第 i 行的第4个状态作为预测值,否则我们使用上一个预测值、当前状态的前两个状态作为输入,预测当前状态的第4个状态。然后,我们计算出真实值与预测值之间的误差,并将误差、真实值和预测值分别绘制在图中展示。
阅读全文