В этом примере показано, как использовать длинные массивы, чтобы работать с большими данными в MATLAB®. Можно использовать длинные массивы, чтобы выполнить множество вычислений на различных типах данных, которые не умещаются в памяти. Они включают основные вычисления, а также алгоритмы машинного обучения в Statistics and Machine Learning Toolbox™.
Этот пример работает с небольшим подмножеством данных по одиночному компьютеру, и затем это затем масштабирует, чтобы анализировать весь набор данных. Однако этот аналитический метод может масштабировать еще больше, чтобы работать над наборами данных, которые являются настолько большими, они не могут быть считаны в память, или работать над системами как Apache Spark™.
Длинные массивы и длинные таблицы используются, чтобы работать с данными, которые не помещаются в память, который имеет любое количество строк. Вместо того, чтобы писать специализированный код, который учитывает огромный размер данных, длинные массивы и таблицы позволяют вам работать с большими наборами данных способом, похожим на массивы MATLAB® в оперативной памяти. Различием является тот tall
массивы обычно остаются неоцененными, пока вы не запрашиваете, чтобы вычисления были выполнены.
Эта отсроченная оценка позволяет MATLAB объединить вычисления в очереди, где возможный и берут минимальное количество проходов через данные. Поскольку количество проходов через данные значительно влияет на время выполнения, рекомендуется, чтобы вы запросили выход только при необходимости.
Создание 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
Длинные массивы похожи на массивы 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
на длинных массивах, которые являются результатом функции, которая уменьшает размер длинного массива, такого как sum
min
среднее значение
, и так далее.
Используйте 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
Можно извлечь значения из длинного массива путем индексирования или индексации. Можно индексировать массив, начинающий с верхней части или нижней части, или при помощи логического индекса. Функции 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);
Можно использовать типичные логические операции на длинных массивах, которые полезны для выбора соответствующих данных или удаления выбросов с логической индексацией. Логическое выражение создает высокий логический вектор, который затем используется к индексу, идентифицируя строки, где условие верно.
Выберите только рейсы из Бостона путем сравнения элементов категориальной переменной 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')
Вместо того, чтобы использовать меньшие данные, возвращенные в 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')
Используйте 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')
Можно выполнить более сложный статистический анализ длинных массивов, включая вычисление прогнозной аналитики и выполнение машинного обучения, с помощью функций в 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™