• Расчет медианы массива данных

    Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
    Бонус за сообщение 0.5$
    Ответственный Модератор - Haos

    Расчет медианы массива данных

    Сообщение Haos » 21 май 2020, 15:28

    Рассмотрим расчет медианы для заданного массива Y[N]. Элемент данных, где половина данных больше него и половина меньше, называется медианой. Другими словами, медиана в статистике – это уровень показателя, который делит набор данных на две равные половины.

    Для расчета медианы пользуются таким правилом:

    1. Ранжируются данные по убыванию.

    2.1 Если количество данных нечетно, то медиана будет соответствовать центральному значению, номер которого можно определить по формуле:
    iMe = (N + 1) / 2,
    iMe - номер элемента в данных, соответствующий медиане;
    где N - количество элементов в данных.

    2.2 Если количество элементов в данных четно, то нужно брать среднюю арифметическую из двух центральных элементов данных:
    iMe = (N / 2 + (N + 1) / 2) / 2.

    Поскольку у нас массив начинается с нулевого номера, то нужно изменить формулs выше, т.е.
    для нечетного случая:

    iMe = (N +1) / 2 - 1, (1)

    для четного случая:

    Me = (N / 2 + (N / 2 - 1)) / 2 (2)

    Проверим последние формулы.
    1) Пусть у нас есть массив (ранжированный по убыванию):
    i Y[i]
    0 7
    1 6
    2 5
    3 3
    4 1
    Количество элементов массива N = 5, т.е. нечетно. Значит медиана будет соответствовать значению массива с номером: (5 + 1) / 2 - 1 = 2, т.е. равна Y[2] = 5 (выделено жирным). Использована ф. (1).

    2) Пусть у нас есть массив (ранжированный по убыванию):
    i Y[i]
    0 7
    1 6
    2 3
    3 1
    Количество элементов массива N = 4, т.е. четно. Значит медиана будет вычисляться как среднее арифметическое между двумя центральными значениями массива:
    (Y[4 / 2] + Y[4 / 2 - 1]) / 2 = (3 + 6) / 2 = 4,5. Использована ф. (2).

    Код функции по расчету медианы:
    Код: выделить все
    double f_GetMed(double &Y[])
    {
    // Функция возвращает значение медианы в массиве
       int size = ArraySize(Y);
       // сортируем массив по убыванию
       ArraySort(Y, WHOLE_ARRAY, 0, MODE_DESCEND);
       if(size%2 == 0) return((Y[size / 2 - 1] + Y[size / 2]) / 2);
       else return(Y[(size + 1) / 2 - 1]);
    }

    Массив передается по ссылке в качестве параметра в функцию f_GetMed. Сортируется по убыванию элементов. Далее проверяется если нацело на 2 делится кол-во элементов массива (т.е. их четное кол-во), то рассчитывается значение медианы для четного случая. Если кол-во элементов массива нечетное, то возвращается значение центрального номера массива.
    Аватар пользователя
    Haos
    Специалист MQL
     
    Сообщений: 17340
    Зарегистрирован: 29 мар 2014, 16:07
    Средств на руках: 376.05 Доллар
    Группа: Главные модераторы
    Благодарил (а): 2382 раз.
    Поблагодарили: 6810 раз.

    Вернуться в MQL – теория и практика

    Кто сейчас на форуме?

    Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

    Права доступа к форуму

    Вы не можете начинать темы
    Вы не можете отвечать на сообщения
    Вы не можете редактировать свои сообщения
    Вы не можете удалять свои сообщения
    Вы не можете добавлять вложения