import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math
# 输入数据时序步数
STEP = 4
# gauss状态分布随机信号数部分(origin)
data = pd.read_csv('12-06 15_54_07_sibato.csv') # 读取文件
training_set = data.iloc[200:5212 - 1200, 1:3].values
training_set[:, 0] = training_set[:, 0] - 2.305
test_set_org = data.iloc[5211 - 1200:5212 - 500, 1:3].values
test_set_org[:, 0] = test_set_org[:, 0] - 2.305
'''
# gauss状态分布随机信号数部分(my_measurement)
data = pd.read_csv('data_test.csv') # 读取文件
training_set = data.iloc[200:3900, 1:3].values
test_set_org = data.iloc[3900:4300, 1:3].values
'''
# sin信号部分
# data1 = pd.read_csv('data_sin_test1.csv')
# training_set = data1.iloc[:1760, 1:3].values
# test_set_org = data1.iloc[1760:, 1:3].values
# sc = MinMaxScaler(feature_range=(0, 1))
# training_set_scaled1 = sc.fit_transform(training_set)
# test_set = sc.transform(test_set_org)
# pre_set = sc.transform(test_set_org)
# --------------------------------------------------------------
sc = MinMaxScaler(feature_range=(0, 1))
training_set_scaled = sc.fit_transform(training_set)
test_set = sc.transform(test_set_org)
pre_set = sc.transform(test_set_org)
x_train = []
y_train = []
x_test = []
y_test = []
for i in range(STEP, len(training_set_scaled)):
x_train.append(training_set_scaled[i - STEP:i, 0:2])
y_train.append(training_set_scaled[i, 0])
x_train = np.array(x_train)
y_train = np.array(y_train)
x_train = torch.tensor(x_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
x_test = []
y_test = []
for i in range(STEP, len(test_set)):
x_test.append(test_set[i - STEP:i, 0:2])
y_test.append(test_set[i, 0])
x_test = np.array(x_test)
y_test = np.array(y_test)
x_test = torch.tensor(x_test, dtype=torch.float32)
class SimpleRNNModel(nn.Module):
def __init__(self):
super(SimpleRNNModel, self).__init__()
self.rnn1 = nn.LSTM(input_size=2, hidden_size=5, batch_first=True, num_layers=2, dropout=0.2)#RNN
self.rnn2 = nn.LSTM(input_size=5, hidden_size=10, batch_first=True, num_layers=2, dropout=0.2)#RNN
self.linear = nn.Linear(10, 1)
def forward(self, x):
out, _ = self.rnn1(x)
out, _ = self.rnn2(out)
out = self.linear(out[:, -1, :]) # 取每个序列最后一个时间步的输出
return out
model = SimpleRNNModel()
criterion = nn.MSELoss()
optimizer = optim.Adamax(model.parameters(), lr=0.002) # Adamax Adagrad ASGD Adadelta
num_epochs = 1500
for epoch in range(num_epochs):
optimizer.zero_grad()
outputs = model(x_train)
loss = criterion(outputs, y_train.view(-1, 1)) # 需要将 y_train 变形成 [batch_size, 1] 形状
#loss = criterion(outputs, y_train) # 需要将 y_train 变形成 [batch_size, 1] 形状
loss.backward()
optimizer.step()
print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.6f}")
# 测试集输入模型进行预测
with torch.no_grad():
predicted_force = model(x_test)
pre_set[STEP:, 0] = predicted_force[:, 0]
predicted = pre_set
predicted_force = sc.inverse_transform(predicted)
predicted_force = predicted_force[STEP:, 0]
real_force = sc.inverse_transform(test_set[STEP:, :])
real_pwm = real_force[:, 1]
real_force = real_force[:, 0]
mse = mean_squared_error(predicted_force, real_force)
rmse = math.sqrt(mean_squared_error(predicted_force, real_force))
mae = mean_absolute_error(predicted_force, real_force)
print('均方误差: %.6f' % mse)
print('均方根误差: %.6f' % rmse)
print('平均绝对误差: %.6f' % mae)
# 画出真实数据和预测数据的对比曲线
plt.plot(-real_force[:, ], color='red', label='Actually Force')
plt.plot(-predicted_force[:, ], color='blue', label='Predicted Force')
plt.plot(-real_pwm[:, ], color='green', label='Actually Input')
plt.grid
plt.xlabel('Time')
plt.ylabel('Force')
plt.legend()
plt.show()
'''
# 测试集输入模型进行预测(用sin信号测试)
with torch.no_grad():
predicted_force = model(x_test1)
pre_set1[STEP:, 0] = predicted_force[:, 0]
predicted = pre_set1
predicted_force = sc1.inverse_transform(predicted)
predicted_force = predicted_force[STEP:, 0]
real_force = sc.inverse_transform(test_set1[STEP:, :])
real_pwm = real_force[:, 1]
real_force = real_force[:, 0]
mse = mean_squared_error(predicted_force, real_force)
rmse = math.sqrt(mean_squared_error(predicted_force, real_force))
mae = mean_absolute_error(predicted_force, real_force)
print('均方误差: %.6f' % mse)
print('均方根误差: %.6f' % rmse)
print('平均绝对误差: %.6f' % mae)
# 画出真实数据和预测数据的对比曲线
plt.plot(-real_force[:, ], color='red', label='Actually Force')
plt.plot(-predicted_force[:, ], color='blue', label='Predicted Force')
plt.title('Force Prediction')
plt.xlabel('Time')
plt.ylabel('Force')
plt.legend()
plt.show()
'''
sin信号输入输出.rar
需积分: 1 190 浏览量
2023-08-21
21:52:28
上传
评论
收藏 7.77MB RAR 举报
一枚爱吃大蒜的程序员
- 粉丝: 9951
- 资源: 85
最新资源
- lab7_02.c
- 基于 SpringCloud 和 Vue3 的OA系统
- 软考高级项目管理师-项目采购管理思维导图
- WordsVector (1).ipynb
- yolov7 车牌检测 车牌识别 中文车牌识别 检测 支持双层车牌 支持12种中文车牌
- 20240429_112025.m4a
- "麦嘟学编程"似乎是一个与编程学习相关的品牌或社区名称,它可能是一个在线教育平台、博客、论坛或社交媒体群组等,旨在帮助人们学习编
- OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由
- Redis入门基础篇+源码(springboot、maven)
- ChatGPT-4是由OpenAI开发的人工智能模型,是GPT(Generative Pre-trained Transform
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈