Создание гистограмм Используя 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.

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

type visualizationMapper.m
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);

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

type visualizationReducer.m
function visualizationReducer(~, intermValList, outKVStore)
% get all intermediate results from the intermediate store
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')

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

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте