Clear Filters
Clear Filters

Prepare dataset for Neural State Space to be used as StateFcn in nlmpc

36 views (last 30 days)
Hello,
I am trying to use the neural networks using the Neural State Space Models in MATLAB to be used as a state function in nonlinear mpc toolbox. During the training and validation process I want to use normalize data of the dataset to yield a generalizable data. However, I am not sure how to denormalize the data once the training and validation have been conducted. Can anyone one help me with this?
Thank you in advance.
  3 Comments
Saskia Putri
Saskia Putri on 27 Nov 2023
Attached is the code. I have timetable data with data length of 120,000. 9 Outputs and 3 Inputs.
clc
clear
load TTdata.mat
%%
TDataN = normalize(TTdata);
%%
% Split the data into estimation (first 60000 data points) and validation (remaining data points) portions.
eData = TDataN(1:6e5,:); % portion used for estimation
vData = TDataN(6e5+1:end,:); % portion used for validation
% Downsample the training data. data length (6000)
eDataD = idresamp(eData,[1 100]);
vDataD = idresamp(vData,[1 100]);
%%
eDataD.Properties.TimeStep
height(eDataD)
%% Model Training
% Designating the input and output signals from the list of variables in the eData timetable.
Inputs = ["Icpl", "Ippl","MVopt"];
Output = ["V0", "Isga", "Isgb", "Iba", "Ibb", "Isca", "Iscb", "Vsca", "Vscb"];
%% Create a neural state-space model by using the idNeuralStateSpace constructor.
% Define a neural state-space model
nx = 9; % number of states = number of outputs
nssModel = idNeuralStateSpace(nx,NumInputs=3);
nssModel.InputName = Inputs;
nssModel.OutputName = Output;
% Configure the state network f()
nssModel.StateNetwork = createMLPNetwork(nssModel,"state", ...
LayerSizes=[128 128], ...
WeightsInitializer="glorot", ...
BiasInitializer="ones", ...
Activations='tanh');
%%
% Next, prepare the data and the training algorithm options.
% The data has already been split, downsampled and normalized.
% You now create multiple data experiments for training by splitting the dataset eDataD into overlapping segments.
% Doing so effectively reduces the prediction horizon from the original data length (6000) to the length of the individual segments.
% This reduction can sometimes lead to more generalizable results.
predictionStep = 20; % length of each data segment
numExperiment = height(eDataD) - predictionStep;
Expts = cell(1, numExperiment);
for i = 1:numExperiment
Expts{i} = eDataD(i:i+predictionStep,:);
if i>1
% set the row time of each segment to be identical; this is a requirement for training a
% neural state-space model with multiple data experiments
Expts{i}.Properties.RowTimes = Expts{1}.Properties.RowTimes;
end
end
%%
% Use the nssTrainingOptions command to create the set of training options. Pick Adam as the training solver. Set the maximum number of training epochs and the data interpolation method.
StateOpt = nssTrainingOptions('adam');
StateOpt.MaxEpochs = 300;
% StateOpt.LearnRate =0.001;
% StateOpt.MiniBatchSize = 300;
% Train the neural state-space model
tic
nssModel = nlssest(Expts,nssModel,StateOpt)
toc

Sign in to comment.

Accepted Answer

Arkadiy Turevskiy
Arkadiy Turevskiy on 27 Nov 2023
Thanks for posting the code.
To de-normalize the data you need to save mean and standard deviation data used for normalization.
[TdataN,C,S]=normalize(Tdata);
% now train neural state space, use it to predict normalized data PdataN
% using sim
% Now you can "de-normalize"
Pdata=PdataN.*S+C;
HTH
Arkadiy
  5 Comments
Arkadiy Turevskiy
Arkadiy Turevskiy on 30 Nov 2023
Hi,
In your case it looks like the outputs (same as states) are the last 9 columns of TTdata, right?
So the bias and standard deviation info you need are in the last 9 columns of C and S in my code snippet in the answer.
Take those and use to denormalize your state derivatives/states/outputs as needed.
[TTdataN,C,S]=normalize(TTdata);
% your code to train neural state space model goes here
% you compute state derivatives dxdt1 as in your code above
% Now you can "de-normalize" state derivaties
% The code below assumes TTdata has 12 columns, the first 3 columns are
% inputs, and the last 9 are states/outputs
Cstate=C(4:length(C));
Sstate=S(4:length(S));
dxdt1_denormalized=dxdt1.*Sstate+Cstate;
Hth

Sign in to comment.

More Answers (0)

Categories

Find more on Sequence and Numeric Feature Data Workflows in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!