Анализ больших данных в MATLAB Используя длинные массивы

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

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

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

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

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

Создание datastore для Набора Файлов

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

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

ds = datastore('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, категориальным, или строки. Кроме того, можно преобразовать любой массив в оперативной памяти в длинный массив. (Массив в оперативной памяти A должен быть одним из поддерживаемых типов данных.)

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

tt = tall(ds)
tt =

  Mx6 tall table

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

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

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

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

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

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

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

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

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

  tall double

    ?

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

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

Функция 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.57 sec
- Pass 2 of 2: Completed in 0.68 sec
Evaluation completed in 1.6 sec
mDep = 8.1860

Выбор Subset of Tall Array

Можно извлечь значения от длинного массива путем индексирования или индексации. Можно индексировать массив, начинающий с верхней части или нижней части, или при помощи логического индекса. Функции 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.65 sec
Evaluation completed in 0.8 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);

Выбор Data by Condition

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

Выберите только полеты из Бостона путем сравнения элементов категориального переменного 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.085 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')

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

Вместо того, чтобы использовать меньшие данные, возвращенные в 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.4 sec
- Pass 2 of 2: Completed in 0.63 sec
Evaluation completed in 1.2 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.87 sec
- Pass 2 of 2: Completed in 0.52 sec
Evaluation completed in 1.6 sec
xlabel('Year')
ylabel('Number of Flights')
title('Number of Flights by Year, 1987 - 2008')

Используйте 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.81 sec
Evaluation completed in 0.89 sec
colorbar
xlabel('Year')
ylabel('Month')
title('Airline Flights by Month and Year, 1987 - 2008')

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

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

Для получения дополнительной информации смотрите Поддержку Длинного массива, Указания по применению и Ограничения (Statistics and Machine Learning Toolbox).

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

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

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

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

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

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

  • MATLAB® Distributed Computing Server™

  • MATLAB Compiler™

Смотрите также

Похожие темы

Была ли эта тема полезной?