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