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

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

Здесь перечислены функции карты и сокращения, которые 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 %--------------------------------------------------------------
mapreduce | tabularTextDatastore