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 имя аргумента и 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' и одно из этих значений:

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

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