exponenta event banner

Использование MapReduce для вычисления ковариации и связанных величин

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

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

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

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

Хранилище данных обрабатывает '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 функция требует функции отображения и функции уменьшения в качестве входных данных. Преобразователь принимает блоки данных и выводит промежуточные результаты. Редуктор считывает промежуточные результаты и выдает окончательный результат.

В этом примере сопоставитель вычисляет количество, среднее значение и ковариацию для переменных в каждом блоке данных в хранилище данных. 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', 'mean', и '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 для применения карты и сокращения функций к хранилищу данных, 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 возвращает хранилище данных, outds, с файлами в текущей папке.

Просмотр результатов mapreduce вызов с помощью readall в хранилище выходных данных.

results = readall(outds)
results=3×2 table
       Key                      Value               
    _________    ___________________________________

    {'count'}    {[                         120664]}
    {'mean' }    {[120.2452 703.3926 8.1334 7.1235]}
    {'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 и pcacov функции в 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

Локальные функции

Здесь перечислены функции карты и сокращения, которые 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
%------------------------------------------------------------------

См. также

|

Связанные темы