主要内容

用MapReduce计算协方差及相关量

这个例子展示了如何在一个大的数据集中使用计算几个变量的平均值和协方差mapreduce.然后,它使用协方差执行几个后续计算,不需要对整个数据集进行另一次迭代。

准备数据

方法创建数据存储airlinesmall.csv数据集。这个12兆字节的数据集包含多家航空公司的29列航班信息,包括到达和起飞时间。在本例中,选择ActualElapsedTime(总飞行时间),距离(总飞行距离),DepDelay(航班起飞延误),以及ArrDelay(航班到达延误)作为感兴趣的变量。

ds = tabularTextDatastore(“airlinesmall.csv”“TreatAsMissing”“NA”);ds。SelectedVariableNames = {“ActualElapsedTime”“距离”...“DepDelay”“ArrDelay”};

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

预览(ds)
ans =8×4表ActualElapsedTime Distance DepDelay ArrDelay _________________ ________________ ________ 53 308 12 8 63 296 1 8 83 480 20 21 59 296 12 13 77 373 1 4 61 308 63 59 84 447 2 3 155 954 1 11

MapReduce运行

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

在这个例子中,映射器计算数据存储中每个数据块中的变量的计数、平均值和协方差,ds.然后,映射器将每个块的计算值存储为中间键-值对,由单个键和包含三个计算值的单元格数组组成。

显示map函数文件。

函数intermKVStore covarianceMapper (t) ~)从输入表中获取数据并删除任何缺少值的行X = t{:,:};X = X (~any(isnan(X),2),:);计算并保存计数、均值和协方差。N = size(x,1);M = mean(x,1);C = cov(x,1);将值作为单个项存储在中间键/值存储区中添加(intermKVStore“关键”,{n m c})结束

减速器结合每个块的中间结果,以获得整个数据集中感兴趣的每个变量的计数、平均值和协方差。减速器存储键的最终键-值对“数”“的意思是”,“浸”每个变量对应的值。

显示reduce函数文件。

函数covarianceReducer (~ intermValIter outKVStore)的不同块,我们将结合在映射器中计算的结果%的数据,更新计数,均值和协方差,每次我们添加一个新的%的块。首先,将所有内容初始化为0(标量0是可以的)N1 = 0;%目前没有行M1 = 0;迄今为止平均%C1 = 0;%协方差hasnext (intermValIter)获取下一个数据块,并提取计数、均值和协方差t = getnext(intermValIter);N2 = t{1};M2 = t{2};C2 = t{3};%使用加权公式更新到目前为止的值N = n1+n2;新计数%M = (n1*m1 + n2*m2) / n;新平均值%%新的协方差是两个协方差的加权组合,加上%与平均值差异相关的附加项c1 = (n1 * c1 c2 + n1 + n2 * * (m1-m)”* (m1-m) + n2 * (m2-m) * (m2-m)) / n;为下一次迭代存储新的平均值和计数M1 = m;N1 = n;结束将结果保存在输出键/值存储中添加(outKVStore“数”、n1);添加(outKVStore“的意思是”m1);添加(outKVStore“浸”、c1);结束

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

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

mapreduce返回一个数据存储,outds,文件在当前文件夹。

命令的执行结果mapreduce调用时使用readall函数在输出数据存储上。

结果= readall(outds)
结果=3×2表键值  _________ ___________________________________ {' 数的}{[120664]}{“的意思是”}{[120.2452 703.3926 8.1334 7.1235]}{' x '} {4 x4双}
Count = results.Value{1};MeanVal = results.Value{2};协方差= results.Value{3};

计算相关矩阵

协方差、平均值和计数值对于执行进一步的计算很有用。通过找到标准偏差并将其归一化为相关形式来计算相关矩阵。

s =√(diag(协方差));相关性=协方差。/ (s*s')
相关=4×41.0000 0.9666 0.0278 0.0902 0.9666 1.0000 0.0216 0.0013 0.0278 0.0216 1.0000 0.8748 0.0902 0.0013 0.8748 1.0000

经过的时间(第一列)和距离(第二列)高度相关,因为相关性(2,1)= 0.9666.出发延迟(第三列)和到达延迟(第四列)也高度相关,因为相关性(4,3)= 0.8748

计算回归系数

计算一些回归系数来预测到达延迟,ArrDelay,使用其他三个变量作为预测变量。

斜率=协方差(1:3,1:3)\协方差(1:3,4);截距=均值(4)-均值(1:3)*斜率;B = table([拦截;山坡上,“VariableNames”, {“估计”},...“RowNames”, {“拦截”“ActualElapsedTime”“距离”“DepDelay”})
b =4×1表估计_________截距-19.912 ActualElapsedTime 0.56278距离-0.068721 DepDelay 0.94689

进行主成分分析

使用圣言会进行主成分分析。PCA是一种用于查找数据集的低维摘要的技术。下面的计算是PCA的简化版本,但从主成分分析而且pcacov统计和机器学习工具箱™功能。

你可以使用协方差或相关来进行PCA。在这种情况下,使用相关性,因为变量的尺度差异很大。前两个分量捕获了大部分方差。

[~,latent,pcacoef] = svd(相关性);潜在的;潜在的
潜在的=4×12.0052 1.8376 0.1407 0.0164

显示系数矩阵。系数矩阵的每一列描述了如何将一个组件定义为标准化原始变量的线性组合。第一个组成部分主要是前两个变量的平均值,加上其他变量的一些额外贡献。类似地,第二个部分主要是最后两个变量的平均值。

pcacoef
pcacoef =4×4-0.6291 0.3222 -0.2444 -0.6638 -0.6125 0.3548 0.2591 0.6572 -0.3313 -0.6244 0.6673 -0.2348 -0.3455 -0.6168 -0.6541 0.2689

本地函数

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

函数intermKVStore covarianceMapper (t) ~)从输入表中获取数据并删除任何缺少值的行X = t{:,:};X = X (~any(isnan(X),2),:);计算并保存计数、均值和协方差。N = size(x,1);M = mean(x,1);C = cov(x,1);将值作为单个项存储在中间键/值存储区中添加(intermKVStore“关键”,{n m c})结束%------------------------------------------------------------------函数covarianceReducer (~ intermValIter outKVStore)的不同块,我们将结合在映射器中计算的结果%的数据,更新计数,均值和协方差,每次我们添加一个新的%的块。首先,将所有内容初始化为0(标量0是可以的)N1 = 0;%目前没有行M1 = 0;迄今为止平均%C1 = 0;%协方差hasnext (intermValIter)获取下一个数据块,并提取计数、均值和协方差t = getnext(intermValIter);N2 = t{1};M2 = t{2};C2 = t{3};%使用加权公式更新到目前为止的值N = n1+n2;新计数%M = (n1*m1 + n2*m2) / n;新平均值%%新的协方差是两个协方差的加权组合,加上%与平均值差异相关的附加项c1 = (n1 * c1 c2 + n1 + n2 * * (m1-m)”* (m1-m) + n2 * (m2-m) * (m2-m)) / n;为下一次迭代存储新的平均值和计数M1 = m;N1 = n;结束将结果保存在输出键/值存储中添加(outKVStore“数”、n1);添加(outKVStore“的意思是”m1);添加(outKVStore“浸”、c1);结束%------------------------------------------------------------------

另请参阅

|

相关的话题