主要内容

使用MapReduce创建直方图

这个示例展示了如何在不需要同时将所有观察数据加载到内存的情况下可视化大型数据集中的模式。它演示了如何计算足够生成图形的数据的低容量摘要。

直方图是一种常见的可视化技术,它给出了一个变量的概率密度函数(pdf)的经验估计。直方图非常适合大数据环境,因为它们可以将原始输入数据的大小减少到一个计数向量。每个计数是位于一组连续的、数字间隔或容器内的观察数。

mapreduce函数在多个数据块上分别计算计数。然后mapreduce合计所有区块的计数。在这个例子中,map函数和reduce函数都非常简单。不过,您可以使用它们收集的摘要信息构建灵活的可视化。

准备数据

创建数据存储airlinesmall.csv数据集。这个12mb的数据集包含几家航空公司的29列航班信息,包括到达和起飞时间。在本例中,选择ArrDelay(航班到达延迟)作为变量。

ds = tabularTextDatastore (“airlinesmall.csv”“TreatAsMissing”“NA”);ds。SelectedVariableNames =“ArrDelay”

数据存储处理“NA”值替换为缺少的值默认值。此外,SelectedVariableNames属性允许您仅使用所选的感兴趣的变量,您可以使用该变量进行验证预览

预览(ds)
ans =8×1表ArrDelay ________ 8 8 21 13 4 59 3 11

MapReduce运行

mapreduce函数需要一个map函数和一个reduce函数作为输入。映射器接收数据块并输出中间结果。减速器读取中间结果并产生最终结果。

在本例中,映射器通过将到达延迟累积到bins来收集具有不同到达延迟数量的航班计数。容器由map函数的第四个输入参数定义,边缘

显示map函数文件。

函数可视化映射器(data, ~, intermKVStore, edges)按指定的时间间隔计算有多少航班延误% EDGES向量,并将这些计数添加到INTERMKVSTORE。数量= histc(数据。ArrDelay,边);添加(intermKVStore“零”、数量);结束

直方图的箱大小很重要。太宽的容器可能会掩盖数据集中的重要细节。太窄的容器会导致有噪声的直方图。当处理非常大的数据集时,最好避免对数据进行多次传递,以尝试不同的容器宽度。避免多次传递的一个简单方法是用狭窄的容器收集计数。然后,为了得到更宽的容器,您可以聚合相邻的容器计数,而无需重新处理原始数据。航班到达延迟以1分钟为增量报告,因此定义1分钟箱从-60分钟到599分钟。

边缘= 60:599;

创建一个匿名函数来配置map函数来使用bin边。匿名函数允许您专门化映射函数,方法是为其第四个输入参数指定一个特定的值。然后,您可以通过匿名函数调用map函数,只使用mapreduce函数的期望。

ourVisualizationMapper =...@(data, info, intermKVstore)可视化映射器(data, info, intermKVstore, edges);

显示reduce函数文件。reducer对映射器存储的计数进行求和。

函数visualizationReducer (~ intermValList outKVStore)如果hasnext(intermValList) outVal = getnext(intermValList);其他的outVal = [];结束hasnext(intermValList) outVal = outVal + getnext(intermValList);结束添加(outKVStore“零”, outVal);结束

使用mapreduce要将map和reduce函数应用到数据存储,ds

result = mapreduce(ds, ourVisualizationMapper, @visualizationReducer);
******************************** * MAPREDUCE的进展  * ******************************** 地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65%减少0%地图81%减少0% 97%减少0%地图100%减少0% 100%减少100%

mapreduce返回输出数据存储,结果,文件位于当前文件夹中。

组织的结果

从输出数据存储读取最终的bin计数结果。

r = readall(结果);数量= r.Value {1};

可视化的结果

使用整个数据范围(除了制图器排除的一些异常值外)绘制原始箱计数。

栏(边缘,计数,“嘘”);标题(“航班延误分布”)包含(的到来推迟(分钟)) ylabel (“飞行数”

图中包含一个轴对象。标题为Flight Delay Distribution的axis对象包含一个patch类型的对象。

直方图有长尾。查看受限的货仓范围,可以更好地可视化大多数航班的延误分布。稍微放大一点就会发现有一个报告工件;通常将延迟四舍五入为5分钟。

xlim((-50年,50));网格网格

图中包含一个轴对象。标题为Flight Delay Distribution的axis对象包含一个patch类型的对象。

用移动平均滤波器平滑计数,以消除5分钟记录伪影。

平滑计数= filter((1/5)*ones(1,5), 1,计数);图酒吧(边缘,smoothCounts,“嘘”) xlim([-50年50]);标题(“航班延误分布”)包含(的到来推迟(分钟)) ylabel (“飞行数”网格)网格

图中包含一个轴对象。标题为Flight Delay Distribution的axis对象包含一个patch类型的对象。

为了让图表更好地平衡,不要显示延误最严重的前1%的航班。假设您在整个数据传递过程中收集了适当的信息,那么无需重新处理完整的数据集,就可以以多种方式裁剪可视化。

empiricalCDF = cumsum(重要);empiricalCDF = empiricalCDF / empiricalCDF(end);quartile99 = find(经验cdf 0.99, 1,“第一”);low99 = 1: quartile99;figure empiricalPDF = smoothCounts(low99) / sum(smoothCounts);栏(empiricalPDF边缘(low99),“嘘”);xlim((-60年,边缘(quartile99)));ylim([0,最大值(empiricalPDF) * 1.05]);标题(“航班延误分布”)包含(的到来推迟(分钟)) ylabel (的概率密度

图中包含一个轴对象。标题为Flight Delay Distribution的axis对象包含一个patch类型的对象。

本地函数

这里列出的是map和reduce函数mapreduce应用于数据。

函数可视化映射器(data, ~, intermKVStore, edges)按指定的时间间隔计算有多少航班延误% EDGES向量,并将这些计数添加到INTERMKVSTORE。数量= histc(数据。ArrDelay,边);添加(intermKVStore“零”、数量);结束%--------------------------------------------------------------函数visualizationReducer (~ intermValList outKVStore)如果hasnext(intermValList) outVal = getnext(intermValList);其他的outVal = [];结束hasnext(intermValList) outVal = outVal + getnext(intermValList);结束添加(outKVStore“零”, outVal);结束%--------------------------------------------------------------

另请参阅

|

相关的话题