exponenta event banner

Создание гистограмм с помощью MapReduce

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

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

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

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

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

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

Хранилище данных обрабатывает '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 для применения карты и сокращения функций к хранилищу данных, 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 возвращает хранилище выходных данных, result, с файлами в текущей папке.

Упорядочить результаты

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

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
%--------------------------------------------------------------

См. также

|

Связанные темы