Article-22745-Categorical-H.../Scripts/Filter.mq5

114 lines
6 KiB
MQL5
Raw Permalink Normal View History

2026-06-02 13:36:51 +03:00
//+------------------------------------------------------------------+
//| Filter.mq5 |
//| Eugene |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Eugene"
#property link "https://www.mql5.com"
#property version "1.00"
#include <CategoricalHMM\CategoricalHMM.mqh>
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 1. параметры модели / Model parameters ---
matrix tr = {{0.95, 0.05},
{0.10, 0.90}
};
matrix e = {{0.16, 0.16, 0.16, 0.16, 0.16, 0.20},
{0.10, 0.10, 0.10, 0.10, 0.10, 0.50}
};
vector y = {1, 6, 6, 6, 2}; // Последовательность наблюдений / Sequence of observations
CCategoricalHMM hmm(2, 6);
hmm.m_TR = tr;
hmm.m_E = e;
//--- Стартовое состояние / Initial state ---
vector currentFilterState = {1.0, 0.0};
vector cfs = currentFilterState;
Print("=== ПОСЛЕДОВАТЕЛЬНЫЙ ОНЛАЙН ПРОГНОЗ ===");
for(int i = 0; i < (int)y.Size(); i++)
{
int obs = (int)y[i];
// --- ШАГ 1: ПРОГНОЗ (до того, как узнали текущее наблюдение) ---
vector statePrediction = currentFilterState @ hmm.m_TR;
PrintFormat("Время t=%d:", i+1);
PrintFormat(" Прогноз состояния : [1]%.4f, [2]%.4f", statePrediction[0], statePrediction[1]);
vector obsPrediction = statePrediction @ hmm.m_E; // Умножаем прогноз состояний на матрицу эмиссий
ulong maxObsIdx = obsPrediction.ArgMax(); // Находим самое вероятное наблюдение
PrintFormat(" Самое вероятное след. наблюдение: %d (с вероятностью %.4f)", maxObsIdx + 1, obsPrediction[maxObsIdx]);
// --- ШАГ 2: ОБНОВЛЕНИЕ (ФИЛЬТРАЦИЯ) ---
// --- пришло наблюдение obs, обновляем текущее состояние ---
currentFilterState = hmm.Filter(currentFilterState, obs);
PrintFormat(" РЕАЛЬНОСТЬ: Пришло наблюдение %d. Текущее состояние уточнено (Фильтрация): [1]%.4f, [2]%.4f",
obs, currentFilterState[0], currentFilterState[1]);
Print("---------------------------------------");
}
// --- ВАРИАНТ 1: ПОСЛЕДОВАТЕЛЬНЫЙ (ONLINE) ---
Print("=== 1. ONLINE FILTER (STEP-BY-STEP) ===");
currentFilterState = cfs;
for(int i = 0; i < (int)y.Size(); i++)
{
currentFilterState = hmm.Filter(currentFilterState, (int)y[i]);
PrintFormat("Время t = %d (after y = %d): [1]%.4f, [2]%.4f", i+1, (int)y[i], currentFilterState[0], currentFilterState[1]);
}
// --- ВАРИАНТ 2: ПАКЕТНЫЙ (Inference) ---
Print("\n=== 2. BATCH Inference (Filtering Distribution) ===");
matrix pStates, fs, bs;
vector s_vec;
double logP;
if(hmm.Inference(y, tr, e, pStates, logP, fs, bs, s_vec))
{
PrintMatrixFormatted(fs,4);
}
}
//-------------Результаты выполнения скрипта ----------------------
// === ПОСЛЕДОВАТЕЛЬНЫЙ ОНЛАЙН ПРОГНОЗ ===
// Время t=1:
// Прогноз состояния : [1]0.9500, [2]0.0500
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2150)
// РЕАЛЬНОСТЬ: Пришло наблюдение 1. Текущее состояние уточнено (Фильтрация): [1]0.9682, [2]0.0318
// ---------------------------------------
// Время t=2:
// Прогноз состояния : [1]0.9229, [2]0.0771
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2231)
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.8273, [2]0.1727
// ---------------------------------------
// Время t=3:
// Прогноз состояния : [1]0.8032, [2]0.1968
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2590)
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.6201, [2]0.3799
// ---------------------------------------
// Время t=4:
// Прогноз состояния : [1]0.6271, [2]0.3729
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.3119)
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.4022, [2]0.5978
// ---------------------------------------
// Время t=5:
// Прогноз состояния : [1]0.4418, [2]0.5582
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.3674)
// РЕАЛЬНОСТЬ: Пришло наблюдение 2. Текущее состояние уточнено (Фильтрация): [1]0.5588, [2]0.4412
// ---------------------------------------
// === 1. ONLINE FILTER (STEP-BY-STEP) ===
// Шаг t = 1 (after y = 1): [1]0.9682, [2]0.0318
// Шаг t = 2 (after y = 6): [1]0.8273, [2]0.1727
// Шаг t = 3 (after y = 6): [1]0.6201, [2]0.3799
// Шаг t = 4 (after y = 6): [1]0.4022, [2]0.5978
// Шаг t = 5 (after y = 2): [1]0.5588, [2]0.4412
//
// === 2. BATCH Inference (Filtering Distribution) ===
// 1.0000 0.9682 0.8273 0.6201 0.4022 0.5588
// 0.0000 0.0318 0.1727 0.3799 0.5978 0.4412