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