Распознавание деятельности человека Используя данные о мобильном телефоне

В этом примере показано, как извлечь функции основанных на деятельности человека сигналов датчика смартфона, которые могут использоваться для классификации деятельности человека с помощью classificationLearner приложения. Извлечение признаков для данных сделано с помощью signalTimeFeatureExtractor и signalFrequencyFeatureExtractor, которые обеспечивают удобные и производительные API. classificationLearner приложение используется для анализа и создания модели классификации.

Загрузите набор выборочных данных

Загрузите набор данных BufferedHumanactivity.

load BufferedHumanactivity

Набор данных BufferedHumanactivity содержит 7 776 наблюдений за 4 различной физической деятельностью человека: Нахождение, Положение, Обход и Выполнение. Каждое наблюдение имеет продолжительность 44 выборок и сопоставленный с одним действием. Набор данных содержит следующие переменные:

  • [atx, aty, atz] — Буферизированные данные о датчике акселерометра фиксированной длины

  • actid — Вектор отклика, содержащий идентификаторы действия в целых числах: 1, 2, 3, и 4 Нахождения представления, Положение, Обход и Выполнение соответственно

  • actnames — Имя действия, соответствующего ID действия

  • fs — Частота дискретизации данных о датчике акселерометра

Датчик HAR (распознавание деятельности человека) Приложение [1] использовалось, чтобы собрать необработанные сигналы акселерометра в [2], который используется, чтобы создать набор данных BufferedHumanactivity. Смартфон изнашивает предмет во время пяти различных типов физической активности. Набор данных в [2] был затем буферизован, где каждая линия соответствует сигналу наблюдения 44 выборок, соответствующих одному действию. Танцующее действие от набора данных в [2] было исключено при экспортировании данных в BufferedHumanactivity.

Извлечение признаков

Существует два основных различных типов причин позади наших сигналов:

  • Один, чтобы делать с "быстрыми" изменениями в зависимости от времени, из-за динамики тела (физические движения предмета)

  • Другой, ответственный за "медленные" изменения в зависимости от времени, из-за положения тела относительно вертикального поля тяготения

Чтобы изолировать быстрые изменения сигнала от более медленных единиц, мы применим фильтр высоких частот к исходному сигналу. Затем различные функции извлечены из отфильтрованных и неотфильтрованных данных для классификации деятельности человека, которая сделана с помощью signalTimeFeatureExtractor и signalFrequencyFeatureExtractor.

atx = atx.';
aty = aty.';
atz = atz.';
% Initialize digital filter
fhp = accHighPassfilter; 
% use high pass
atxFiltered =  filter(fhp,atx);
atyFiltered =  filter(fhp,aty);
atzFiltered =  filter(fhp,atz);

Для функций времени signalTimeFeatureExtractor используется, чтобы извлечь среднее значение неотфильтрованного сигнала и RMS, ShapeFactor, PeakValue, CrestFactor, ClearanceFactor и ImpulseFactor отфильтрованного сигнала. Следовательно два signalTimeFeatureExtractor возражают meanFE, и timeFE сконфигурированы как показано ниже.

meanFE = signalTimeFeatureExtractor("Mean",true,"SampleRate",fs);
timeFE = signalTimeFeatureExtractor("RMS",true,...
    "ShapeFactor",true,...
    "PeakValue",true,...
    "CrestFactor",true,...
    "ClearanceFactor",true,...    
    "ImpulseFactor",true,...
    "SampleRate",fs);

Для функций частоты signalFrequencyFeatureExtractor используется, чтобы извлечь MeanFrequency, BandPower, PowerBandwidth, PeakAmplitude и PeakLocation отфильтрованного сигнала. Следовательно signalFrequencyFeatureExtractor возражает, что freqFE сконфигурирован как показано ниже.

freqFE = signalFrequencyFeatureExtractor("PeakAmplitude",true,...
    "PeakLocation",true,...
    "MeanFrequency",true,...
    "BandPower",true,...
    "PowerBandwidth",true,...
    "SampleRate",fs);

Расчет PeakAmplitude и PeakLocation PSD валлийцев может быть усовершенствован путем добавления более конкретных требований. Здесь мы найдем максимум 6 peaks, по крайней мере 0.25 Гц друг кроме друга. Кроме того, расчет валлийцев PSD сделан с помощью fftLength 256 и прямоугольное окно того же размера как входной сигнал.

fftLength = 256;
window = rectwin(size(atx,1));
setExtractorParameters(freqFE,"WelchPSD","FFTLength",fftLength,"Window",window);
mindist_xunits = 0.25;
minpkdist = floor(mindist_xunits/(fs/fftLength));
setExtractorParameters(freqFE,"PeakAmplitude","MaxNumExtrema",6,"MinSeparation",minpkdist);
setExtractorParameters(freqFE,"PeakLocation","MaxNumExtrema",6,"MinSeparation",minpkdist);

Расчет функций всех сигналов сделан с помощью signalDatastore и объекта экстрактора функции. signalDatastore используется для доступа к буферизированным данным в оперативной памяти atx, aty, atz, atxFiltered, atyFiltered и atzFiltered, и его метод преобразования передается указатель, чтобы извлечь метод объекта экстрактора функции как показано ниже.

meanFeatureDs = signalDatastore({atx,aty,atz});
meanFeatureDs = transform(meanFeatureDs,@meanFE.extract);
timeFeatureDs = signalDatastore({atxFiltered,atyFiltered,atzFiltered});
timeFeatureDs = transform(timeFeatureDs,@timeFE.extract);
freqFeatureDs = signalDatastore({atxFiltered,atyFiltered,atzFiltered});
freqFeatureDs = transform(freqFeatureDs,@freqFE.extract);

Чтобы вычислить функции всех сигналов, readall метод преобразованного datastore называется с помощью флага "UseParallel", который распределяет расчеты пулу рабочих, если Parallel Computing Toolbox установлен. Наконец все вычисленные функции, как объединено и изменено в rawFeatures и нормированное использующее среднее и стандартное отклонение rawFeatures.

meanFeatures = readall(meanFeatureDs,"UseParallel",true);
timeFeatures = readall(timeFeatureDs,"UseParallel",true);
freqFeatures =  readall(freqFeatureDs,"UseParallel",true);
% We will have 66 feature columns for each 7776 observations
rawFeatures  = reshape([meanFeatures,timeFeatures,freqFeatures],66,size(atx,2)).';
fmean = mean(rawFeatures,1);
fstd = std(rawFeatures,[],1);
features = rawFeatures-fmean;
features = features./fstd;

Обучите классификатор Машины опорных векторов (SVM)

Для классификации импортируйте данные в приложение ученика классификации и обучите классификатор SVM. В качестве альтернативы используйте функцию MATLAB trainClassifier, который был автоматический сгенерированный приложением ученика классификации, чтобы обучить классификатор на основе набора данных. Возвращенные аргументы включают информацию того, как набор данных был разделом во время учебной фазы - таким образом, остающиеся выборки набора данных могут использоваться для тестирования точности классификатора.

featurelabels = getFeatureNames();
FeatureTable = array2table(features,'VariableNames',featurelabels);
actioncats = categorical(actnames)';
FeatureTable.ActivityID = actioncats(actid);
[trainedClassifier, accuracy, cvp] = trainClassifier(FeatureTable);

PredictedAction = trainedClassifier.predictFcn(FeatureTable(cvp.test, 1:width(FeatureTable)-1));
TrueAction = FeatureTable.ActivityID(cvp.test);

figure
heatmap(table(PredictedAction, TrueAction), 'PredictedAction', 'TrueAction');

Сводные данные

В этом примере вы видели, как функции извлечения основанных на деятельности человека сигналов датчика смартфона с помощью signalTimeFeatureExtractor и signalFrequencyFeatureExtractor.You видели, как использовать извлеченную функцию, чтобы обучить модель SVM с помощью Приложения Classification Learner, которое привело приблизительно к 95%-й точности. Как альтернативный подход, мы можем также исследовать использование глубокие сети с featureInput слоем, чтобы классифицировать деятельность человека.

Ссылки

[1] El Hello, A. Датчик Приложение распознавания HAR. MathWorks File Exchange https://www.mathworks.com/matlabcentral/fileexchange/54138-sensor-har-recognition-app

[2] El Hello, A. Анализ данных датчика. MathWorks File Exchange https://www.mathworks.com/matlabcentral/fileexchange/54139-sensor-data-analytics - французский код вебинара -

Вспомогательные Функции

Функция hpfilter:

Функция, которая возвращает объект фильтра с желаемой спецификацией.

function designedFilter = accHighPassfilter
Fs = 10;  % Sampling Frequency
Fstop = 0.4;         % Stopband Frequency
Fpass = 0.8;         % Passband Frequency
Astop = 60;          % Stopband Attenuation (dB)
Apass = 0.1;         % Passband Ripple (dB)
match = 'passband';  % Band to match exactly

designedFilter = designfilt('highpassiir', ...
    'StopbandFrequency',Fstop,'PassbandFrequency',Fpass, ...
    'StopbandAttenuation',Astop,'PassbandRipple',Apass, ...
    'SampleRate',Fs,'DesignMethod','ellip',...
    'MatchExactly',match);
end

Функция trainClassifier:

Функция сгенерировала из приложения ученика классификации, которое возвращает обученный классификатор и его точность. Дополнительно переменная раздела данных cvp была добавлена как выходной параметр, чтобы протестировать обученную модель.

function [trainedClassifier, validationAccuracy,cvp] = trainClassifier(trainingData)
% [trainedClassifier, validationAccuracy] = trainClassifier(trainingData)
% Returns a trained classifier and its accuracy. This code recreates the
% classification model trained in Classification Learner app. Use the
% generated code to automate training the same model with new data, or to
% learn how to programmatically train models.
%
%  Input:
%      trainingData: A table containing the same predictor and response
%       columns as those imported into the app.
%
%  Output:
%      trainedClassifier: A struct containing the trained classifier. The
%       struct contains various fields with information about the trained
%       classifier.
%
%      trainedClassifier.predictFcn: A function to make predictions on new
%       data.
%
%      validationAccuracy: A double containing the accuracy in percent. In
%       the app, the History list displays this overall accuracy score for
%       each model.
%
% Use the code to train the model with new data. To retrain your
% classifier, call the function from the command line with your original
% data or new data as the input argument trainingData.
%
% For example, to retrain a classifier trained with the original data set
% T, enter:
%   [trainedClassifier, validationAccuracy] = trainClassifier(T)
%
% To make predictions with the returned 'trainedClassifier' on new data T2,
% use
%   yfit = trainedClassifier.predictFcn(T2)
%
% T2 must be a table containing at least the same predictor columns as used
% during training. For details, enter:
%   trainedClassifier.HowToPredict

% Auto-generated by MATLAB on 01-Jun-2021 11:34:54


% Extract predictors and response
% This code processes the data into the right shape for training the
% model.
inputTable = trainingData;
predictorNames = {'TotalAccXMean', 'TotalAccYMean', 'TotalAccZMean', 'BodyAccXRMS', 'BodyAccYRMS', 'BodyAccZRMS', 'BodyAccXShapeFactor', 'BodyAccYShapeFactor', 'BodyAccZShapeFactor', 'BodyAccXPeakValue', 'BodyAccYPeakValue', 'BodyAccZPeakValue', 'BodyAccXCrestFactor', 'BodyAccYCrestFactor', 'BodyAccZCrestFactor', 'BodyAccXClearanceFactor', 'BodyAccYClearanceFactor', 'BodyAccZClearanceFactor', 'BodyAccXImpulseFactor', 'BodyAccYImpulseFactor', 'BodyAccZImpulseFactor', 'BodyAccXMeanFrequency', 'BodyAccYMeanFrequency', 'BodyAccZMeanFrequency', 'BodyAccXBandPower', 'BodyAccYBandPower', 'BodyAccZBandPower', 'BodyAccXPowerBandwidth', 'BodyAccYPowerBandwidth', 'BodyAccZPowerBandwidth', 'BodyAccXSpectVal1', 'BodyAccXSpectVal2', 'BodyAccXSpectVal3', 'BodyAccXSpectVal4', 'BodyAccXSpectVal5', 'BodyAccXSpectVal6', 'BodyAccXSpectPos1', 'BodyAccXSpectPos2', 'BodyAccXSpectPos3', 'BodyAccXSpectPos4', 'BodyAccXSpectPos5', 'BodyAccXSpectPos6', 'BodyAccYSpectVal1', 'BodyAccYSpectVal2', 'BodyAccYSpectVal3', 'BodyAccYSpectVal4', 'BodyAccYSpectVal5', 'BodyAccYSpectVal6', 'BodyAccYSpectPos1', 'BodyAccYSpectPos2', 'BodyAccYSpectPos3', 'BodyAccYSpectPos4', 'BodyAccYSpectPos5', 'BodyAccYSpectPos6', 'BodyAccZSpectVal1', 'BodyAccZSpectVal2', 'BodyAccZSpectVal3', 'BodyAccZSpectVal4', 'BodyAccZSpectVal5', 'BodyAccZSpectVal6', 'BodyAccZSpectPos1', 'BodyAccZSpectPos2', 'BodyAccZSpectPos3', 'BodyAccZSpectPos4', 'BodyAccZSpectPos5', 'BodyAccZSpectPos6'};
predictors = inputTable(:, predictorNames);
response = inputTable.ActivityID;
isCategoricalPredictor = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; %#ok<NASGU> 

% Train a classifier
% This code specifies all the classifier options and trains the classifier.
template = templateSVM(...
    'KernelFunction', 'polynomial', ...
    'PolynomialOrder', 2, ...
    'KernelScale', 'auto', ...
    'BoxConstraint', 1, ...
    'Standardize', true);
classificationSVM = fitcecoc(...
    predictors, ...
    response, ...
    'Learners', template, ...
    'Coding', 'onevsone', ...
    'ClassNames', categorical({'Running'; 'Sitting'; 'Standing'; 'Walking'}));

% Create the result struct with predict function
predictorExtractionFcn = @(t) t(:, predictorNames);
svmPredictFcn = @(x) predict(classificationSVM, x);
trainedClassifier.predictFcn = @(x) svmPredictFcn(predictorExtractionFcn(x));

% Add additional fields to the result struct
trainedClassifier.RequiredVariables = {'BodyAccXBandPower', 'BodyAccXClearanceFactor', 'BodyAccXCrestFactor', 'BodyAccXImpulseFactor', 'BodyAccXMeanFrequency', 'BodyAccXPeakValue', 'BodyAccXPowerBandwidth', 'BodyAccXRMS', 'BodyAccXShapeFactor', 'BodyAccXSpectPos1', 'BodyAccXSpectPos2', 'BodyAccXSpectPos3', 'BodyAccXSpectPos4', 'BodyAccXSpectPos5', 'BodyAccXSpectPos6', 'BodyAccXSpectVal1', 'BodyAccXSpectVal2', 'BodyAccXSpectVal3', 'BodyAccXSpectVal4', 'BodyAccXSpectVal5', 'BodyAccXSpectVal6', 'BodyAccYBandPower', 'BodyAccYClearanceFactor', 'BodyAccYCrestFactor', 'BodyAccYImpulseFactor', 'BodyAccYMeanFrequency', 'BodyAccYPeakValue', 'BodyAccYPowerBandwidth', 'BodyAccYRMS', 'BodyAccYShapeFactor', 'BodyAccYSpectPos1', 'BodyAccYSpectPos2', 'BodyAccYSpectPos3', 'BodyAccYSpectPos4', 'BodyAccYSpectPos5', 'BodyAccYSpectPos6', 'BodyAccYSpectVal1', 'BodyAccYSpectVal2', 'BodyAccYSpectVal3', 'BodyAccYSpectVal4', 'BodyAccYSpectVal5', 'BodyAccYSpectVal6', 'BodyAccZBandPower', 'BodyAccZClearanceFactor', 'BodyAccZCrestFactor', 'BodyAccZImpulseFactor', 'BodyAccZMeanFrequency', 'BodyAccZPeakValue', 'BodyAccZPowerBandwidth', 'BodyAccZRMS', 'BodyAccZShapeFactor', 'BodyAccZSpectPos1', 'BodyAccZSpectPos2', 'BodyAccZSpectPos3', 'BodyAccZSpectPos4', 'BodyAccZSpectPos5', 'BodyAccZSpectPos6', 'BodyAccZSpectVal1', 'BodyAccZSpectVal2', 'BodyAccZSpectVal3', 'BodyAccZSpectVal4', 'BodyAccZSpectVal5', 'BodyAccZSpectVal6', 'TotalAccXMean', 'TotalAccYMean', 'TotalAccZMean'};
trainedClassifier.ClassificationSVM = classificationSVM;
trainedClassifier.About = 'This struct is a trained model exported from Classification Learner R2021b.';
trainedClassifier.HowToPredict = sprintf('To make predictions on a new table, T, use: \n  yfit = c.predictFcn(T) \nreplacing ''c'' with the name of the variable that is this struct, e.g. ''trainedModel''. \n \nThe table, T, must contain the variables returned by: \n  c.RequiredVariables \nVariable formats (e.g. matrix/vector, datatype) must match the original training data. \nAdditional variables are ignored. \n \nFor more information, see <a href="matlab:helpview(fullfile(docroot, ''stats'', ''stats.map''), ''appclassification_exportmodeltoworkspace'')">How to predict using an exported model</a>.');

% Extract predictors and response
% This code processes the data into the right shape for training the
% model.
inputTable = trainingData;
predictorNames = {'TotalAccXMean', 'TotalAccYMean', 'TotalAccZMean', 'BodyAccXRMS', 'BodyAccYRMS', 'BodyAccZRMS', 'BodyAccXShapeFactor', 'BodyAccYShapeFactor', 'BodyAccZShapeFactor', 'BodyAccXPeakValue', 'BodyAccYPeakValue', 'BodyAccZPeakValue', 'BodyAccXCrestFactor', 'BodyAccYCrestFactor', 'BodyAccZCrestFactor', 'BodyAccXClearanceFactor', 'BodyAccYClearanceFactor', 'BodyAccZClearanceFactor', 'BodyAccXImpulseFactor', 'BodyAccYImpulseFactor', 'BodyAccZImpulseFactor', 'BodyAccXMeanFrequency', 'BodyAccYMeanFrequency', 'BodyAccZMeanFrequency', 'BodyAccXBandPower', 'BodyAccYBandPower', 'BodyAccZBandPower', 'BodyAccXPowerBandwidth', 'BodyAccYPowerBandwidth', 'BodyAccZPowerBandwidth', 'BodyAccXSpectVal1', 'BodyAccXSpectVal2', 'BodyAccXSpectVal3', 'BodyAccXSpectVal4', 'BodyAccXSpectVal5', 'BodyAccXSpectVal6', 'BodyAccXSpectPos1', 'BodyAccXSpectPos2', 'BodyAccXSpectPos3', 'BodyAccXSpectPos4', 'BodyAccXSpectPos5', 'BodyAccXSpectPos6', 'BodyAccYSpectVal1', 'BodyAccYSpectVal2', 'BodyAccYSpectVal3', 'BodyAccYSpectVal4', 'BodyAccYSpectVal5', 'BodyAccYSpectVal6', 'BodyAccYSpectPos1', 'BodyAccYSpectPos2', 'BodyAccYSpectPos3', 'BodyAccYSpectPos4', 'BodyAccYSpectPos5', 'BodyAccYSpectPos6', 'BodyAccZSpectVal1', 'BodyAccZSpectVal2', 'BodyAccZSpectVal3', 'BodyAccZSpectVal4', 'BodyAccZSpectVal5', 'BodyAccZSpectVal6', 'BodyAccZSpectPos1', 'BodyAccZSpectPos2', 'BodyAccZSpectPos3', 'BodyAccZSpectPos4', 'BodyAccZSpectPos5', 'BodyAccZSpectPos6'};
predictors = inputTable(:, predictorNames);
response = inputTable.ActivityID;
isCategoricalPredictor = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];

% Set up holdout validation
cvp = cvpartition(response, 'Holdout', 0.25);
trainingPredictors = predictors(cvp.training, :);
trainingResponse = response(cvp.training, :);
trainingIsCategoricalPredictor = isCategoricalPredictor; %#ok<NASGU> 

% Train a classifier
% This code specifies all the classifier options and trains the classifier.
template = templateSVM(...
    'KernelFunction', 'polynomial', ...
    'PolynomialOrder', 2, ...
    'KernelScale', 'auto', ...
    'BoxConstraint', 1, ...
    'Standardize', true);
classificationSVM = fitcecoc(...
    trainingPredictors, ...
    trainingResponse, ...
    'Learners', template, ...
    'Coding', 'onevsone', ...
    'ClassNames', categorical({'Running'; 'Sitting'; 'Standing'; 'Walking'}));

% Create the result struct with predict function
svmPredictFcn = @(x) predict(classificationSVM, x);
validationPredictFcn = @(x) svmPredictFcn(x);

% Add additional fields to the result struct


% Compute validation predictions
validationPredictors = predictors(cvp.test, :);
validationResponse = response(cvp.test, :);
[validationPredictions, ~] = validationPredictFcn(validationPredictors);

% Compute validation accuracy
correctPredictions = (validationPredictions == validationResponse);
isMissing = ismissing(validationResponse);
correctPredictions = correctPredictions(~isMissing);
validationAccuracy = sum(correctPredictions)/length(correctPredictions);
end

Функция getFeatureNames:

getFeatureNames функция возвращает имена всех отдельных вычисленных функций

function featureNames = getFeatureNames
% FEATURENAMES Return the names of all the individual features computed

idx = 1;
featureNames(idx,1) = {'TotalAccXMean'};
idx = idx+1;
featureNames(idx,1) = {'TotalAccYMean'};
idx = idx+1;
featureNames(idx,1) = {'TotalAccZMean'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXRMS'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYRMS'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZRMS'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXShapeFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYShapeFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZShapeFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXPeakValue'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYPeakValue'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZPeakValue'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXCrestFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYCrestFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZCrestFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXClearanceFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYClearanceFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZClearanceFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXImpulseFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYImpulseFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZImpulseFactor'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXMeanFrequency'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYMeanFrequency'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZMeanFrequency'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXBandPower'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYBandPower'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZBandPower'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXPowerBandwidth'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYPowerBandwidth'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZPowerBandwidth'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectVal6'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccXSpectPos6'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectVal6'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccYSpectPos6'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectVal6'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos1'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos2'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos3'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos4'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos5'};
idx = idx+1;
featureNames(idx,1) = {'BodyAccZSpectPos6'};
end

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

(Statistics and Machine Learning Toolbox) |

Для просмотра документации необходимо авторизоваться на сайте