使用CNN求解时间序列代码
时间: 2023-11-09 10:06:18 浏览: 22
以下是一个使用CNN对时间序列进行预测的示例代码:
```python
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv1D, Flatten
# 生成时间序列数据
def generate_data(n):
x = np.linspace(0, 2*np.pi*n, num=n)
y = np.sin(x) + np.random.normal(scale=0.1, size=n)
return x, y
# 划分数据集
def split_data(x, y, train_ratio=0.7):
n_train = int(len(x) * train_ratio)
x_train, y_train = x[:n_train], y[:n_train]
x_test, y_test = x[n_train:], y[n_train:]
return x_train, y_train, x_test, y_test
# 构建CNN模型
def build_model(input_shape):
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=input_shape))
model.add(Conv1D(64, kernel_size=3, activation='relu'))
model.add(Conv1D(128, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
return model
# 训练模型
def train_model(model, x_train, y_train, x_test, y_test, epochs=50, batch_size=32):
model.compile(optimizer='adam', loss='mse')
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=epochs, batch_size=batch_size)
return model
# 预测
def predict(model, x):
return model.predict(x)
# 生成数据
n = 1000
x, y = generate_data(n)
# 划分数据集
x_train, y_train, x_test, y_test = split_data(x, y)
# 改变数据形状以适应CNN模型
x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], 1))
x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], 1))
# 构建模型
input_shape = (x_train.shape[1], 1)
model = build_model(input_shape)
# 训练模型
model = train_model(model, x_train, y_train, x_test, y_test)
# 预测
x_pred = np.array([np.linspace(0, 2*np.pi*100, num=100)])
x_pred = x_pred.reshape((x_pred.shape[0], x_pred.shape[1], 1))
y_pred = predict(model, x_pred)
# 绘制结果
import matplotlib.pyplot as plt
plt.plot(x_train[0], y_train[0], label='train')
plt.plot(x_test[0], y_test[0], label='test')
plt.plot(x_pred[0], y_pred[0], label='pred')
plt.legend()
plt.show()
```
该示例代码使用CNN对一个包含噪声的正弦信号进行预测。首先使用`generate_data`函数生成一个包含噪声的正弦信号作为样本。然后使用`split_data`函数将样本划分为训练集和测试集。接着使用`build_model`函数构建CNN模型。该模型包含3个卷积层和1个全连接层,卷积层的输出通过`Flatten`层展开后输入到全连接层中。最后使用`train_model`函数训练模型。训练完成后,使用`predict`函数对新的数据进行预测。在该示例中,使用`np.linspace`函数生成一个包含100个点的序列作为新的数据,并将其输入到模型中进行预测。最后使用`matplotlib`库将训练集、测试集和预测结果绘制在同一张图中。