Создайте гистограммы с использованием MapReduce

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

Гистограммы являются общим методом визуализации, который дает эмпирическую оценку функции плотности вероятностей (pdf) переменной. Гистограммы хорошо подходят для окружения больших данных, потому что они могут уменьшить размер необработанных входных данных до вектора отсчётов. Каждый отсчет является количеством наблюдений, которые попадают в каждый из набора смежных, числовых интервалов или интервалов.

The mapreduce функция вычисляет счетчики отдельно на нескольких блоках данных. Затем mapreduce суммирует счетчики из всех блоков. Функция map и функция reduce в этом примере очень просты. Тем не менее, вы можете создавать гибкие визуализации с помощью сводной информации, которую они собирают.

Подготовка данных

Создайте datastore с помощью airlinesmall.csv набор данных. Этот 12-мегабайтный набор данных содержит 29 столбцов информации о рейсе для нескольких авиаперевозчиков, включая время прибытия и вылета. В этом примере выберите ArrDelay(задержка прибытия рейса) как переменная интереса.

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = 'ArrDelay';

datastore лечит 'NA' значения как отсутствующие и заменяет отсутствующие значения на NaN значения по умолчанию. Кроме того, SelectedVariableNames свойство позволяет работать только с выбранной интересующей переменной, которую можно проверить используя preview.

preview(ds)
ans=8×1 table
    ArrDelay
    ________

        8   
        8   
       21   
       13   
        4   
       59   
        3   
       11   

Запуск MapReduce

The mapreduce функция требует функции map и функции reduce в качестве входов. mapper получает блоки данных и выводит промежуточные результаты. Редуктор считывает промежуточные результаты и дает конечный результат.

В этом примере mapper собирает счетчики рейсов с различными объемами задержки прибытия путем накопления задержек прибытия в интервалы. Интервалы заданы четвертым входным параметром в функцию map, edges.

Отобразите файл функции map.

function visualizationMapper(data, ~, intermKVStore, edges)
  % Count how many flights have arrival delay in each interval specified by
  % the EDGES vector, and add these counts to INTERMKVSTORE.
  counts = histc(data.ArrDelay, edges);
  add(intermKVStore, 'Null', counts);
end

Размер интервала гистограммы важен. Слишком широкие интервалы могут скрыть важные детали в наборе данных. Слишком узкие интервалы могут привести к зашумленной гистограмме. При работе с очень большими наборами данных лучше избегать нескольких проходов по данным, чтобы опробовать различные ширины интервала. Простой способ избежать нескольких проходов - собрать счетчики с узкими интервалами. Затем, чтобы получить более широкие интервалы, можно агрегировать соседние количества интервалов, не обрабатывая необработанные данные. О задержках прибытия рейса сообщается через 1-минутные шаги, поэтому задайте 1-минутные интервалы от -60 минут до 599 минут.

edges = -60:599;

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

ourVisualizationMapper = ...
    @(data, info, intermKVstore) visualizationMapper(data, info, intermKVstore, edges);

Отобразите файл функции сокращения. Редуктор суммирует счетчики, хранимые мэппером.

function visualizationReducer(~, intermValList, outKVStore)
  if hasnext(intermValList)
    outVal = getnext(intermValList);
  else
    outVal = [];
  end
  while hasnext(intermValList)
    outVal = outVal + getnext(intermValList);
  end  
  add(outKVStore, 'Null', outVal);
end

Использование mapreduce для применения карты и сокращения функций к datastore, ds.

result = mapreduce(ds, ourVisualizationMapper, @visualizationReducer);
********************************
*      MAPREDUCE PROGRESS      *
********************************
Map   0% Reduce   0%
Map  16% Reduce   0%
Map  32% Reduce   0%
Map  48% Reduce   0%
Map  65% Reduce   0%
Map  81% Reduce   0%
Map  97% Reduce   0%
Map 100% Reduce   0%
Map 100% Reduce 100%

mapreduce возвращает выход datastore, result, с файлами в текущей папке.

Организуйте результаты

Считайте окончательные результаты подсчета интервалов из выхода datastore.

r = readall(result);
counts = r.Value{1};

Визуализация результатов

Постройте график необработанного количества интервалов с помощью всей области значений данных (кроме нескольких выбросов, исключенных отображателем).

bar(edges, counts, 'hist');
title('Distribution of Flight Delay')
xlabel('Arrival Delay (min)')
ylabel('Flight Counts')

Figure contains an axes. The axes with title Distribution of Flight Delay contains an object of type patch.

Гистограмма имеет длинные хвосты. Посмотрите на ограниченный диапазон интервала, чтобы лучше визуализировать распределение задержек для большинства рейсов. Изменение масштаба немного показывает, что существует программный продукт отчетности; это является общим для циклических задержек до 5-минутных шагов.

xlim([-50,50]);
grid on
grid minor

Figure contains an axes. The axes with title Distribution of Flight Delay contains an object of type patch.

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

smoothCounts = filter( (1/5)*ones(1,5), 1, counts);
figure
bar(edges, smoothCounts, 'hist')
xlim([-50,50]);
title('Distribution of Flight Delay')
xlabel('Arrival Delay (min)')
ylabel('Flight Counts')
grid on
grid minor

Figure contains an axes. The axes with title Distribution of Flight Delay contains an object of type patch.

Чтобы дать графике лучший баланс, не отображайте 1% самых задержанных рейсов. Вы можете настроить визуализацию многими способами, не обрабатывая полный набор данных, принимая, что вы собрали соответствующую информацию во время полного прохода через данные.

empiricalCDF = cumsum(counts);
empiricalCDF = empiricalCDF / empiricalCDF(end);
quartile99 = find(empiricalCDF>0.99, 1, 'first');
low99 = 1:quartile99;

figure
empiricalPDF = smoothCounts(low99) / sum(smoothCounts);
bar(edges(low99), empiricalPDF, 'hist');

xlim([-60,edges(quartile99)]);
ylim([0, max(empiricalPDF)*1.05]);
title('Distribution of Flight Delay')
xlabel('Arrival Delay (min)')
ylabel('Probability Density')

Figure contains an axes. The axes with title Distribution of Flight Delay contains an object of type patch.

Локальные функции

Вот карта и сокращение функций, которые mapreduce применяется к данным.

function visualizationMapper(data, ~, intermKVStore, edges)
  % Count how many flights have arrival delay in each interval specified by
  % the EDGES vector, and add these counts to INTERMKVSTORE.
  counts = histc(data.ArrDelay, edges);
  add(intermKVStore, 'Null', counts);
end
%--------------------------------------------------------------
function visualizationReducer(~, intermValList, outKVStore)
  if hasnext(intermValList)
    outVal = getnext(intermValList);
  else
    outVal = [];
  end
  while hasnext(intermValList)
    outVal = outVal + getnext(intermValList);
  end  
  add(outKVStore, 'Null', outVal);
end
%--------------------------------------------------------------

См. также

|

Похожие темы