|
Функция diff вычисляет разность между последовательными элементами числового вектора, то есть diff(X) есть [X(2) -X(1) X(3) -X(2) ... X(n) -X(n-1)]. Так, для вектора A,
A = [9 -2 3 0 1 5 4];
diff(A)
MATLAB возвращает
ans =
-11 5 -3 1 4 -1
Помимо вычисления первой разности, функция diff является полезной для определения опре-деленных характеристик вектора. Например, вы можете использовать diff для определения, является ли вектор монотонным (значения элементов или всегда возрастают или убывают), или имеет ли он равные приращения и т.д. Следующая таблица описывает несколько различ-ных путей использования функции diff с одномерным вектором x.
Применение (тест)
Описание
diff(x) == 0
Тест на определение повторяющихся элементов
all(diff(x) > 0)
Тест на монотонность
all(diff(diff(x)) == 0)
Тест на опредедление равных приращений
Обработка данных
В данном разделе рассматривается как поступать с:
- Отсутствующими значениями
- Выбросами значений или несовместимыми («неуместными») значениями
Отсутствующие значения
Специальное обозначение NaN, соответствует в MATLAB-е нечисловое значение. В соответ-ствие с принятыми соглашениями NaN является результатом неопределенных выражений та-ких как 0/0. Надлежащее обращение с отсутствующими данными является сложной пробле-мой и зачастую меняется в различных ситуациях. Для целей анализа данных, часто удобно использовать NaN для представления отсутствующих значений или данных которые недос-тупны. MATLAB обращается со значениями NaN единообразным и строгим образом. Эти значения сохраняются в процессе вычислений вплоть до конечных результатов. Любое мате-матическое действие, производимое над значением NaN, в результате также производит NaN. Например, рассмотрим матрицу, содержащую волшебный квадрат размера 3х3, где це-нтральный элемент установлен равным NaN.
a = magic(3); a(2,2) = NaN;
a =
8 1 6
3 NaN 7
4 9 2
Вычислим сумму элементов всех столбцов матрицы:
sum(a)
ans =
15 NaN 15
Любые математические действия над NaN распространяют NaN вплоть до конечного резуль-тата. Перед проведением любых статистических вычислений вам следует удалить все NaN-ы из имеющихся данных. Вот некоторые возможные пути выполнения данной операции.
Программа
Описание
i = find( ~ isnan(x));
x = x(i)
Найти индексы всех эементов вектора, не равных
NaN, и затем сохранить только эти элементы
x = x (find( ~ isnan(x)))
Удалить все NaN-ы из вектора
x = x ( ~ isnan(x));
Удалить все NaN-ы из вектора (быстрее).
x (isnan(x)) = [ ];
Удалить все NaN-ы из вектора
X (any(isnan(X’)), :) = [ ];
Удалить все строки матрицы X содержащие NaN-ы
Внимание. Для нахождения нечисловых значений NaN вам следует использовать специаль-ную функцию isnan, поскольку при принятом в MATLAB-е соглашении, логическое сравне-ние NaN == NaN всегда выдает 0. Вы не можете использовать запись x(x==NaN) = [ ] для удаления NaN-ов из ваших данных.
Если вам часто приходится удалять NaN-ы, воспользуйтесь короткой программой, записан-ной в виде М-файла.
function X = excise(X)
X(any(isnan(X')),:) = [ ];
Тогда. напечатав
X = excise(X);
вы выполните требуемое действие (excise по английски означает вырезать)
Удаление выбросов значений
Вы можете удалить выбросы значений или несовместимые данные при помощи процедур, весьма схожих с удалением NaN-ов. Для нашей транспортной задачи, с матрицей данных count, средние значения и стандартные (среднеквадратические) отклонения каждого столбца матрицы count равны
mu = mean(count)
sigma = std(count)
mu =
32.0000 46.5417 65.5833
sigma =
25.3703 41.4057 68.0281
Число строк с выбросами значений, превышающими утроенное среднеквадратическое откло-нение от среднего значения можно получить следующим образом:
[n, p] = size(count)
outliers = abs(count - mu(ones(n, 1),:)) > 3*sigma(ones(n, 1),:);
nout = sum(outliers)
nout =
1 0 0
Имеется только один выброс в первом столбце. Удалим все наблюдение при помощи выра-жения
count(any(outliers'),:) = [ ];
Регрессия и подгонка кривых
Часто бывает полезным или необходимым найти функцию, которая описывает взаимосвязь между некоторыми наблюдаемыми (или найденными экспериментально) переменными. Оп-ределение коэффициентов такой функции ведет к решению задачи переопределенной систе-мы линейных уравнений, то есть системы, у которой число уравнений превышает число не-известных. Указанные коэффициенты можно легко найти с использованием оператора обрат-ного деления \ (backslash). Допустим, вы производили измерения переменной y при разных значениях времени t.
t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.5 0.82 1.14 1.25 1.35 1.40]';
plot(t,y,'o'); grid on
В следующих разделах мы рассмотрим три способа моделирования (аппроксимации) этих данных:
- Методом полиномиальной регрессии
- Методом линейно-параметрической (linear-in-the-parameters) регрессии
- Методом множественной регрессии
Полиномиальная регрессия
Основываясь на виде графика, можно допустить, что данные могут быть аппроксимированы полиномиальной функцией второго порядка:
y = a0 + a1t + a2t2
Неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом среднеквадратичес-кой подгонки (аппроксимации), которая основана на минимизации суммы квадратов отклоне-ний данных от модели. Мы имеем шесть уравнений относительно трех неизвестных,
представляемых следующей матрицей 6х3:
X = [ones(size(t)) t t.^2]
X = 1.0000 0 0
1.0000 0.3000 0.0900
1.0000 0.8000 0.6400
1.0000 1.1000 1.2100
1.0000 1.6000 2.5600
1.0000 2.3000 5.2900
Решение находится при помощи оператора \ :
a = X\y
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
При использовании материалов активная ссылка на источник обязательна.