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(___) без выходных аргументов строит график сигнала и любых обнаруженных точек изменения. Для получения дополнительной информации см. раздел «Статистика».

Примеры

свернуть все

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

load train

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

Вычислите кратковременную спектральную плотность степени сигнала. Разделите сигнал на сегменты с 128 выборками и окончите каждый сегмент с Окном Хэмминга. Задайте 120 выборки перекрытия между смежными сегментами и 128 точками ДПФ. Найдите 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=7418Hz. Файл содержит запись женского голоса, говорящего слово «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;

Найдите точки, где средний сигнал изменяется наиболее значительно. The '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 является kth из 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

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

свернуть все

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

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

Подробнее о

свернуть все

Обнаружение точек изменения

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

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

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

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

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

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

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

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

mean([xmxn])=1nm+1r=mnxr,var([xmxn])=1nm+1r=mn(xrmean([xmxn]))2Sxx|mnnm+1,

где sum of squares

Sxy|mnr=mn(xrmean([xmxn]))(yrmean([ymyn])),

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

J=i=1k1(ximean([x1xk1]))2+i=kN(ximean([xkxN]))2=(k1)var([x1xk1])+(Nk+1)var([xkxN])

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

J(k)=i=1k1Δ(xi;χ([x1xk1]))+i=kNΔ(xi;χ([xkxN]))

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

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

logi=1N12πσ2e(xiμ)2/2σ2=N2(log2π+logσ2)12σ2i=1N(xiμ)2.

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

    i=mnΔ(xi;χ([xmxn])|)=i=mn(ximean([xmxn]))2=(nm+1)var([xmxn]),

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

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

    i=mnΔ(xi;χ([xmxn]))=(nm+1)logi=mnσ2([xmxn])=(nm+1)log(1nm+1i=mn(ximean([xmxn]))2)=(nm+1)logvar([xmxn]).

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

    i=mnΔ(xi;χ([xmxn]))=(nm+1)log(1nm+1r=mnxr2).

  • Если 'Statistic' задается как 'linear', функция использует в качестве общего отклонения сумму квадратов различий между значениями сигналов и предсказаниями линейной подгонки методом наименьших квадратов через значения. Эта величина также известна как error sum of squares или SSE. Через наилучшую эмпирическую кривую xm, x m + 1,..., xn есть

    x^(t)=Sxt|mnStt|mn(tmean([tmtn]))+mean([xmxn])

    и SSE является

    i=mnΔ(xi;χ([xmxn]))=i=mn(xix^(ti))2=Sxx|mnSxt2|mnStt|mn=(nm+1)var([xmxn])(i=mn(ximean([xmxn]))(imean([mm+1n])))2(nm+1)var([mm+1n]).

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

J(K)=r=0K1i=krkr+11Δ(xi;χ([xkrxkr+11]))+βK,

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

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

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

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

Ссылки

[1] Killick, Rebecca, Paul Fearnhead, and Idris A. Eckley. «Оптимальное обнаружение точек изменения с линейной вычислительной стоимостью». Журнал Американской статистической ассоциации. Том 107, № 500, 2012, стр. 1590-1598.

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

См. также

Введенный в R2016a