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

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

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

Введение в Длинные массивы

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

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

Создайте datastore для набора файлов

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

Создайте datastore для .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 

Создание Длинный массив

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

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

tt = tall(ds)
tt =

  Mx6 tall table

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

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

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

Выполняйте вычисления на длинных массивах

Можно работать с длинные массивы и длинные таблицы подобным образом, при помощи которого вы работаете с массивы и таблицы в памяти.

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

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

Вычислите среднюю задержку вылета.

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

  tall double

    ?

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

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

The gather функция вынуждает оценивать все операции в очереди и возвращает результат выхода в память. Начиная с gather возвращает весь результат в MATLAB, вы должны убедиться, что результат поместится в памяти. Для примера используйте gather на длинные массивы, которые являются результатом функции, которая уменьшает размер длинный массив, такой как 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

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

Можно извлечь значения из длинный массив путем индексирования или индексации. Можно индексировать массив, начиная с верхнего или нижнего уровня, или с помощью логического индекса. Функции 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 logical вектор, который затем используется для индекса, идентифицируя строки, где условие верно.

Выберите только рейсы из Бостона путем сравнения элементов категориальной переменной 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 функция для длинные массивы возвращает верхний 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 

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

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

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

Аналитика данных и машинное обучение с длинными массивами

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

Для получения дополнительной информации смотрите Анализ Больших данных с длинными массивами (Statistics and Machine Learning Toolbox).

Шкала до систем больших данных

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

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

  • Statistics and Machine Learning Toolbox™

  • Database Toolbox™

  • Parallel Computing Toolbox™

  • MATLAB ® Parallel Server™

  • MATLAB Compiler™

См. также

Похожие темы