//+------------------------------------------------------------------+ //| Filter.mq5 | //| Eugene | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Eugene" #property link "https://www.mql5.com" #property version "1.00" #include //+------------------------------------------------------------------+ //| 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