2011-06-21 20 views
5

Tengo dos conjuntos de datos en el momento (en forma de vectores) y los represento en el mismo eje para ver cómo se relacionan entre sí, y específicamente observo y busco lugares donde ambos gráficos tienen una forma similar (es decir, lugares donde ambos tienen un gradiente aparentemente positivo/negativo en aproximadamente los mismos intervalos). Ejemplo:Proceso para comparar dos conjuntos de datos

enter image description here

Hasta ahora he estado trabajando a través de los datos de forma gráfica, pero se da cuenta que, dado que la cantidad de los datos es tan grande unir cada vez que quiera comprobar cómo dos conjuntos correlacionan de forma gráfica que tomará demasiado mucho tiempo.

¿Hay alguna idea, scripts o funciones que puedan ser útiles para automatizar este proceso de alguna manera?

+2

dependiendo de la naturaleza de los datos, recomendaría hacer análisis de frecuencia usando la función FFT. (¡Asegúrese de entender cómo escalar sus datos correctamente en el dominio de FFT!) alternativamente usar algo tan simple como el error cuadrático medio podría ser útil. Si puede decir más sobre la naturaleza y el origen de los datos, podríamos brindarle un mejor consejo. –

+0

@thron Tenga en cuenta que para obtener lo que quiere, necesita encontrar la similitud en la fase, no solo la frecuencia entre las dos señales. Eso no es trivial. –

Respuesta

5

Lo primero que debe tener en cuenta es la naturaleza de los criterios que desea aplicar para establecer la similitud. Hay una gran variedad de formas de medir la similitud y, con mayor precisión, puede describir lo que desea que signifique "similar" en su problema, lo más fácil será implementarlo independientemente del lenguaje de programación.

Dicho esto, he aquí algo de lo que podría mirar:

  • correlación de los dos conjuntos de datos
  • diferencia de la derivada de los conjuntos de datos (pero no creo que sería lo suficientemente robusta)
  • análisis espectral como lo mencionan en @thron de tres
  • etc ...

Conocer el origen de los conjuntos de datos y su variabilidad también puede ayudar mucho en la formulación de algoritmos suficientemente robustos.

1

Sure. Llame a sus dos vectores A y B.

1) (Opcional) Alise sus datos con un simple filtro de promedio (Matlab 'smooth') o el comando 'filter'. Esto eliminará los cambios locales en la velocidad ("gradiente") que parecen ser esencialmente ruido (como en el componente ascendente de la traza roja.

2) Diferencie A y B. Ahora está representando directamente la velocidad de cada vector (Matlab 'diff').

3) Agregue los dos vectores diferenciados juntos (elemento-sabio). Llame a este C.

4) Busque todos los puntos en C cuyo valor absoluto esté por encima de un cierto umbral (tendrá que observar los datos para tener una buena idea de lo que debería ser). Los puntos por encima de este umbral indican una velocidad muy similar.

5) Ahora busque dónde un valor positivo alto en C va seguido de un valor negativo alto, o viceversa. Entre estos dos puntos, tendrá curvas similares en A y B.

Nota: a) Podría realizar el suavizado después del paso 3 en lugar del paso 1. b) Re 5), podría tener una situación en la que una "colina" en sus datos está en el borde del vector y, por lo tanto, se "corta por la mitad", y los vectores descienden a la línea de base antes de ascender en la siguiente colina. Entonces 5) identificaría erróneamente la colina como entre el descenso inicial y el ascenso posterior. Para evitar esto, también podría requerir que los puntos en A y B entre los dos puntos de similitud de velocidad tengan valores absolutos altos.

+0

¡Gracias, parece una ruta muy interesante! – user718531

Cuestiones relacionadas