主要内容

在MATLAB中使用高数组分析大数据

这个例子展示了如何在MATLAB®中使用高数组处理大数据。可以使用tall数组对不适合内存的不同类型的数据执行各种计算。这些包括基本的计算,以及统计和机器学习工具箱中的机器学习算法。

这个示例操作一台计算机上的一小部分数据,然后扩展到分析所有数据集。但是,这种分析技术可以进一步扩展,以处理大到无法读入内存的数据集,或者在Apache Spark™这样的系统上工作。

Tall数组简介

高数组和高表用于处理具有任意行数的内存不足数据。不需要编写专门的代码来考虑庞大的数据量,高数组和表可以让您以类似于内存中的MATLAB®数组的方式处理大型数据集。区别在于数组通常在请求执行计算之前保持不计算状态。

这种延迟计算使MATLAB能够在可能的情况下组合队列计算,并对数据进行最少的遍历。由于数据传递的次数会极大地影响执行时间,因此建议只在必要时请求输出。

为文件集合创建数据存储

创建数据存储使您能够访问数据集合。数据存储可以处理任意大量的数据,数据甚至可以分布在多个文件夹中的多个文件中。您可以为大多数类型的文件创建一个数据存储,包括一组表格文本文件(此处演示)、电子表格、图像、SQL数据库(数据库工具箱™必需)、Hadoop®序列文件等等。

创建对象的数据存储. csv包含航空公司数据的文件。治疗“NA”值为缺失,因此tabularTextDatastore将它们替换为值。选择感兴趣的变量,并指定类别数据类型起源而且桌子变量。预览内容。

ds = tabularTextDatastore(“airlinesmall.csv”);ds。TreatAsMissing =“NA”;ds。SelectedVariableNames = {“年”“月”“ArrDelay”“DepDelay”“起源”“桌子”};ds.SelectedFormats(5:6) = {“% C”“% C”};预=预览(ds)
pre =8×6表年月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数组类似于内存中的MATLAB数组,只是它们可以有任意数量的行。高数组可以包含数值、逻辑、日期时间、持续时间、日历持续时间、分类或字符串类型的数据。此外,您还可以将任何内存数组转换为高数组。(内存中的数组一个必须是受支持的数据类型之一。)金宝app

高数组的底层类基于支持它的数据存储的类型。例如,如果数据存储ds那么,包含表格数据高(ds)返回一个包含数据的高表。

Tt =高(ds)
tt = Mx6高表年月ArrDelay DepDelay起源服务台  ____ _____ ________ ________ ______ ____ ?????????? ? ? ? ? ? ? ? ? : : : : : : : : : : : :

显示显示底层数据类型,并包括前几行数据。表的大小显示为“Mx6”,表示MATLAB还不知道有多少行数据。

在Tall数组上执行计算

您可以使用与内存中的MATLAB数组和表类似的方式来使用高数组和高表。

高数组的一个重要方面是,当您使用它们时,MATLAB不会立即执行大多数操作。这些操作似乎执行得很快,因为实际的计算被推迟到您特别请求输出的时候。这种延迟求值非常重要,因为即使是一个简单的命令大小(X)在一个十亿行的高数组上执行不是一个快速的计算。

当您使用高数组时,MATLAB会跟踪所有要执行的操作,并优化数据的传递次数。因此,使用未求值的tall数组并仅在需要时请求输出是正常的。MATLAB不知道未求值的高数组的内容或大小,直到您请求求值并显示该数组。

计算平均起飞延误。

mDep = mean(tt。DepDelay,“omitnan”
mDep =高双份?

将结果收集到工作区

延迟求值的好处是,当需要MATLAB来执行计算时,通常可以以这样一种方式组合运算,使通过数据的次数最小化。所以,即使你执行了很多操作,MATLAB也只在绝对必要的时候对数据进行额外的传递。

收集函数强制对所有排队操作求值,并将结果输出带回内存。自收集返回整个在MATLAB的结果中,你应该确保结果适合内存。例如,使用收集对于作为减小高数组大小的函数的结果的高数组,例如总和最小值的意思是等等。

使用收集计算平均出发延迟,并将结果存入内存。这种计算只需要一次遍历数据,但其他计算可能需要多次遍历数据。MATLAB确定计算的最佳通道数,并在命令行中显示此信息。

mDep = gather(mDep)
使用本地MATLAB会话评估tall表达式:-通过2中的第1步:在0.98秒内完成-通过2中的第2步:在0.89秒内完成评估在2.4秒内完成
mDep = 8.1860

选择高数组的子集

可以通过下标或索引从高数组中提取值。可以从顶部或底部开始索引数组,也可以使用逻辑索引。的函数而且尾巴是索引的有用替代方案,使您能够研究高数组的第一部分和最后一部分。同时收集两个变量,以避免额外的数据传递。

H = head(tt);Tl = tail(tt);[h,tl] =收集(h,tl)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.82秒内完成评估在1秒内完成
h =8×6表年月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表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

使用在扩展到完整数据集之前,从数据中选择10,000行的子集用于原型代码。

tt子集= head(tt,10000);

按条件选择数据

您可以在高数组上使用典型的逻辑操作,这对于选择相关数据或使用逻辑索引删除异常值非常有用。逻辑表达式创建一个高逻辑向量,然后用于下标,标识条件为真的行。

通过比较分类变量的元素,只选择从波士顿起飞的航班起源到价值“bo”

idx = (tt子集。起源= =“bo”);bosflights = tt子集(idx,:)
bosflights = 207x6高表年月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::::::::::::

可以使用相同的索引技术从tall数组中删除缺少数据或NaN值的行。

idx = any(ismissing(tt子集),2);tt子集(idx,:) = [];

确定最大的延迟

由于大数据的性质,所有的数据排序使用传统的方法,如排序sortrows是低效的。然而,topkrows函数for tall数组返回顶部k行按顺序排列。

计算十大最严重的起飞延误。

biggestDelays = topkrows(tt子集,10,“DepDelay”);biggestdelayed = gather(biggestdelayed)
使用本地MATLAB会话计算高表达式:计算在0.11秒内完成
biggestDelays =10×6表年月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

在高数组中可视化数据

绘制大数据集中的每个点是不可行的。因此,高数组的可视化涉及到使用采样或分组来减少数据点的数量。

用直方图可视化每年的航班数量。可视化函数遍历数据并在调用它们时立即评估解决方案,因此收集不是必需的。

直方图(ttSubset。一年,“BinMethod”“整数”
使用本地MATLAB会话计算tall表达式:计算在0.46秒内完成
包含(“年”) ylabel (“飞行次数”)标题(1987 - 1989年按年划分的飞行次数

图中包含一个轴对象。标题为Number of Flights by Year, 1987 - 1989的axes对象包含一个类型为直方图的对象。

缩放到整个数据集

而不是使用返回的较小的数据的结果,可以在整个数据集上执行计算高(ds)

Tt =高(ds);Idx = any(ismissing(tt),2);Tt (idx,:) = [];mnDelay = mean(tt。DepDelay,“omitnan”);biggestdelay = topkrows(tt,10,“DepDelay”);[mnDelay, biggestdelayed] = gather(mnDelay, biggestdelayed)
使用本地MATLAB会话评估tall表达式:-通过2中的第1步:在0.6秒内完成-通过2中的第2步:在0.89秒内完成评估在1.7秒内完成
mnDelay = 8.1310
biggestDelays =10×6表年月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
直方图(tt。一年,“BinMethod”“整数”
使用本地MATLAB会话评估tall表达式:-通过2中的第1步:在1.2秒内完成-通过2中的第2步:在0.74秒内完成评估在2.3秒内完成
包含(“年”) ylabel (“飞行次数”)标题(1987 - 2008年按年划分的飞行次数

图中包含一个轴对象。标题为Number of Flights by Year, 1987 - 2008的axes对象包含一个类型为直方图的对象。

使用histogram2为了进一步分解整个数据集每月的航班数量。因为箱子而且一年是事先知道的,指定仓边,以避免额外的数据传递。

Year_edges = 1986.5:2008.5;Month_edges = 0.5:12.5;histogram2 (tt.Year tt.Month、year_edges month_edges,“DisplayStyle”“瓦”
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在1.1秒内完成评估
colorbar包含(“年”) ylabel (“月”)标题(1987 - 2008年按月和年划分的航空公司航班

图中包含一个轴对象。标题为Airline Flights by Month and Year, 1987 - 2008的axes对象包含一个类型为histogram2的对象。

高阵列的数据分析和机器学习

您可以使用“统计和机器学习工具箱™”中的功能对高阵列执行更复杂的统计分析,包括计算预测分析和执行机器学习。

有关更多信息,请参见高阵列大数据分析(统计和机器学习工具箱)

扩展到大数据系统

MATLAB中高数组的一个关键功能是连接到大数据平台,如计算集群和Apache Spark™。

这个例子只触及了大数据高数组的表面。看到用其他产品扩展Tall数组下载188bet金宝搏有关使用的更多信息:

  • 统计和机器学习工具箱™

  • 数据库工具箱™

  • 并行计算工具箱

  • MATLAB®并行服务器

  • MATLAB编译器™

另请参阅

相关的话题