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

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

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

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

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

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

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

Создание datastore позволяет вам получить доступ к набору данных. Datastore может обработать произвольно большие объемы данных, и данные могут даже быть распространены через несколько файлов в нескольких папках. Можно создать datastore для большинства типов файлов, включая набор табличных текстовых файлов (продемонстрированный здесь), электронные таблицы, изображения, база данных SQL (требуемый Database Toolbox™), файлы последовательности 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 

Создание tall array

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

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

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

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

mDep = gather(mDep)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.81 sec
- Pass 2 of 2: Completed in 0.71 sec
Evaluation completed in 1.9 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.66 sec
Evaluation completed in 0.82 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.066 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.41 sec
xlabel('Year')
ylabel('Number of Flights')
title('Number of Flights by Year, 1987 - 1989')

Figure contains an axes object. The axes object 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.38 sec
- Pass 2 of 2: Completed in 0.61 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.9 sec
- Pass 2 of 2: Completed in 0.47 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 object. The axes object 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.73 sec
Evaluation completed in 0.8 sec
colorbar
xlabel('Year')
ylabel('Month')
title('Airline Flights by Month and Year, 1987 - 2008')

Figure contains an axes object. The axes object 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 является возможностью соединения на большие платформы данных, такие как вычислительные кластеры и Apache Spark™.

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

  • Statistics and Machine Learning Toolbox™

  • Database Toolbox™

  • Parallel Computing Toolbox™

  • MATLAB® Parallel Server™

  • MATLAB Compiler™

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

Похожие темы