exponenta event banner

Анализ больших данных в MATLAB с помощью массивов Tall

В этом примере показано, как использовать массивы tall для работы с большими данными в MATLAB ®. Массивы tall можно использовать для выполнения различных вычислений с различными типами данных, которые не помещаются в память. К ним относятся базовые вычисления, а также алгоритмы машинного обучения в Toolbox™ статистики и машинного обучения.

Этот пример работает с небольшим подмножеством данных на одном компьютере, а затем масштабируется для анализа всего набора данных. Однако этот метод анализа может расширяться еще больше для работы с наборами данных, которые настолько велики, что их невозможно считать в память, или для работы с такими системами, как Apache Spark™.

Введение в массивы Tall

Массивы Tall и таблицы Tall используются для работы с данными из памяти, имеющими любое количество строк. Вместо написания специализированного кода, учитывающего огромный размер данных, массивы и таблицы tall позволяют работать с большими наборами данных аналогично массивам MATLAB ® в памяти. Разница в том, чтоtall массивы обычно остаются невысокими до тех пор, пока не будет запрошено выполнение вычислений.

Этот отложенный анализ позволяет MATLAB объединять вычисления в очереди, где это возможно, и выполнять минимальное количество проходов через данные. Поскольку количество проходов через данные сильно влияет на время выполнения, рекомендуется запрашивать вывод только при необходимости.

Создание хранилища данных для коллекции файлов

Создание хранилища данных позволяет получить доступ к коллекции данных. Хранилище данных может обрабатывать произвольно большие объемы данных, и данные могут быть даже распределены по нескольким файлам в нескольких папках. Можно создать хранилище данных для большинства типов файлов, включая коллекцию табличных текстовых файлов (показано здесь), электронные таблицы, изображения, базу данных SQL (требуется Toolbox™ базы данных), файлы последовательности Hadoop ® и многое другое.

Создание хранилища данных для .csv файл, содержащий данные авиакомпании. Удовольствие 'NA' значения отсутствуют, так что tabularTextDatastore заменяет их на NaN значения. Выберите переменные, представляющие интерес, и укажите категориальный тип данных для Origin и Dest переменные. Предварительный просмотр содержимого.

ds = tabularTextDatastore('airlinesmall.csv');
ds.TreatAsMissing = 'NA';
ds.SelectedVariableNames = {'Year','Month','ArrDelay','DepDelay','Origin','Dest'};
ds.SelectedFormats(5:6) = {'%C','%C'};
pre = preview(ds)
pre=8×6 table
    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    1987     10          8          12        LAX      SJC 
    1987     10          8           1        SJC      BUR 
    1987     10         21          20        SAN      SMF 
    1987     10         13          12        BUR      SJC 
    1987     10          4          -1        SMF      LAX 
    1987     10         59          63        LAX      SJC 
    1987     10          3          -2        SAN      SFO 
    1987     10         11          -1        SEA      LAX 

Создать массив Tall

Массивы Tall аналогичны массивам MATLAB в памяти, за исключением того, что они могут иметь любое количество строк. Массивы Tall могут содержать числовые, логические данные, данные datetime, данные duration, calendarDuration, категориальные данные или строки. Кроме того, можно преобразовать любой массив в памяти в массив высокого уровня. (Массив в памяти A должен быть одним из поддерживаемых типов данных.)

Базовый класс массива высокого уровня основан на типе хранилища данных, которое его поддерживает. Например, если хранилище данных ds содержит табличные данные, затем tall(ds) возвращает таблицу высокого уровня, содержащую данные.

tt = tall(ds)
tt =

  Mx6 tall table

    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

     ?        ?         ?           ?          ?        ?  
     ?        ?         ?           ?          ?        ?  
     ?        ?         ?           ?          ?        ?  
     :        :         :           :          :        :
     :        :         :           :          :        :

Отображение указывает базовый тип данных и включает в себя первые несколько строк данных. Размер таблицы отображается как «Mx6», что указывает на то, что MATLAB еще не знает, сколько строк данных.

Выполнение вычислений в массивах Tall

Можно работать с массивами и таблицами высокого уровня аналогично работе с массивами и таблицами MATLAB в памяти.

Важным аспектом массивов tall является то, что при работе с ними MATLAB не выполняет большинство операций немедленно. Эти операции выполняются быстро, поскольку фактическое вычисление откладывается до тех пор, пока вы не запросите вывод. Эта отложенная оценка важна, потому что даже простая команда, как size(X) выполнение на высоком массиве с миллиардом строк не является быстрым вычислением.

При работе с массивами tall MATLAB отслеживает все выполняемые операции и оптимизирует количество проходов через данные. Таким образом, нормально работать с нерасчетными массивами tall и запрашивать выходные данные только тогда, когда это необходимо. MATLAB не знает содержимое или размер нерасчетных массивов tall до тех пор, пока не будет запрошен анализ и отображение массива.

Рассчитайте среднюю задержку отправления.

mDep = mean(tt.DepDelay,'omitnan')
mDep =

  tall double

    ?

Сбор результатов в рабочую область

Преимущество отложенной оценки состоит в том, что когда для выполнения вычислений MATLAB приходит время, часто можно объединить операции таким образом, чтобы минимизировать количество проходов через данные. Таким образом, даже если вы выполняете много операций, MATLAB делает дополнительные проходы через данные только в случае крайней необходимости.

gather функция вынуждает оценивать все поставленные в очередь операции и возвращает полученные выходные данные обратно в память. С тех пор gather возвращает весь результат в MATLAB, необходимо убедиться, что результат умещается в памяти. Например, использовать gather на массивах tall, которые являются результатом функции, уменьшающей размер массива tall, такой как sum, min, meanи так далее.

Использовать gather вычислить среднюю задержку отправления и ввести ответ в память. Для этого расчета требуется один проход через данные, но для других расчетов может потребоваться несколько проходов через данные. MATLAB определяет оптимальное количество проходов для расчета и отображает эту информацию в командной строке.

mDep = gather(mDep)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.72 sec
- Pass 2 of 2: Completed in 0.67 sec
Evaluation completed in 1.8 sec
mDep = 8.1860

Выберите подмножество массива Tall

Можно извлечь значения из массива с высоким значением путем индексирования или индексирования. Можно индексировать массив, начиная с верхнего или нижнего или используя логический индекс. Функции head и tail являются полезными альтернативами индексации, позволяя исследовать первую и последнюю части массива высокого уровня. Соберите обе переменные одновременно, чтобы избежать дополнительных проходов через данные.

h = head(tt);
tl = tail(tt);
[h,tl] = gather(h,tl)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.63 sec
Evaluation completed in 0.79 sec
h=8×6 table
    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    1987     10          8          12        LAX      SJC 
    1987     10          8           1        SJC      BUR 
    1987     10         21          20        SAN      SMF 
    1987     10         13          12        BUR      SJC 
    1987     10          4          -1        SMF      LAX 
    1987     10         59          63        LAX      SJC 
    1987     10          3          -2        SAN      SFO 
    1987     10         11          -1        SEA      LAX 

tl=8×6 table
    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    2008     12         14           1        DAB      ATL 
    2008     12         -8          -1        ATL      TPA 
    2008     12          1           9        ATL      CLT 
    2008     12         -8          -4        ATL      CLT 
    2008     12         15          -2        BOS      LGA 
    2008     12        -15          -1        SFO      ATL 
    2008     12        -12           1        DAB      ATL 
    2008     12         -1          11        ATL      IAD 

Использовать head чтобы выбрать подмножество из 10 000 строк из данных для прототипирования кода перед масштабированием до полного набора данных.

ttSubset = head(tt,10000);

Выбор данных по условию

Можно использовать типичные логические операции с массивами tall, которые полезны для выбора соответствующих данных или удаления отклонений с логической индексацией. Логическое выражение создает высокий логический вектор, который затем используется для подстрочной индексации, идентифицируя строки, в которых условие истинно.

Выберите только рейсы из Бостона, сравнив элементы категориальной переменной Origin к значению 'BOS'.

idx = (ttSubset.Origin == 'BOS');
bosflights = ttSubset(idx,:)
bosflights =

  207x6 tall table

    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    1987     10         -8           0        BOS      LGA 
    1987     10        -13          -1        BOS      LGA 
    1987     10         12          11        BOS      BWI 
    1987     10         -3           0        BOS      EWR 
    1987     10         -5           0        BOS      ORD 
    1987     10         31          19        BOS      PHL 
    1987     10         -3           0        BOS      CLE 
    1987     11          5           5        BOS      STL 
     :        :         :           :          :        :
     :        :         :           :          :        :

Для удаления строк с отсутствующими данными или значениями NaN из массива с высоким значением можно использовать тот же метод индексирования.

idx = any(ismissing(ttSubset),2); 
ttSubset(idx,:) = [];

Определение наибольших задержек

В связи с характером больших данных сортировка всех данных с использованием традиционных методов, таких как sort или sortrows неэффективно. Тем не менее, topkrows функция для массивов tall возвращает верхний k строки в отсортированном порядке.

Рассчитайте 10 самых больших задержек вылета.

biggestDelays = topkrows(ttSubset,10,'DepDelay');
biggestDelays = gather(biggestDelays)
Evaluating tall expression using the Local MATLAB Session:
Evaluation completed in 0.061 sec
biggestDelays=10×6 table
    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    1988      3        772         785        ORD      LEX 
    1989      3        453         447        MDT      ORD 
    1988     12        397         425        SJU      BWI 
    1987     12        339         360        DEN      STL 
    1988      3        261         273        PHL      ROC 
    1988      7        261         268        BWI      PBI 
    1988      2        257         253        ORD      BTV 
    1988      3        236         240        EWR      FLL 
    1989      2        263         227        BNA      MOB 
    1989      6        224         225        DFW      JAX 

Визуализация данных в массивах Tall

Построение каждой точки в наборе больших данных невозможно. По этой причине визуализация массивов tall включает в себя уменьшение количества точек данных с помощью выборки или биннинга.

Визуализация количества рейсов в год с помощью гистограммы. Функции визуализации проходят через данные и немедленно оценивают решение при их вызове, поэтому gather не требуется.

histogram(ttSubset.Year,'BinMethod','integers')
Evaluating tall expression using the Local MATLAB Session:
Evaluation completed in 0.39 sec
xlabel('Year')
ylabel('Number of Flights')
title('Number of Flights by Year, 1987 - 1989')

Figure contains an axes. The axes with title Number of Flights by Year, 1987 - 1989 contains an object of type histogram.

Масштабирование по всему набору данных

Вместо использования меньших данных, возвращенных из head, можно масштабировать для выполнения вычислений по всему набору данных с помощью результатов из tall(ds).

tt = tall(ds);
idx = any(ismissing(tt),2); 
tt(idx,:) = [];
mnDelay = mean(tt.DepDelay,'omitnan');
biggestDelays = topkrows(tt,10,'DepDelay'); 
[mnDelay,biggestDelays] = gather(mnDelay,biggestDelays)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.39 sec
- Pass 2 of 2: Completed in 0.59 sec
Evaluation completed in 1.1 sec
mnDelay = 8.1310
biggestDelays=10×6 table
    Year    Month    ArrDelay    DepDelay    Origin    Dest
    ____    _____    ________    ________    ______    ____

    1991      3          -8        1438       MCO      BWI 
    1998     12         -12        1433       CVG      ORF 
    1995     11        1014        1014       HNL      LAX 
    2007      4         914         924       JFK      DTW 
    2001      4         887         884       MCO      DTW 
    2008      7         845         855       CMH      ORD 
    1988      3         772         785       ORD      LEX 
    2008      4         710         713       EWR      RDU 
    1998     10         679         673       MCI      DFW 
    2006      6         603         626       ABQ      PHX 

histogram(tt.Year,'BinMethod','integers')
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.86 sec
- Pass 2 of 2: Completed in 0.48 sec
Evaluation completed in 1.6 sec
xlabel('Year')
ylabel('Number of Flights')
title('Number of Flights by Year, 1987 - 2008')

Figure contains an axes. The axes with title Number of Flights by Year, 1987 - 2008 contains an object of type histogram.

Использовать histogram2 для дальнейшей разбивки количества рейсов по месяцам для всего набора данных. Поскольку ячейки для Month и Year известны заранее, укажите края ячейки, чтобы избежать дополнительного прохождения через данные.

year_edges = 1986.5:2008.5;
month_edges = 0.5:12.5;
histogram2(tt.Year,tt.Month,year_edges,month_edges,'DisplayStyle','tile')
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.72 sec
Evaluation completed in 0.78 sec
colorbar
xlabel('Year')
ylabel('Month')
title('Airline Flights by Month and Year, 1987 - 2008')

Figure contains an axes. The axes with title Airline Flights by Month and Year, 1987 - 2008 contains an object of type histogram2.

Аналитика данных и машинное обучение с помощью массивов Tall

Вы можете выполнять более сложный статистический анализ в массивах tall, в том числе вычислять прогнозную аналитику и выполнять машинное обучение, используя функции в Toolbox™ Статистика и машинное обучение.

Дополнительные сведения см. в разделе Анализ больших данных с помощью массивов Tall (Statistics and Machine Learning Toolbox).

Масштабирование до систем больших данных

Ключевая возможность tall-массивов в MATLAB - подключение к платформам больших данных, таким как вычислительные кластеры и Spark™ Apache.

Этот пример только царапает поверхность того, что возможно с помощью высоких массивов для больших данных. Дополнительные сведения об использовании см. в разделе Расширение массивов с другими продуктами:

  • Статистика и машинное обучение Toolbox™

  • Toolbox™ базы данных

  • Параллельные вычисления Toolbox™

  • Параллельный Server™ MATLAB ®

  • MATLAB Compiler™

См. также

Связанные темы