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 más significativamente.x

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

  • Si es una-por-matriz, 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 reportará y la estadística a 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 raíz media cuadrada de la señal cambia más significativamente.

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

Calcule la densidad espectral de potencia a corto plazo de la señal. Divida la señal en segmentos de 128 muestras y ventana cada segmento con una ventana de 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 una.

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

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

Encuentre 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 raíz-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 encontrando 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 

Trace la señal y visualice 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 consista en 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 señal media 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 raíz-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 del error residual de 10.

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

Encuentre 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 mediante:

<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 con antelación
<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. Trace 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:')

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

Particionar la curva en 20 segmentos que encajan mejor con líneas rectas.

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

Genere y trace una curva de 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])

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

Particionar la curva en 20 segmentos que encajan mejor con 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 bruscos en la media.reshape(randn(100,3)+[-3 0 3],1,300)

Ejemplo: es una señal aleatoria con dos cambios bruscos en el nivel de la raíz media cuadrada.reshape(randn(100,3).*[1 20 5],1,300)

Tipos de datos: single | double

Argumentos de par nombre-valor

Especifique pares de argumentos separados por comas opcionales. es el nombre del argumento y es el valor correspondiente. deben aparecer dentro de las cotizaciones.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 en los que los cambios en el nivel de la media cuadratura 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 devuelven, especificados como el par separado por comas que consta de un escalar entero.'MaxNumChanges' Después de encontrar el punto con el cambio más significativo, gradualmente afloja 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 del segundo ejemplo.findchangepts([0 1 0])

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

Ejemplo: Devuelve los índices de los puntos segundo y tercero.findchangepts([0 1 0],'MaxNumChanges',2)

Tipos de datos: single | double

Tipo de cambio que se ha de detectar, especificado como el par separado por comas que consta de 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 encerrado por puntos de cambio consecutivos.findchangepts

  • — Detectar cambios en el nivel de la raíz media cuadrada.'rms' Si llama sin argumentos de salida, la función traza la señal y los puntos de cambio.findchangepts

  • — Detecte los cambios en la desviación estándar, utilizando el log-verosimilitud gaussiano.'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 encerrado por puntos de cambio consecutivos.findchangepts

  • — Detectar cambios en la media y en 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 adapte a cada porción de la señal encerrada por puntos de cambio consecutivos.findchangepts

Ejemplo: Devuelve el índice del segundo ejemplo.findchangepts([0 1 2 1],'Statistic','mean')

Ejemplo: Devuelve el índice del tercer ejemplo.findchangepts([0 1 2 1],'Statistic','rms')

Número mínimo de muestras entre los puntos de cambio, especificados como el par separado por comas que consta de 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 en el error residual total para cada punto de cambio, especificado como el par separado por comas consistente en 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, devueltos como vector.

Más acerca de

contraer todo

Detección de puntos de cambio

A es una muestra o tiempo instantáneo en el que alguna propiedad estadística de una señal cambia abruptamente.changepoint La propiedad en cuestión puede ser la media de la señal, su varianza o una característica espectral, entre otras.

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. Añade 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 alcanza 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(xix1k1)2+i=kN(xixkN)2=i=1k1(xi1k1r=1k1xr)2+i=kN(xi1Nk+1r=kNxr)2=(k1)var([x1xk1])+(Nk+1)var([xkxN]),

es más pequeño. La media y la varianza tienen las definiciones usuales. (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 sección estimación empírica y la medida de desviación Δ. minimizar el error residual equivale a maximizar la probabilidad de registro.χ Dada una distribución normal con media y varianzaμσ2, la log-verosimilitud para observaciones independientes esN

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

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

    i=mnΔ(xi;χ([xmxn])|)=i=mn(xiμ([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(xi1nm+1r=mnxr)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=nmxr2).

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

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

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 añadir un término de penalización al error residual, ya que la adición de puntos de cambio siempre disminuye el error residual y da como resultado un sobreajuste. En el caso extremo, cada punto se convierte en un punto de cambio y se desvanece el error residual. 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, denotada y especificada en, corresponde a una penalización fija añadida 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 Se establece 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, especifíquese 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 programación dinámica con abandono anticipado.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