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

В этом примере показано, как вычислить среднее значение и ковариацию для нескольких переменных в большом наборе данных с помощью mapreduce. Это затем использует ковариацию, чтобы выполнить несколько последующих вычислений, которые не требуют другой итерации по целому набору данных.

Подготовка данных

Создайте datastore с помощью airlinesmall.csv набор данных. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких поставщиков услуг авиакомпании, включая прибытие и время отправления. В этом примере выберите ActualElapsedTime (общее время полета), Distance (общее расстояние рейса), DepDelay (задержка отправления рейса), и ArrDelay (задержка прибытия рейса) как переменные интереса.

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = {'ActualElapsedTime', 'Distance', ...
                                     'DepDelay', 'ArrDelay'};

Datastore обрабатывает 'NA' значения как пропавшие без вести и замены отсутствующие значения с NaN значения по умолчанию. Кроме того, SelectedVariableNames свойство позволяет вам работать только с выбранными переменными интереса, который можно проверить использование preview.

preview(ds)
ans=8×4 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)
  % 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 values as a single item in the intermediate key/value store
  add(intermKVStore,'key',{n m c})
end

Редуктор комбинирует промежуточные результаты для каждого блока, чтобы получить количество, среднее значение и ковариацию для каждой переменной интереса к целому набору данных. Редуктор хранит итоговые пары "ключ-значение" для ключей 'count'среднее значение, и 'cov' с соответствующими значениями для каждой переменной.

Отобразите уменьшать файл функции.

function covarianceReducer(~,intermValIter,outKVStore)
  % 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)
results=3×2 table
       Key          Value    
    _________    ____________

    {'count'}    {[  120664]}
    {'mean' }    {1x4 double}
    {'cov'  }    {4x4 double}

Count = results.Value{1};
MeanVal = results.Value{2};
Covariance = results.Value{3};

Вычисление корреляционной матрицы

Ковариация, среднее значение и значения количества полезны, чтобы выполнить дальнейшие вычисления. Вычислите корреляционную матрицу путем нахождения стандартных отклонений и нормализации их к форме корреляции.

s = sqrt(diag(Covariance));
Correlation = Covariance ./ (s*s')
Correlation = 4×4

    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=4×1 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 = 4×1

    2.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 применяется к данным.

function covarianceMapper(t,~,intermKVStore)
  % 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 values as a single item in the intermediate key/value store
  add(intermKVStore,'key',{n m c})
end
%------------------------------------------------------------------
function covarianceReducer(~,intermValIter,outKVStore)
  % 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
%------------------------------------------------------------------

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

|

Похожие темы