Этот пример показывает, как визуализировать шаблоны в большом наборе данных, не загружая все наблюдения в память одновременно. Он демонстрирует, как вычислить более низкие сводные данные данных, которые достаточны для генерации графики.
Гистограммы являются общим методом визуализации, который дает эмпирическую оценку функции плотности вероятностей (pdf) переменной. Гистограммы хорошо подходят для окружения больших данных, потому что они могут уменьшить размер необработанных входных данных до вектора отсчётов. Каждый отсчет является количеством наблюдений, которые попадают в каждый из набора смежных, числовых интервалов или интервалов.
The mapreduce
функция вычисляет счетчики отдельно на нескольких блоках данных. Затем mapreduce
суммирует счетчики из всех блоков. Функция map и функция reduce в этом примере очень просты. Тем не менее, вы можете создавать гибкие визуализации с помощью сводной информации, которую они собирают.
Создайте 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
The mapreduce
функция требует функции map и функции reduce в качестве входов. mapper получает блоки данных и выводит промежуточные результаты. Редуктор считывает промежуточные результаты и дает конечный результат.
В этом примере mapper собирает счетчики рейсов с различными объемами задержки прибытия путем накопления задержек прибытия в интервалы. Интервалы заданы четвертым входным параметром в функцию map, edges
.
Отобразите файл функции map.
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;
Создайте анонимную функцию, чтобы сконфигурировать функцию map для использования границ интервала. Анонимная функция позволяет вам специализироваться на функции map, задавая конкретное значение для ее четвертого входного параметра. Затем можно вызвать функцию map через анонимную функцию, используя только три входных параметров, которые 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
для применения карты и сокращения функций к 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')
Вот карта и сокращение функций, которые 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