Этот пример показывает, как вычислить среднее значение и ковариацию для нескольких переменных в большом наборе данных с помощью mapreduce. Это затем использует ковариацию, чтобы выполнить несколько последующих вычислений, которые не требуют другой итерации по целому набору данных.
Создайте datastore с помощью набора данных airlinesmall.csv. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких поставщиков услуг авиакомпании, включая прибытие и время отправления. В этом примере выберите ActualElapsedTime (общее время полета), Distance (общее расстояние рейса), DepDelay (задержка отправления рейса), и ArrDelay (задержка прибытия рейса) как переменные интереса.
ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA'); ds.SelectedVariableNames = {'ActualElapsedTime', 'Distance', ... 'DepDelay', 'ArrDelay'};
Datastore обрабатывает значения 'NA' как пропавших без вести и заменяет отсутствующие значения на значения NaN по умолчанию. Кроме того, свойство SelectedVariableNames позволяет вам работать только с выбранными переменными интереса, который можно проверить использование preview.
preview(ds)
ans =
8x4 table
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 требует функции карты и уменьшать функции как входные параметры. Картопостроитель получает фрагменты данных и выходных промежуточных результатов. Редуктор читает, промежуточное звено заканчивается и приводит к конечному результату.
В этом примере картопостроитель вычисляет количество, среднее значение и ковариацию для переменных в каждом фрагменте данных в datastore, ds. Затем картопостроитель хранит вычисленные значения для каждого фрагмента как промежуточная пара "ключ-значение", состоящая из одного ключа с массивом ячеек, содержащим три вычисленных значения.
Отобразите файл функции карты.
function covarianceMapper(t,~,intermKVStore) %covarianceMapper Mapper function for mapreduce to compute covariance % Copyright 2014 The MathWorks, Inc. % Get data from input table and remove any rows with missing values x = t{:,:}; x = x(~any(isnan(x),2),:); % Compute and save the count, mean, and covariance n = size(x,1); m = mean(x,1); c = cov(x,1); % Store these as a single item in the intermediate key/value store add(intermKVStore,'key',{n m c}) end
Редуктор комбинирует промежуточные результаты для каждого фрагмента, чтобы получить количество, среднее значение и ковариацию для каждой переменной интереса к целому набору данных. Редуктор хранит итоговые пары "ключ-значение" для ключей 'count', 'mean' и 'cov' с соответствующими значениями для каждой переменной.
Отобразите уменьшать файл функции.
function covarianceReducer(~,intermValIter,outKVStore) %covarianceReducer Reducer function for mapreduce to compute covariance % Copyright 2014 The MathWorks, Inc. % We will combine results computed in the mapper for different chunks of % the data, updating the count, mean, and covariance each time we add a new % chunk. % First, initialize everything to zero (scalar 0 is okay) n1 = 0; % no rows so far m1 = 0; % mean so far c1 = 0; % covariance so far while hasnext(intermValIter) % Get the next chunk, and extract the count, mean, and covariance t = getnext(intermValIter); n2 = t{1}; m2 = t{2}; c2 = t{3}; % Use weighting formulas to update the values so far n = n1+n2; % new count m = (n1*m1 + n2*m2) / n; % new mean % New covariance is a weighted combination of the two covariance, plus % additional terms that relate to the difference in means c1 = (n1*c1 + n2*c2 + n1*(m1-m)'*(m1-m) + n2*(m2-m)'*(m2-m))/ n; % Store the new mean and count for the next iteration m1 = m; n1 = n; end % Save results in the output key/value store add(outKVStore,'count',n1); add(outKVStore,'mean',m1); add(outKVStore,'cov',c1); end
Используйте mapreduce, чтобы применить map и reduce функции к datastore, ds.
outds = mapreduce(ds, @covarianceMapper, @covarianceReducer);
******************************** * MAPREDUCE PROGRESS * ******************************** Map 0% Reduce 0% Map 16% Reduce 0% Map 32% Reduce 0% Map 48% Reduce 0% Map 65% Reduce 0% Map 81% Reduce 0% Map 97% Reduce 0% Map 100% Reduce 0% Map 100% Reduce 100%
mapreduce возвращает datastore, outds, с файлами в текущей папке.
Просмотрите результаты вызова mapreduce при помощи функции readall на выходном datastore.
results = readall(outds)
Count = results.Value{1};
MeanVal = results.Value{2};
Covariance = results.Value{3};
results =
3x2 table
Key Value
_______ ____________
'count' [ 120664]
'mean' [1x4 double]
'cov' [4x4 double]
Ковариация, среднее значение и значения количества полезны, чтобы выполнить дальнейшие вычисления. Вычислите корреляционную матрицу путем нахождения стандартных отклонений и нормализации их к форме корреляции.
s = sqrt(diag(Covariance)); Correlation = Covariance ./ (s*s')
Correlation =
1.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
Прошедшее время (первый столбец) и расстояние (второй столбец) высоко коррелируется, начиная с Correlation(2,1) = 0.9666. Исходная задержка (третий столбец) и задержка прибытия (четвертый столбец) также высоко коррелируются, начиная с Correlation(4,3) = 0.8748.
Вычислите некоторые коэффициенты регрессии, чтобы предсказать задержку прибытия, ArrDelay, с помощью других трех переменных в качестве предикторов.
slopes = Covariance(1:3,1:3)\Covariance(1:3,4); intercept = MeanVal(4) - MeanVal(1:3)*slopes; b = table([intercept; slopes], 'VariableNames', {'Estimate'}, ... 'RowNames', {'Intercept','ActualElapsedTime','Distance','DepDelay'})
b =
4x1 table
Estimate
_________
Intercept -19.912
ActualElapsedTime 0.56278
Distance -0.068721
DepDelay 0.94689
Используйте svd, чтобы выполнить PCA (анализ основных компонентов). PCA является методом для нахождения более низких размерных сводных данных набора данных. Следующее вычисление является упрощенной версией PCA, но больше опций доступно от pca и функций pcacov в Statistics and Machine Learning Toolbox™.
Можно выполнить PCA, использующий или ковариацию или корреляцию. В этом случае используйте корреляцию, поскольку различие в шкале переменных является большим. Первые два компонента получают большую часть отклонения.
[~,latent,pcacoef] = svd(Correlation); latent = diag(latent)
latent =
2.0052
1.8376
0.1407
0.0164
Отобразите матрицу коэффициентов. Каждый столбец содействующей матрицы описывает, как один компонент задан как линейная комбинация стандартизированных исходных переменных. Первый компонент является в основном в среднем первыми двумя переменными с некоторым дополнительным вкладом от других переменных. Точно так же второй компонент является в основном в среднем последними двумя переменными.
pcacoef
pcacoef = -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