Gtld linearRegression

Материал из GTL-wiki
Перейти к навигации Перейти к поиску

Краткое описание

Функция предназначена для формирования трендов с постоянной (линейной) скоростью изменения.

Cодержание функции может дополняться!

Синтаксис

Стандартная конструкция выглядит таким образом:

let __lin = linearRegression(data, forecastSteps = 3);

Аргументы

data - исходный массив данных;
forecastSteps - количество точек прогноза;

Содержание функции

function linearRegression(data, forecastSteps = 3) {
    const n = data.length; //длина массива данных

    // Проверка на достаточный объём данных. Для линейной регрессии требуется минимум 2 точки данных
    if (n < 2) return {};

    let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
    // Подготовка данных: x — время (индексы), y — значения параметра вибрации
    for (let i = 0; i < n; i++) {
        sumX += i;
        sumY += data[i];
        sumXY += i * data[i];
        sumX2 += i ** 2;
    }

    // Расчёт знаменателя с проверкой на ноль
    const denominator = n * sumX2 - sumX ** 2;
    if (Math.abs(denominator) < 1e-10) {
        gtl.log.info('Внимание!', 'Невозможно выполнить регрессию: знаменатель близок к нулю');
        return {}
    }

    // Расчёт коэффициентов
    const a = (n * sumXY - sumX * sumY) / denominator; // Наклон
    const b = (sumY - a * sumX) / n; // Сдвиг

    // Создаём результат с исходными данными
    const result = [...data];

    // Добавляем прогноз на заданное количество шагов
    for (let i = n; i < n + forecastSteps; i++) {
        result.push(a * i + b);
    }

    return {
        slope: a,
        intercept: b,
        forecastCount: forecastSteps,
        result: result,
        equation: `y = ${a.toFixed(4)}x + ${b.toFixed(4)}`
    };
}