findchangepts

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

Синтаксис

ipt = findchangepts(x)
ipt = findchangepts(x,Name,Value)
[ipt,residual] = findchangepts(___)
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) задает аргументы пары "имя-значение" использования дополнительных опций. Опции включают количество changepoints, чтобы сообщить и статистическая величина, чтобы измериться вместо среднего значения. Смотрите Обнаружение точек изменения для получения дополнительной информации.

пример

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

пример

findchangepts(___) без графиков выходных аргументов сигнал и любой обнаружили 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)

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

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

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

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
findchangepts(t,'MaxNumChanges',5)

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

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

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

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

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

load mtlb

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

numc = 5;

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

         132
         778
        1646
        2500
        3454

r = -4.4055e+03

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

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

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

% 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)

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

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

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

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

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

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

Сгенерируйте двумерную, кривую 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:')

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

findchangepts(crv','MaxNumChanges',3)

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

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

Сгенерируйте и постройте 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')

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

view([0 0 1])

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

findchangepts(crv','MaxNumChanges',3)

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

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

Входные параметры

свернуть все

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

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

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

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

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

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

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

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

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

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

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

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

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

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

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

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

Минимальное количество выборок между changepoints, заданным как пара, разделенная запятой, состоящая из '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

Минимальное улучшение общей остаточной ошибки для каждого changepoint, заданного как пара, разделенная запятой, состоящая из 'MinThreshold' и действительного скаляра, который представляет штраф. Эта опция действует, чтобы ограничить количество возвращенных существенных изменений путем применения дополнительного штрафа каждому предполагаемому 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, функция находит k таким образом что

J=i=1k1(xix1k1)2+i=kN(xixkN)2=i=1k1(xi1k1r=1k1xr)2+i=kN(xi1Nk+1r=kNxr)2=(k1)var([x1xk1])+(Nk+1)var([xkxN]),

является самым маленьким. Среднее значение и отклонение имеют обычные определения. (Отклонение нормировано количеством выборок, не вычитая 1.)

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

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

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

журналi=1N12πσ2e(xiμ)2/2σ2=N2(журнал2π+журналσ2)12σ2i=1N(xiμ)2.

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

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

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

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

    i=mnΔ(xi;χ([xmxn]))=(nm+1)журналi=mnσ2([xmxn])=(nm+1)журнал(1nm+1i=mn(xi1nm+1r=mnxr)2)=(nm+1)журналvar([xmxn]).

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

    i=mnΔ(xi;χ([xmxn]))=(nm+1)журнал(1nm+1r=nmxr2).

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

    i=mnΔ(xi;χ([xmxn]))=(nm+1)var([xmxn])(i=mn(xiμ([xmxn]))(iμ([mm+1n])))2(nm+1)var([mm+1n])SxxSxt2Stt.

Сигналы интереса часто имеют больше чем один 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] Lavielle, Марк. “Используя оштрафованные контрасты для проблемы точки перехода”. Обработка сигналов. Издание 85, август 2005, стр 1501–1510.

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

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

Введенный в R2016a