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