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