exponenta event banner

findchangepts

Найти резкие изменения в сигнале

Описание

пример

ipt = findchangepts(x) возвращает индекс, при котором среднее значение x наиболее значительные изменения.

  • Если x является вектором с N элементами, то findchangepts разделение x на два региона, x(1:ipt-1) и x(ipt:N), которые минимизируют сумму остаточной (квадратичной) ошибки каждой области от ее локального среднего.

  • Если x является матрицей M-by-N, то findchangepts разделение x на два региона, x(1:M,1:ipt-1) и x(1:M,ipt:N)возвращают индекс столбца, который минимизирует сумму остаточной ошибки каждой области от ее локального M-мерного среднего.

пример

ipt = findchangepts(x,Name,Value) задает дополнительные параметры с использованием аргументов пары «имя-значение». Варианты включают количество точек изменения для отчета и статистику для измерения, а не среднее значение. Дополнительные сведения см. в разделе Обнаружение точек перехода.

пример

[ipt,residual] = findchangepts(___) также возвращает остаточную ошибку сигнала относительно смоделированных изменений, включая любые из предыдущих спецификаций.

пример

findchangepts(___) без выходных аргументов строит график сигнала и любых обнаруженных точек изменения. Дополнительные сведения см. в разделе Статистика.

Примеры

свернуть все

Загрузите файл данных, содержащий запись свистка поезда, дискретизированного на частоте 8192 Гц. Найдите 10 точек, в которых среднеквадратичный уровень сигнала изменяется наиболее значительно.

load train

findchangepts(y,'MaxNumChanges',10,'Statistic','rms')

Вычислите кратковременную спектральную плотность мощности сигнала. Разделите сигнал на 128 сегментов выборки и окнах каждого сегмента с помощью окна Хэмминга. Укажите 120 образцов перекрытия между соседними сегментами и 128 точками DFT. Найдите 10 точек, в которых среднее значение спектральной плотности мощности изменяется наиболее значительно.

[s,f,t,pxx] = spectrogram(y,128,120,128,Fs);

findchangepts(pow2db(pxx),'MaxNumChanges',10)

Figure contains 2 axes. Axes 1 contains 131 objects of type line. Axes 2 with title Number of changepoints = 10 Total residual error = 2820745.8453 contains 11 objects of type image, line.

Сбросьте генератор случайных чисел для воспроизводимых результатов. Генерировать случайный сигнал, где:

  • Среднее значение является постоянным в каждой из семи областей и резко изменяется от области к области.

  • Дисперсия является постоянной в каждой из пяти областей и резко изменяется от области к области.

rng('default')

lr = 20;

mns = [0 1 4 -5 2 0 1];
nm = length(mns);

vrs = [1 4 6 1 3];
nv = length(vrs);

v = randn(1,lr*nm*nv)/2;

f = reshape(repmat(mns,lr*nv,1),1,lr*nm*nv);
y = reshape(repmat(vrs,lr*nm,1),1,lr*nm*nv);

t = v.*y+f;

Постройте график сигнала, выделив этапы его построения.

subplot(2,2,1)
plot(v)
title('Original')
xlim([0 700])

subplot(2,2,2)
plot([f;v+f]')
title('Means')
xlim([0 700])

subplot(2,2,3)
plot([y;v.*y]')
title('Variances')
xlim([0 700])

subplot(2,2,4)
plot(t)
title('Final')
xlim([0 700])

Figure contains 4 axes. Axes 1 with title Original contains an object of type line. Axes 2 with title Means contains 2 objects of type line. Axes 3 with title Variances contains 2 objects of type line. Axes 4 with title Final contains an object of type line.

Найдите пять точек, где среднее значение сигнала изменяется наиболее значительно.

figure
findchangepts(t,'MaxNumChanges',5)

Figure contains an axes. The axes with title Number of changepoints = 5 Total residual error = 1989.3814 contains 3 objects of type line.

Найдите пять точек, где среднеквадратичный уровень сигнала изменяется наиболее значительно.

findchangepts(t,'MaxNumChanges',5,'Statistic','rms')

Figure contains an axes. The axes with title Number of changepoints = 5 Total log weighted dispersion = 871.1003 contains 2 objects of type line.

Найдите точку, в которой среднее и стандартное отклонение сигнала изменяются сильнее всего.

findchangepts(t,'Statistic','std')

Figure contains an axes. The axes with title Number of changepoints = 1 Total log weighted dispersion = 1263.4625 contains 3 objects of type line.

Загрузите речевой сигнал, дискретизированный при Fs = 7418 Гц. Файл содержит запись женского голоса, говорящего слово «MATLAB ®».

load mtlb

Различите гласные и согласные в слове, найдя точки, в которых существенно меняется дисперсия сигнала. Ограничьте число точек перехода пятью.

numc = 5;

[q,r] = findchangepts(mtlb,'Statistic','rms','MaxNumChanges',numc)
q = 5×1

         132
         778
        1646
        2500
        3454

r = -4.4055e+03

Постройте график сигнала и просмотрите точки изменения.

findchangepts(mtlb,'Statistic','rms','MaxNumChanges',numc)

Figure contains an axes. The axes with title Number of changepoints = 5 Total log weighted dispersion = -4405.482 contains 2 objects of type line.

Чтобы воспроизвести звук с паузой после каждого из сегментов, раскомментируйте следующие строки.

% soundsc(1:q(1),Fs)
% for k = 1:length(q)-1
%     soundsc(mtlb(q(k):q(k+1)),Fs)
%     pause(1)
% end
% soundsc(q(end):length(mtlb),Fs)

Создайте сигнал, состоящий из двух синусоид с изменяющейся амплитудой и линейным трендом.

vc = sin(2*pi*(0:201)/17).*sin(2*pi*(0:201)/19).* ...
    [sqrt(0:0.01:1) (1:-0.01:0).^2]+(0:201)/401;

Найдите точки, где значение сигнала изменяется наиболее значительно. 'Statistic' в этом случае пара имя-значение является необязательной. Укажите минимальное улучшение остаточной ошибки, равное 1.

findchangepts(vc,'Statistic','mean','MinThreshold',1)

Figure contains an axes. The axes with title Number of changepoints = 2 Total residual error = 9.3939 contains 3 objects of type line.

Найдите точки, в которых среднеквадратичный уровень сигнала изменяется сильнее всего. Укажите минимальное улучшение остаточной ошибки, равное 6.

findchangepts(vc,'Statistic','rms','MinThreshold',6)

Figure contains an axes. The axes with title Number of changepoints = 4 Total log weighted dispersion = -436.5368 contains 2 objects of type line.

Найдите точки, в которых стандартное отклонение сигнала изменяется наиболее значительно. Укажите минимальную остаточную погрешность 10.

findchangepts(vc,'Statistic','std','MinThreshold',10)

Figure contains an axes. The axes with title Number of changepoints = 26 Total log weighted dispersion = -1110.8065 contains 3 objects of type line.

Найдите точки, где среднее значение и наклон сигнала изменяются наиболее резко. Укажите минимальное уменьшение остаточной ошибки на 0,6.

findchangepts(vc,'Statistic','linear','MinThreshold',0.6)

Figure contains an axes. The axes with title Number of changepoints = 3 Total residual error = 7.9824 contains 3 objects of type line.

Создайте двумерную 1000-образную кривую Безье с 20 случайными контрольными точками. Кривая Безье определяется следующим образом:

C (t) =∑k=0m (mk) tk (1-t) m-kPk,

где Pk - k-й из m контрольных точек, t находится в диапазоне от 0 до 1, и (mk) - биномиальный коэффициент. Постройте график кривой и контрольных точек.

m = 20;
P = randn(m,2);
t = linspace(0,1,1000)';

pol = t.^(0:m-1).*(1-t).^(m-1:-1:0);
bin = gamma(m)./gamma(1:m)./gamma(m:-1:1);
crv = bin.*pol*P;

plot(crv(:,1),crv(:,2),P(:,1),P(:,2),'o:')

Figure contains an axes. The axes contains 2 objects of type line.

Разделите кривую на три сегмента таким образом, чтобы точки в каждом сегменте находились на минимальном расстоянии от среднего значения сегмента.

findchangepts(crv','MaxNumChanges',3)

Figure contains 2 axes. Axes 1 contains 5 objects of type line. Axes 2 with title Number of changepoints = 2 Total residual error = 158.2579 contains 3 objects of type line.

Разделите кривую на 20 сегментов, которые лучше всего подходят прямыми линиями.

findchangepts(crv','Statistic','linear','MaxNumChanges',19)

Figure contains 2 axes. Axes 1 contains 5 objects of type line. Axes 2 with title Number of changepoints = 19 Total residual error = 0.090782 contains 21 objects of type line.

Создайте и постройте график трехмерной кривой Безье с 20 случайными контрольными точками.

P = rand(m,3);
crv = bin.*pol*P;

plot3(crv(:,1),crv(:,2),crv(:,3),P(:,1),P(:,2),P(:,3),'o:')
xlabel('x')
ylabel('y')

Figure contains an axes. The axes contains 2 objects of type line.

Визуализируйте кривую сверху.

view([0 0 1])

Figure contains an axes. The axes contains 2 objects of type line.

Разделите кривую на три сегмента таким образом, чтобы точки в каждом сегменте находились на минимальном расстоянии от среднего значения сегмента.

findchangepts(crv','MaxNumChanges',3)

Figure contains 2 axes. Axes 1 contains 7 objects of type line. Axes 2 with title Number of changepoints = 2 Total residual error = 7.2855 contains 3 objects of type line.

Разделите кривую на 20 сегментов, которые лучше всего подходят прямыми линиями.

findchangepts(crv','Statistic','linear','MaxNumChanges',19)

Figure contains 2 axes. Axes 1 contains 7 objects of type line. Axes 2 with title Number of changepoints = 19 Total residual error = 0.0075362 contains 21 objects of type line.

Входные аргументы

свернуть все

Входной сигнал, заданный как действительный вектор.

Пример: reshape(randn(100,3)+[-3 0 3],1,300) - случайный сигнал с двумя резкими изменениями среднего.

Пример: reshape(randn(100,3).*[1 20 5],1,300) - случайный сигнал с двумя резкими изменениями среднеквадратического уровня.

Типы данных: single | double

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'MaxNumChanges',3,'Statistic','rms','MinDistance',20 находит до трех точек, где изменения среднеквадратического уровня наиболее значительны и где точки разделены по меньшей мере 20 выборками.

Максимальное количество существенных изменений для возврата, указанное как пара, разделенная запятыми, состоящая из 'MaxNumChanges' и целочисленный скаляр. Найдя точку с наиболее значительным изменением, findchangepts постепенно ослабляет критерий поиска для включения большего количества точек перехода без превышения заданного максимума. Если какой-либо параметр поиска возвращает больше максимума, то функция ничего не возвращает. Если 'MaxNumChanges' не указан, то функция возвращает точку с наиболее значительным изменением. Невозможно указать 'MinThreshold' и 'MaxNumChanges' одновременно.

Пример: findchangepts([0 1 0]) возвращает индекс второго образца.

Пример: findchangepts([0 1 0],'MaxNumChanges',1) возвращает пустую матрицу.

Пример: findchangepts([0 1 0],'MaxNumChanges',2) возвращает индексы второй и третьей точек.

Типы данных: single | double

Тип обнаруживаемого изменения, указанный как пара, разделенная запятыми, состоящая из 'Statistic' и одно из этих значений:

  • 'mean' - Обнаружить изменения среднего. При звонке findchangepts без выходных аргументов функция строит график сигнала, точек изменения и среднего значения каждого сегмента, заключенного в последовательные точки изменения.

  • 'rms' - Обнаружение изменений среднеквадратического уровня. При звонке findchangepts без выходных аргументов функция строит график сигнала и точек изменения.

  • 'std' - Обнаруживайте изменения стандартного отклонения, используя логарифмическое правдоподобие Гаусса. При звонке findchangepts без выходных аргументов функция строит график сигнала, точек изменения и среднего значения каждого сегмента, заключенного в последовательные точки изменения.

  • 'linear' - Обнаружить изменения в среднем и уклоне. При звонке findchangepts без выходных аргументов функция строит график сигнала, точек изменения и линии, которая наилучшим образом соответствует каждой части сигнала, заключенной в последовательные точки изменения.

Пример: findchangepts([0 1 2 1],'Statistic','mean') возвращает индекс второго образца.

Пример: findchangepts([0 1 2 1],'Statistic','rms') возвращает индекс третьего образца.

Минимальное количество выборок между точками перехода, указанное как пара, разделенная запятыми, состоящая из 'MinDistance' и целочисленный скаляр. Если это число не указано, то значение по умолчанию равно 1 для изменений среднего значения и 2 для других изменений.

Пример: findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',1) возвращает пять индексов.

Пример: findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',3) возвращает два индекса.

Пример: findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',5) не возвращает индексы.

Типы данных: single | double

Минимальное улучшение общей остаточной ошибки для каждой точки перехода, указанной как пара, разделенная запятыми, состоящая из 'MinThreshold' и действительный скаляр, представляющий собой штраф. Эта опция используется для ограничения количества возвращенных существенных изменений путем применения дополнительного штрафа к каждой предполагаемой точке перехода. Невозможно указать 'MinThreshold' и 'MaxNumChanges' одновременно.

Пример: findchangepts([0 1 2],'MinThreshold',0) возвращает два индекса.

Пример: findchangepts([0 1 2],'MinThreshold',1) возвращает один индекс.

Пример: findchangepts([0 1 2],'MinThreshold',2) не возвращает индексы.

Типы данных: single | double

Выходные аргументы

свернуть все

Местоположения точек перехода, возвращаемые как вектор целочисленных индексов.

Остаточная ошибка сигнала относительно смоделированных изменений, возвращаемая в виде вектора.

Подробнее

свернуть все

Обнаружение точек перехода

Точка изменения - это выборка или момент времени, в который некоторое статистическое свойство сигнала резко изменяется. Рассматриваемым свойством может быть среднее значение сигнала, его дисперсия или спектральная характеристика.

Чтобы найти точку изменения сигнала, findchangepts использует параметрический глобальный метод. Функция:

  1. Выбирает точку и разделяет сигнал на две секции.

  2. Вычисляет эмпирическую оценку требуемого статистического свойства для каждого раздела.

  3. В каждой точке раздела измеряет, насколько свойство отклоняется от эмпирической оценки. Добавление отклонений для всех точек.

  4. Добавляет раздел отклонений в раздел, чтобы найти общую остаточную ошибку.

  5. Изменяет расположение точки деления до тех пор, пока общая остаточная ошибка не достигнет минимума.

Процедура наиболее ясна, когда выбранная статистика является средней. В этом случае findchangepts минимизирует общую остаточную ошибку от «наилучшего» горизонтального уровня для каждой секции. Учитывая сигнал x1, x2,..., xN и среднее значение подпоследовательности и дисперсию

среднее ([xm⋯xn]) =1n−m+1∑r=mnxr,var ([xm⋯xn]) =1n−m+1∑r=mn (xr среднее ([xm⋯xn])) 2≡Sxx'mnn−m+1,

где сумма квадратов

Sxy'mn≡∑r=mn (xr среднее ([xm⋯xn])) (yr среднее ([ym⋯yn])),

findchangepts находит k таким, что

J=∑i=1k−1 (xi среднее ([x1⋯xk−1])) 2+∑i=kN (xi среднее ([xk⋯xN])) 2 = (k 1) var ([x1⋯xk−1]) + (N − k + 1) var ([xk⋯xN])

является наименьшим. Этот результат можно обобщить, включив в него другие статистические данные. findchangepts находит k таким, что

J (k) = ∑i=1k−1Δ (xi; χ ([x1⋯xk−1])) + ∑i=kNΔ (xi; χ ([xk⋯xN]))

является наименьшим, учитывая эмпирическую оценку сечений startи измерение отклонения Δ.

Минимизация остаточной ошибки эквивалентна максимизации логарифмической вероятности. Учитывая нормальное распределение со средним λ и дисперсией start2, логарифмическое правдоподобие для N независимых наблюдений равно

log∏i=1N12πσ2e− (xi λ) 2/2start2 = − N2 (log2δ + logλ 2) −12σ2∑i=1N (xi − λ) 2.

  • Если 'Statistic' указывается как 'mean', отклонение является фиксированным, и функция использует

    ∑i=mnΔ (xi; start( [xm⋯xn]) |) =∑i=mn (xi среднее ([xm⋯xn])) 2 = (n m + 1) var ([xm⋯xn]),

    как получено ранее.

  • Если 'Statistic' указывается как 'std', среднее является фиксированным, и функция использует

    ∑i=mnΔ (xi; ([xm⋯xn])) = (n m + 1) log∑i=mnσ2 ([xm⋯xn]) = (n m + 1) log (1n−m+1∑i=mn (xi среднее ([xm⋯xn])) 2) = (n − m + 1) logvar ([xm⋯xn]).

  • Если 'Statistic' указывается как 'rms', общее отклонение такое же, как для 'std' но со средним значением, равным нулю:

    ∑i=mnΔ (xi; start( [xm⋯xn])) = (n m + 1) log (1n−m+1∑r=mnxr2).

  • Если 'Statistic' указывается как 'linear'функция использует в качестве полного отклонения сумму квадратичных разностей между значениями сигнала и предсказаниями линейной аппроксимации наименьших квадратов через значения. Эта величина также известна как сумма ошибок квадратов, или SSE. Линия наилучшего соответствия через xm, xm + 1,..., xn

    x ^ (t) = Sxt 'mnStt' mn (t среднее ([tm⋯tn])) + среднее ([xm⋯xn])

    и SSE

    ∑i=mnΔ (xi; start( [xm⋯xn])) =∑i=mn (xi x ^ (ti)) 2 = Sxx 'mn Sxt2 | mnStt' mn = (n m + 1) var ([xm⋯xn]) (∑i=mn (xi mean ([xm⋯xn])) (i mean ([mm+1⋯n])) 2 (n − m + 1) var ([mm+1⋯n]).

Сигналы, представляющие интерес, часто имеют более одной точки изменения. Обобщение процедуры является простым, когда известно количество точек перехода. Если число неизвестно, необходимо добавить штрафной термин к остаточной ошибке, так как добавление точек изменения всегда уменьшает остаточную ошибку и приводит к переоборудованию. В крайнем случае каждая точка становится точкой изменения, и остаточная ошибка исчезает. findchangepts использует штрафной термин, который линейно растет с числом точек перехода. Если есть K точек изменения, которые должны быть найдены, то функция минимизирует

J (K) =∑r=0K−1 ∑i=krkr+1−1Δ (xi; start( [xkr⋯xkr+1−1])) + βK,

где k0 и kK являются соответственно первой и последней выборкой сигнала.

  • Константа пропорциональности, обозначаемая β и указанная в 'MinThreshold', соответствует фиксированному штрафу, добавленному для каждой точки перехода. findchangepts отклоняет добавление дополнительных точек изменения, если уменьшение остаточной ошибки не соответствует пороговому значению. Набор 'MinThreshold' в ноль, чтобы вернуть все возможные изменения.

  • Если вы не знаете, какой порог использовать, или имеете приблизительное представление о количестве точек перехода в сигнале, укажите 'MaxNumChanges' вместо этого. Эта опция постепенно увеличивает порог, пока функция не обнаружит меньше изменений, чем указанное значение.

Чтобы выполнить саму минимизацию, findchangepts использует исчерпывающий алгоритм, основанный на динамическом программировании с ранним отказом.

Ссылки

[1] Киллик, Ребекка, Пол Фейрнхед и Идрис Экли. «Оптимальное обнаружение точек изменений с линейной вычислительной стоимостью». Журнал Американской статистической ассоциации. Т. 107, № 500, 2012, стр. 1590-1598.

[2] Лавилль, Марк. «Использование штрафных контрастов для проблемы точки изменения». Обработка сигналов. Том 85, август 2005, стр. 1501-1510.

См. также

Представлен в R2016a