Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

findchangepts

Encuentra cambios bruscos en la señal

Descripción

ejemplo

ipt = findchangepts(x) devuelve el índice en el que la media de los cambios es más significativa.x

  • Si es un vector con elementos, se divide en dos regiones y , que minimizan la suma del error residual (cuadrado) de cada región de su media local.xNfindchangeptsxx(1:ipt-1)x(ipt:N)

  • Si es una matriz -por-, a continuación, particiones en dos regiones y , devolver el índice de columna que minimiza la suma del error residual de cada región de su media dimensional local.xMNfindchangeptsxx(1:M,1:ipt-1)x(1:M,ipt:N)M

ejemplo

ipt = findchangepts(x,Name,Value) especifica opciones adicionales mediante argumentos de par nombre-valor. Las opciones incluyen el número de puntos de cambio que se han de notificar y la estadística que se debe medir en lugar de la media. Consulte para obtener más información.Detección de puntos de cambio

ejemplo

[ipt,residual] = findchangepts(___) también devuelve el error residual de la señal contra los cambios modelados, incorporando cualquiera de las especificaciones anteriores.

ejemplo

findchangepts(___) sin argumentos de salida traza la señal y los puntos de cambio detectados. Consulte para obtener más información.'Statistic'

Ejemplos

contraer todo

Cargue un archivo de datos que contenga una grabación de un silbato de tren muestreado a 8192 Hz. Encuentre los 10 puntos en los que el nivel de la media-cuadrada de la señal cambia más significativamente.

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

Calcular la densidad espectral de potencia de corto tiempo de la señal. Divida la señal en segmentos de 128 muestras y aletee cada segmento con una ventana Hamming. Especifique 120 muestras de superposición entre segmentos adyacentes y 128 puntos DFT. Encuentra los 10 puntos en los que la media de la densidad espectral de potencia cambia más significativamente.

[s,f,t,pxx] = spectrogram(y,128,120,128,Fs);  findchangepts(pow2db(pxx),'MaxNumChanges',10)

Restablezca el generador de números aleatorios para obtener resultados reproducibles. Genere una señal aleatoria donde:

  • La media es constante en cada una de las siete regiones y cambia abruptamente de una región a otra.

  • La varianza es constante en cada una de las cinco regiones y cambia abruptamente de una región a otra.

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;

Trazar la señal, destacando los pasos de su construcción.

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

Encuentra los cinco puntos donde la media de la señal cambia más significativamente.

figure findchangepts(t,'MaxNumChanges',5)

Encuentre los cinco puntos donde el nivel de la media-cuadrada de la señal cambia más significativamente.

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

Encuentre el punto donde la media y la desviación estándar de la señal cambian más.

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

Cargue una señal de voz muestreada en

<math display="block">
<mrow>
<msub>
<mrow>
<mi>F</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo>=</mo>
<mn>7</mn>
<mn>4</mn>
<mn>1</mn>
<mn>8</mn>
<mspace width="0.2777777777777778em"></mspace>
<mstyle mathvariant="normal">
<mrow>
<mi>H</mi>
<mi>z</mi>
</mrow>
</mstyle>
</mrow>
</math>
. El archivo contiene una grabación de una voz femenina que dice la palabra "MATLAB®."

load mtlb

Discernir las vocales y consonantes en la palabra mediante la búsqueda de los puntos en los que la varianza de la señal cambia significativamente. Limite el número de puntos de cambio a cinco.

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

         132
         778
        1646
        2500
        3454

r = -4.4055e+03 

Trazar la señal y mostrar los puntos de cambio.

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

Para reproducir el sonido con una pausa después de cada uno de los segmentos, quite el comentario de las siguientes líneas.

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

Crear una señal que consta de dos sinusoides con amplitud variable y una tendencia lineal.

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;

Encuentre los puntos donde la media de la señal cambia más significativamente. El par nombre-valor es opcional en este caso.'Statistic' Especifique una mejora mínima de error residual de 1.

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

Encuentre los puntos donde el nivel de la media-cuadrada de la señal cambia más. Especifique una mejora mínima de error residual de 6.

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

Encuentre los puntos donde la desviación estándar de la señal cambia más significativamente. Especifique una mejora mínima de error residual de 10.

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

Encuentra los puntos donde la media y la pendiente de la señal cambian más abruptamente. Especifique una mejora mínima de error residual de 0,6.

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

Genere una curva Bézier bidimensional de 1000 muestras con 20 puntos de control aleatorios. Una curva de Bézier se define por:

<math display="block">
<mrow>
<mi>C</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<munderover>
<mrow>
<mo></mo>
</mrow>
<mrow>
<mi>k</mi>
<mo>=</mo>
<mn>0</mn>
</mrow>
<mrow>
<mi>m</mi>
</mrow>
</munderover>
<mrow>
<mrow>
<mo>(</mo>
<mfrac linethickness="0">
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</mfrac>
<mo>)</mo>
</mrow>
</mrow>
<msup>
<mrow>
<mi>t</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msup>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>-</mo>
<mi>t</mi>
<msup>
<mrow>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>-</mo>
<mi>k</mi>
</mrow>
</msup>
<msub>
<mrow>
<mi>P</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</msub>
</mrow>
</mstyle>
</mrow>
</math>
,

Dónde

<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">P</mi>
</mrow>
<mrow>
<mi mathvariant="italic">k</mi>
</mrow>
</msub>
</mrow>
</math>
es el
<math display="inline">
<mrow>
<mi mathvariant="italic">k</mi>
</mrow>
</math>
th de
<math display="inline">
<mrow>
<mi mathvariant="italic">m</mi>
</mrow>
</math>
puntos de control,
<math display="inline">
<mrow>
<mi mathvariant="italic">t</mi>
</mrow>
</math>
oscila entre 0 y 1, y
<math display="block">
<mrow>
<mrow>
<mo>(</mo>
<mfrac linethickness="0">
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>k</mi>
</mrow>
</mfrac>
<mo>)</mo>
</mrow>
</mrow>
</math>
es un coeficiente binomial. Trazar la curva y los puntos de control.

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:')

Particione la curva en tres segmentos, de forma que los puntos de cada segmento estén a una distancia mínima de la media del segmento.

findchangepts(crv','MaxNumChanges',3)

Particione la curva en 20 segmentos que mejor se ajusten por líneas rectas.

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

Genere y trace una curva Bézier tridimensional con 20 puntos de control aleatorios.

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

Visualice la curva desde arriba.

view([0 0 1])

Particione la curva en tres segmentos, de forma que los puntos de cada segmento estén a una distancia mínima de la media del segmento.

findchangepts(crv','MaxNumChanges',3)

Particione la curva en 20 segmentos que mejor se ajusten por líneas rectas.

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

Argumentos de entrada

contraer todo

Señal de entrada, especificada como un vector real.

Ejemplo: es una señal aleatoria con dos cambios abruptos en la media.reshape(randn(100,3)+[-3 0 3],1,300)

Ejemplo: es una señal aleatoria con dos cambios abruptos en el nivel de root-mean-square.reshape(randn(100,3).*[1 20 5],1,300)

Tipos de datos: single | double

Argumentos de par nombre-valor

Especifique pares opcionales separados por comas de argumentos. es el nombre del argumento y es el valor correspondiente. deben aparecer entre comillas.Name,ValueNameValueName Puede especificar varios argumentos de par de nombre y valor en cualquier orden como .Name1,Value1,...,NameN,ValueN

Ejemplo: encuentra hasta tres puntos donde los cambios en el nivel de la media de la raíz son más significativos y donde los puntos están separados por al menos 20 muestras.'MaxNumChanges',3,'Statistic','rms','MinDistance',20

Número máximo de cambios significativos que se devolverán, especificados como el par separado por comas que consta de un escalar entero y un escalar entero.'MaxNumChanges' Después de encontrar el punto con el cambio más significativo, afloja gradualmente su criterio de búsqueda para incluir más puntos de cambio sin exceder el máximo especificado.findchangepts Si cualquier configuración de búsqueda devuelve más que el máximo, la función no devuelve nada. Si no se especifica, la función devuelve el punto con el cambio más significativo.'MaxNumChanges' No se puede especificar y simultáneamente.'MinThreshold''MaxNumChanges'

Ejemplo: devuelve el índice de la segunda muestra.findchangepts([0 1 0])

Ejemplo: devuelve una matriz vacía.findchangepts([0 1 0],'MaxNumChanges',1)

Ejemplo: devuelve los índices del segundo y tercer punto.findchangepts([0 1 0],'MaxNumChanges',2)

Tipos de datos: single | double

Tipo de cambio que se debe detectar, especificado como el par separado por comas que consta de y uno de estos valores:'Statistic'

  • — Detectar cambios en la media.'mean' Si llama sin argumentos de salida, la función traza la señal, los puntos de cambio y el valor medio de cada segmento declosed por puntos de cambio consecutivos.findchangepts

  • — Detectar cambios en el nivel de root-mean-square.'rms' Si llama sin argumentos de salida, la función traza la señal y los puntos de cambio.findchangepts

  • — Detectar cambios en la desviación estándar, utilizando la probabilidad de registro gaussiana.'std' Si llama sin argumentos de salida, la función traza la señal, los puntos de cambio y el valor medio de cada segmento declosed por puntos de cambio consecutivos.findchangepts

  • — Detectar cambios en la media y la pendiente.'linear' Si llama sin argumentos de salida, la función traza la señal, los puntos de cambio y la línea que mejor se ajusta a cada parte de la señal encerrada por puntos de cambio consecutivos.findchangepts

Ejemplo: devuelve el índice de la segunda muestra.findchangepts([0 1 2 1],'Statistic','mean')

Ejemplo: devuelve el índice de la tercera muestra.findchangepts([0 1 2 1],'Statistic','rms')

Número mínimo de muestras entre puntos de cambio, especificado como el par separado por comas que consta de y un escalar entero.'MinDistance' Si no especifica este número, el valor predeterminado es 1 para los cambios en la media y 2 para otros cambios.

Ejemplo: devuelve cinco índices.findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',1)

Ejemplo: devuelve dos índices.findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',3)

Ejemplo: no devuelve índices.findchangepts(sin(2*pi*(0:10)/5),'MaxNumChanges',5,'MinDistance',5)

Tipos de datos: single | double

Mejora mínima del error residual total para cada punto de cambio, especificado como el par separado por comas que consta de y un escalar real que representa una penalización.'MinThreshold' Esta opción actúa para limitar el número de cambios significativos devueltos aplicando la penalización adicional a cada punto de cambio prospectivo. No se puede especificar y simultáneamente.'MinThreshold''MaxNumChanges'

Ejemplo: devuelve dos índices.findchangepts([0 1 2],'MinThreshold',0)

Ejemplo: devuelve un índice.findchangepts([0 1 2],'MinThreshold',1)

Ejemplo: no devuelve índices.findchangepts([0 1 2],'MinThreshold',2)

Tipos de datos: single | double

Argumentos de salida

contraer todo

Ubicaciones de punto de cambio, devueltas como un vector de índices enteros.

Error residual de la señal contra los cambios modelados, devuelto como vector.

Más acerca de

contraer todo

Detección de puntos de cambio

A es una muestra o un instante de tiempo en el que alguna propiedad estadística de una señal cambia abruptamente.punto de cambio La propiedad en cuestión puede ser la media de la señal, su varianza o una característica espectral, entre otros.

Para encontrar un punto de cambio de señal, emplea un método global paramétrico.findchangepts La función:

  1. Elige un punto y divide la señal en dos secciones.

  2. Calcula una estimación empírica de la propiedad estadística deseada para cada sección.

  3. En cada punto de una sección, mide cuánto se desvía la propiedad de la estimación empírica. Añade las desviaciones para todos los puntos.

  4. Agrega las desviaciones sección a sección para encontrar el error residual total.

  5. Varía la ubicación del punto de división hasta que el error residual total alcance un mínimo.

El procedimiento es más claro cuando la estadística elegida es la media. En ese caso, minimiza el error residual total del nivel horizontal "mejor" para cada sección.findchangepts Dada una señal x1, x2, …, xN, la función encuentra tal quek

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

es más pequeño. La media y la varianza tienen las definiciones habituales. (La varianza se normaliza por el número de muestras, sin restar 1.)

Este resultado se puede generalizar para incorporar otras estadísticas. encuentra tal quefindchangeptsk

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

es más pequeño, dada la estimación empírica de la sección y la medición de desviación.χ Dada una distribución normal con media y varianzaμσ2, la probabilidad de registro para las observaciones independientes esN

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

  • Si se especifica como , entonces la desviación es fija y la función utiliza'Statistic''mean'

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

    como se obtuvo anteriormente.

  • Si se especifica como , entonces la media es fija y la función utiliza'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]).

  • Si se especifica como , la desviación total es la misma que para pero con la media establecida en cero:'Statistic''rms''std'

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

  • Si se especifica como , la función utiliza'Statistic''linear'

    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]).

Las señales de interés a menudo tienen más de un punto de cambio. La generalización del procedimiento es sencilla cuando se conoce el número de puntos de cambio. Cuando se desconoce el número, debe agregar un término de penalización al error residual, ya que agregar puntos de cambio siempre disminuye el error residual y da lugar a un sobreajuste. En el caso extremo, cada punto se convierte en un punto de cambio y el error residual desaparece. utiliza un término de penalización que crece linealmente con el número de puntos de cambio.findchangepts Si hay puntos de cambio que se encuentran, la función minimizaK

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

Dónde k0 Y kK son respectivamente la primera y la última muestra de la señal.

  • La constante de proporcionalidad, indicada por y especificada en , corresponde a una penalización fija agregada para cada punto de cambio. rechaza la adición de puntos de cambio adicionales si la disminución del error residual no cumple el umbral.β'MinThreshold'findchangepts Establézcalo en cero para devolver todos los cambios posibles.'MinThreshold'

  • Si no sabe qué umbral utilizar o tiene una idea aproximada del número de puntos de cambio en la señal, especifique en su lugar.'MaxNumChanges' Esta opción aumenta gradualmente el umbral hasta que la función encuentra menos cambios que el valor especificado.

Para realizar la minimización en sí, utiliza un algoritmo exhaustivo basado en la programación dinámica con abandono temprano.findchangepts

Referencias

[1] Lavielle, Marc. “Using penalized contrasts for the change-point problem.” Signal Processing. Vol. 85, August 2005, pp. 1501–1510.

[2] Killick, Rebecca, Paul Fearnhead, and Idris A. Eckley. “Optimal detection of changepoints with a linear computational cost.” Journal of the American Statistical Association. Vol. 107, No. 500, 2012, pp. 1590–1598.

Consulte también

Introducido en R2016a