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