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