Прогнозирование с помощью нейронных сетей для начинающих, авторегрессионная модель
Invite pending
Здравствуйте! В этой статье я немного расскажу про то, как можно начать пользоваться нейронными сетями для прогнозирования временных рядов.
Для начала мы построим с помощью нейронной сети модель аппроксимирующую авторегрессию.
В качестве исходных данных для моделирования здесь используются котировки Procter&Gamble.
Как входами, так и выходами нейросети могут быть совершенно разнородные величины. Результаты нейросетевого моделирования не должны зависеть от единиц измерения этих величин.
Чтобы сеть трактовала их значения одинаково, все входные и выходные величины должны быть приведены к единичному масштабу.
Данные подаются на вход сети в виде числовых последовательностей, нормированных в диапазоне от 0 до 1.
Приведение данных к единичному масштабу обеспечивается нормировкой каждой переменной на максимальное значение Xi*= Xi/Xmax.
В модели рассчитывается прогноз временного ряда на один элемент с помощью авторегрессии. В вычислении последующего элемента ряда участвует 50 предыдущих элементов. Коэффициенты вычисляются по 400 предыдущим элементам.
Коэффициенты авторегрессии вычисляются при помощи решения системы уравнений с помощью метода наименьших квадратов с применением псевдообратной матрицы Мура-Пенроуза.
После расчета авторегрессионной модели создается однослойная нейронная сеть.
Нейроны сети представляют собой линейную передаточную функцию.
purelin(n)=n

Количество нейронов в сети соответствует количеству переменных в авторегрессии.
Нейронная сеть обучается методом Левенберга-Марквардта со среднеквадратичным критерием ошибки.
На приведенном ниже графике демонстрируется обучающая выборка и аппроксимация выборки нейронной сетью и авторегрессией.

Сначала в модель нейронной сети подставляются коэффициенты при переменных авторегрессии, обучение сети не производится.
Приведенный ниже график демонстрирует отсутствие отклонений между прогнозами авторегрессионной модели и проногнозами нейронной сети.

После обучения сети данные прогноза нейронной сети сравниваются с данными прогнозов авторегрессии. Обучение производится за две итерации.
Приведенный ниже график демонстрирует минимальные отклонения прогноза нейронной сети от прогноза авторегресии.

Таким образом можно сделать вывод, что процесс обучения находит значения коэффициентов, приближенные к значениям коэффициентов авторегресии, нейронная сеть аппроксимирует авторегрессию.
clear
csv_data=csvread('data.csv');
data=csv_data(end:-1:1);
n=50; %количество элементов, которые участвуют в линейной комбинации при вычислении следующего элемента ряда
last_t=400;%количество первых элементов, по которым вычисляются коэффициенты регрессии
A=[];
X=[];
Y=[];
Xi=[];
Yi=[];
%создются матрицы для вычисления коэффициентов регрессии по МНК
for i=1:last_t-n-1
X(i,:)=data(i:i+n);
Y(i)=data(i+n+1);
end
Y=Y';
A=pinv(X)*Y; %псевдоинверсная матрица, умноженная на выходы (решение уравнения по МНК)
Xt=X;
Yt=Y;
Yr(1:size(X,1))=X*A;
%график
figure(1)
clf
%stairs(data,'-r')
Hold on
stairs(Yr,'-b')
stairs(data(51:last_t),'-g')
MaxInp = max(Xt(:)); % Максимальный вход
MinInp = min(Xt(:)); % Минимальный вход
numInputs = length(A); % Кол-вовходов
numLayers = 1; % Кол-вослоев
biasConnect = zeros(numLayers,1); % Ккакимслоямнуженбиас
inputConnect = zeros(numLayers,numInputs); % Ккакимслоямкакиевходыподключены
inputConnect(1,:) = ones(1,numInputs); % В данном случае все входы подкл к первому слою
layerConnect = zeros(numLayers,numLayers); % К каким слоям какие слои подключены (никакие)
outputConnect = zeros(1,numLayers); % Куда подключены выходы
outputConnect(1) = 1; % Один слой, к нему подключены выходы
net = network(numInputs,numLayers,biasConnect,inputConnect,…
layerConnect,outputConnect);
% Inputs диапазонвходныхзначений
for k=1:numInputs
net.inputs{k}.range =[MinInpMaxInp];
end
% Layers
net.layers{1}.transferFcn = 'purelin'; % Дляслоя
need_train = 1; % 0 — необучаемся, 1 — обучаемся
% Input weights
for k=1:numInputs
if need_train
net.IW{1,k} = rand(1); % 1 первый нейрон, k-й вход
else
net.IW{1,k} = A(k);
end
end
ifneed_train
net.performFcn = 'mse';
net.trainFcn = 'trainlm';
net = train(net,Xt',Yt');
end
Ynet = sim(net,Xt');
stairs(Ynet,'-k')
holdoff
figure(2)
plot(Ynet-Yr(1:length(Ynet)))
Вот мы и построили авторегрессионную модель с помощью нейронной сети.
В других статьях я смогу рассказать вам про то, как построить и настроить для прогнозирования двух и трехслойные перцептроны, а так же другие модели и вцелом порассуждать на тему машинного обучения.
Для начала мы построим с помощью нейронной сети модель аппроксимирующую авторегрессию.
В качестве исходных данных для моделирования здесь используются котировки Procter&Gamble.
Как входами, так и выходами нейросети могут быть совершенно разнородные величины. Результаты нейросетевого моделирования не должны зависеть от единиц измерения этих величин.
Чтобы сеть трактовала их значения одинаково, все входные и выходные величины должны быть приведены к единичному масштабу.
Данные подаются на вход сети в виде числовых последовательностей, нормированных в диапазоне от 0 до 1.
Приведение данных к единичному масштабу обеспечивается нормировкой каждой переменной на максимальное значение Xi*= Xi/Xmax.
В модели рассчитывается прогноз временного ряда на один элемент с помощью авторегрессии. В вычислении последующего элемента ряда участвует 50 предыдущих элементов. Коэффициенты вычисляются по 400 предыдущим элементам.
Коэффициенты авторегрессии вычисляются при помощи решения системы уравнений с помощью метода наименьших квадратов с применением псевдообратной матрицы Мура-Пенроуза.
После расчета авторегрессионной модели создается однослойная нейронная сеть.
Нейроны сети представляют собой линейную передаточную функцию.
purelin(n)=n

Количество нейронов в сети соответствует количеству переменных в авторегрессии.
Нейронная сеть обучается методом Левенберга-Марквардта со среднеквадратичным критерием ошибки.
На приведенном ниже графике демонстрируется обучающая выборка и аппроксимация выборки нейронной сетью и авторегрессией.

Сначала в модель нейронной сети подставляются коэффициенты при переменных авторегрессии, обучение сети не производится.
Приведенный ниже график демонстрирует отсутствие отклонений между прогнозами авторегрессионной модели и проногнозами нейронной сети.

После обучения сети данные прогноза нейронной сети сравниваются с данными прогнозов авторегрессии. Обучение производится за две итерации.
Приведенный ниже график демонстрирует минимальные отклонения прогноза нейронной сети от прогноза авторегресии.

Таким образом можно сделать вывод, что процесс обучения находит значения коэффициентов, приближенные к значениям коэффициентов авторегресии, нейронная сеть аппроксимирует авторегрессию.
Код в MatLab
clear
csv_data=csvread('data.csv');
data=csv_data(end:-1:1);
n=50; %количество элементов, которые участвуют в линейной комбинации при вычислении следующего элемента ряда
last_t=400;%количество первых элементов, по которым вычисляются коэффициенты регрессии
A=[];
X=[];
Y=[];
Xi=[];
Yi=[];
%создются матрицы для вычисления коэффициентов регрессии по МНК
for i=1:last_t-n-1
X(i,:)=data(i:i+n);
Y(i)=data(i+n+1);
end
Y=Y';
A=pinv(X)*Y; %псевдоинверсная матрица, умноженная на выходы (решение уравнения по МНК)
Xt=X;
Yt=Y;
Yr(1:size(X,1))=X*A;
%график
figure(1)
clf
%stairs(data,'-r')
Hold on
stairs(Yr,'-b')
stairs(data(51:last_t),'-g')
MaxInp = max(Xt(:)); % Максимальный вход
MinInp = min(Xt(:)); % Минимальный вход
numInputs = length(A); % Кол-вовходов
numLayers = 1; % Кол-вослоев
biasConnect = zeros(numLayers,1); % Ккакимслоямнуженбиас
inputConnect = zeros(numLayers,numInputs); % Ккакимслоямкакиевходыподключены
inputConnect(1,:) = ones(1,numInputs); % В данном случае все входы подкл к первому слою
layerConnect = zeros(numLayers,numLayers); % К каким слоям какие слои подключены (никакие)
outputConnect = zeros(1,numLayers); % Куда подключены выходы
outputConnect(1) = 1; % Один слой, к нему подключены выходы
net = network(numInputs,numLayers,biasConnect,inputConnect,…
layerConnect,outputConnect);
% Inputs диапазонвходныхзначений
for k=1:numInputs
net.inputs{k}.range =[MinInpMaxInp];
end
% Layers
net.layers{1}.transferFcn = 'purelin'; % Дляслоя
need_train = 1; % 0 — необучаемся, 1 — обучаемся
% Input weights
for k=1:numInputs
if need_train
net.IW{1,k} = rand(1); % 1 первый нейрон, k-й вход
else
net.IW{1,k} = A(k);
end
end
ifneed_train
net.performFcn = 'mse';
net.trainFcn = 'trainlm';
net = train(net,Xt',Yt');
end
Ynet = sim(net,Xt');
stairs(Ynet,'-k')
holdoff
figure(2)
plot(Ynet-Yr(1:length(Ynet)))
Вот мы и построили авторегрессионную модель с помощью нейронной сети.
В других статьях я смогу рассказать вам про то, как построить и настроить для прогнозирования двух и трехслойные перцептроны, а так же другие модели и вцелом порассуждать на тему машинного обучения.