Создание гистограмм Используя MapReduce

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

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

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

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

Создайте 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

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

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

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

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;

Создайте анонимную функцию, чтобы сконфигурировать функцию карты, чтобы использовать ребра интервала. Анонимная функция позволяет вам специализировать функцию карты путем определения особого значения для его четвертого входного параметра. Затем можно вызвать функцию карты с помощью анонимной функции, с помощью только три входных параметра что 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 применять map и reduce функции к 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')

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

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

Сглаживайте количества с фильтром скользящего среднего значения, чтобы удалить 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

Чтобы дать диаграмме лучший баланс, не отображайте лучший 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')

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

Перечисленный здесь map и reduce функции что 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
%--------------------------------------------------------------

Смотрите также

|

Похожие темы