Этот пример показывает, как визуализировать шаблоны в большом наборе данных, не имея необходимость загружать все наблюдения в память одновременно. Это демонстрирует, как вычислить сводные данные пониженной громкости данных, которые достаточны сгенерировать диаграмму.
Гистограммы являются общим методом визуализации, которые дают эмпирическую оценку функции плотности вероятности (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
требует функции карты и уменьшать функции как входные параметры. Картопостроитель получает фрагменты данных и выходных промежуточных результатов. Редуктор читает, промежуточное звено заканчивается и приводит к конечному результату.
В этом примере картопостроитель собирает количества рейсов с различными суммами задержки прибытия путем накопления задержек прибытия в интервалы. Интервалы заданы четвертым входным параметром к функции карты, 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')