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) задает дополнительные опции с помощью аргументов name-value. Опции включают количество changepoints, чтобы сообщить и статистическая величина, чтобы измериться вместо среднего значения. Смотрите Обнаружение точек изменения для получения дополнительной информации.

пример

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

пример

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

Примечание

Перед графическим выводом, findchangepts функция очищается (clf) текущая фигура. Построить сигнал и обнаружило changepoints в подграфике, используйте функцию построения графика. Смотрите Сегментацию Звукового файла.

Примеры

свернуть все

Загрузите файл данных, содержащий запись гудка поезда, произведенного на уровне 8 192 Гц. Найдите 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 objects. Axes object 1 contains 131 objects of type line. Axes object 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 objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Means contains 2 objects of type line. Axes object 3 with title Variances contains 2 objects of type line. Axes object 4 with title Final contains an object of type line.

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

figure
findchangepts(t,'MaxNumChanges',5)

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object with title Number of changepoints = 1 Total log weighted dispersion = 1263.4625 contains 3 objects of type line.

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

load mtlb

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

numc = 5;

[q,r] = findchangepts(mtlb,'Statistic','rms','MaxNumChanges',numc);

Постройте сигнал и отобразите changepoints.

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

Создайте маску сигнала для речевого сигнала на основе changepoint индексов. Смотрите signalMask для получения дополнительной информации об использовании маски сигнала.

t = (0:length(mtlb)-1)/Fs;
roitable = t([[1;q] [q;length(mtlb)]]);
x = ["M" "A" "T" "L" "A" "B"]';
y = unique(x,"stable");
c = categorical(x,y);
src = table(roitable,c);
msk = signalMask(src,"SampleRate",Fs,"RightShortening",1);
roimask(msk)
ans=6×2 table
         roitable          c
    ___________________    _

          0    0.017525    M
    0.01766     0.10461    A
    0.10475     0.22162    T
    0.22176     0.33675    L
    0.33688     0.46535    A
    0.46549     0.53909    B

Постройте речевой сигнал и обнаруженный changepoints в подграфике наряду с необходимыми областями от маски сигнала:

  • В верхнем подграфике используйте plotsigroi функция, чтобы визуализировать области маски сигнала. Настройте настройки, чтобы заставить шкалу палитры появиться наверху графика и отобразить уникальные категории от табличной маски в правильном порядке.

  • В более низком подграфике постройте исходную речь, сигнализируют и добавляют обнаруженный changepoints как вертикальные линии на графике.

subplot(2,1,1)
plotsigroi(msk,mtlb)
    colorbar('off')
    clrs = lines(numel(c)-1);
    cmap = fliplr(clrs);
    tickLbls = categories(c)';
    colormap(gca,clrs);
    numCategories = numel(c)-1;
    Ticks = 1/(numCategories*2):1/numCategories:1;
    colorbar(TickLabels=tickLbls,Ticks=Ticks,TickLength=0,Location='northoutside')
subplot(2,1,2)
plot(t,mtlb)
hold on
xline(q/Fs)
hold off
xlim([0 t(end)])

Figure contains 2 axes objects. Axes object 1 contains 6 objects of type line. Axes object 2 contains 6 objects of type line, constantline.

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

% 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object with title Number of changepoints = 3 Total residual error = 7.9824 contains 3 objects of type line.

Сгенерируйте двумерную, кривую Bézier с 1000 выборками с 20 случайными контрольными точками. Кривая Bézier задана:

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 object. The axes object contains 2 objects of type line.

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

findchangepts(crv','MaxNumChanges',3)

Figure contains 2 axes objects. Axes object 1 contains 5 objects of type line. Axes object 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 objects. Axes object 1 contains 5 objects of type line. Axes object 2 with title Number of changepoints = 19 Total residual error = 0.090782 contains 21 objects of type line.

Сгенерируйте и постройте 3D кривую Bézier с 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 object. The axes object contains 2 objects of type line.

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

view([0 0 1])

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

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

findchangepts(crv','MaxNumChanges',3)

Figure contains 2 axes objects. Axes object 1 contains 7 objects of type line. Axes object 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 objects. Axes object 1 contains 7 objects of type line. Axes object 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 имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

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

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

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

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

Тип изменения, чтобы обнаружить в виде одного из этих значений:

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

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

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

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

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

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

Минимальное количество отсчетов между changepoints в виде целочисленного скаляра. Если вы не задаете этот номер, то значение по умолчанию 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

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

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

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

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

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

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

свернуть все

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

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

Больше о

свернуть все

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

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

Найти сигнал 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]).

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

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

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

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

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

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

Ссылки

[1] Killick, Ребекка, Пол Фирнхэд и Идрис А. Экли. “Оптимальное обнаружение changepoints с линейной вычислительной стоимостью”. Журнал американской Статистической Ассоциации. Издание 107, № 500, 2012, стр 1590–1598.

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

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

Введенный в R2016a