Используя MapReduce, чтобы вычислить ковариацию и связанные количества

Этот пример показывает, как вычислить среднее значение и ковариацию для нескольких переменных в большом наборе данных с помощью 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

Функция 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

Выполнение PCA

Используйте 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

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте