7 votos

Ajuste entre dos curvas

Estoy tratando de determinar el ajuste entre dos curvas (ejemplo mostrado a continuación). Ambas curvas están trazadas aquí como un montón de puntos de datos XY (no funciones).

Las curvas representan las trayectorias de dos aviones que ruedan, y estoy tratando de averiguar qué tan lejos están en promedio. (los ejes están en posición x/y en metros)

He hecho correlación y RMSE, pero ninguno de esos realmente es lo que quiero-- los dos aviones están viajando a diferentes velocidades, y por lo tanto una curva tiene muchos más puntos de datos que la otra. Entonces, RMSE es sensible al tiempo, mientras que yo quiero la desviación independiente del tiempo.

Mi siguiente idea es hacer algún tipo de integración, pero no estoy seguro de cómo funcionaría eso ya que las curvas se cruzan frecuentemente.

Como puedes ver, las curvas son bastante similares, así que estoy buscando obtener un número pequeño como resultado... probablemente alrededor de 0-5 metros.

¿Qué tipo de análisis debería estar haciendo aquí?

enter image description here

Un primer plano de la curva: enter image description here

6voto

metavida Puntos 911

Esto es algo así como el análisis de datos de seguimiento de animales que tengo que hacer en el laboratorio. Mi reflejo sería algo así:

Primero define una pista linearizada como sugirió @Iterator. Hago esto definiendo una spline con entre 3 y 20 puntos de control. Puedes ajustar la spline a través de todos tus datos o usar algo absoluto como la forma física de la pista de taxi, o la ruta óptima que produciría un taxiado perfecto según el libro de texto. Sea lo que sea que elijas, llamémoslo la ruta de referencia.

Luego muestrea densamente esa spline: encuentra unos 100,000 puntos más o menos a lo largo de la spline espaciados uniformemente de principio a fin.

Luego, para cada punto en el tiempo, y para cada trayectoria, determina dos cosas: (x) la identidad del punto a lo largo de la ruta de referencia que está más cerca de la posición XY del avión en ese punto en el tiempo, y (y) la distancia euclidiana entre el punto de datos instantáneo y ese punto de spline más cercano. Graficar y como una función de x te da un gráfico de la distancia entre el avión y la ruta de referencia, por la distancia a lo largo de esa ruta.

Si defines tu ruta de referencia como la spline a través de la trayectoria del Avión A, y haces el gráfico descrito anteriormente para el Avión B con respecto a esa ruta, tendrás la distancia entre los aviones como una función de su curso a lo largo de la pista, independientemente del tiempo.

Aquí tienes algo de código comentado que hace el truco. Funciona en mi ordenador con los datos de prueba aquí.

% Script para determinar la distancia entre 2 rutas en función
% de la distancia a lo largo de la primera ruta
%
% La Ruta 1 se utiliza para ajustar una spline. Esa spline se interpola densamente
% Para un punto dado a lo largo de la Ruta 2, se buscan los puntos de interpolación de la Ruta 1
% para encontrar el que tiene la distancia euclidiana más baja. La distancia al
% punto de interpolación de la Ruta 1 MÁS CERCANO a lo largo de la Ruta 1 es la 'distancia a la ruta de referencia' de esos puntos de la Ruta 2,
% y la distancia entre el punto de interpolación y el punto de la Ruta 2 es la 'desviación de la ruta de referencia'
%
% Debido a que los puntos a lo largo de la Ruta 1 no se están moviendo monótonamente desde el
% inicio de la ruta hasta el final, para ajustar una spline suave sobre
% la Ruta 1, hago que el usuario haga clic en puntos de control de spline sobre la Ruta 1. A
% se ajusta una spline temporal a los puntos clicados por el usuario, y se utiliza la spline temporal para dividir los datos de la Ruta 1 en pequeños grupos de datos. La
% centroid de cada grupo se toma como un punto de control para construir una Ruta 1
% spline.

%% Cargar datos. La ruta1 y la ruta2 son cada dos matrices n \[x\_data; y\_data\] %%
load pos\_data.mat ruta1 ruta2;

%% Graficar datos en bruto y obtener puntos de spline del usuario %%
figure; trazar(ruta1(1,:), ruta1(2,:), 'b'); % Primera ruta
hold on; trazar(ruta2(1,:), ruta2(2,:), 'r'); % Segunda ruta
\[spl\_x, spl\_y\] = getpts();                % Clics del ratón para definir la spline
user\_path = \[spl\_x'; spl\_y'\];             % Reorganizar al mismo formato que ruta1,2

%% Crear spline a partir de los puntos del usuario %%
n\_xx = 100;                        % n\_xx puntos de interpolación para la spline temporal
n\_x = size(user\_path,2);           % n\_x muestras, 2 valores cada uno
xx\_t = linspace(0,1,n\_xx);         % los interpolantes
x\_t  = linspace(0,1,n\_x);          % el parámetro para nuestra función paramétrica del tiempo
yy\_t = spline(x\_t,user\_path,xx\_t); % yy son los puntos a lo largo de la ruta en xx
plot( yy\_t(1,:), yy\_t(2,:), '.b', 'LineWidth', 4 );

%% Dividir los puntos de la Ruta 1 en grupos por el punto de interpolación temporal más cercano %%
% Para cada punto de la Ruta 1, encuentra el punto temporal de spline más cercano
TRI = delaunay( yy\_t(1,:), yy\_t(2,:) );
índice = dsearch( yy\_t(1,:), yy\_t(2,:), TRI, ruta1(1,:), ruta1(2,:) );
ruta1\_x = zeros(2,n\_xx);  % hacer 1 punto de control de spline de la Ruta 1 para cada grupo de puntos de la Ruta 1

% hay n\_xx contenedores para puntos en Ruta 1. Determine los n\_xx centroides
% de los grupos de puntos que caen en cada uno de esos contenedores.
para n = 1:n\_xx
    ruta1\_x(:,n) = \[ mean(ruta1(1, índice==n)); ...
                      mean(ruta1(2, índice==n))\];
end

%% Usa los centroides recién obtenidos como puntos de control de una 'spline de ruta 1'. %%
n\_xx = 1000;                        % muestrearemos densamente la spline de ruta 1
n\_x  = size(ruta1\_x,2);             % aunque solo tengamos 50 puntos de control para la spline de ruta 1
xx\_p1 = linspace(0, 1, n\_xx);       % dónde interpolarse en la spline de ruta 1
x\_p1   = linspace(0, 1, n\_x);        % el parámetro: distancia a lo largo de la spline temporal
yy\_p1 = spline(x\_p1, ruta1\_x, xx\_p1); % coordenadas x e y de la spline a lo largo de la ruta 1
figura; trazar( ruta1(1,:), ruta1(2,:), '.', 'TamañoDelMarcador', 10);
sostener; trazar( yy\_p1(1,:), yy\_p1(2,:), '-');

%% 'Linearizar' la Ruta 2 encontrando el punto más cercano a lo largo de la spline de la Ruta 1 para cada punto de la Ruta 2. %%
TRI = delaunay( yy\_p1(1,:), yy\_p1(2,:) );
índice = dsearch( yy\_p1(1,:), yy\_p1(2,:), TRI, ruta2(1,:), ruta2(2,:));

ruta2\_dist\_a lo largo = xx\_p1(1,índice);  % distancia a lo largo de la spline de ruta 1 para cada punto de la Ruta 2
                                  % es simplemente el valor de interpolación de la
                                  % spline de ruta 1

% la desviación es la distancia euclidiana entre cada punto de la Ruta 2 y su
% homólogo de la spline de ruta 1 más cercano
desviación ruta2 = sqrt((ruta2(1,:) - yy\_p1(1,índice)).^2 + (ruta2(2,:) - yy\_p1(2,índice)).^2);

figura; trazar(ruta2\_dist\_a lo largo, desviación ruta2,'.');

Mis rutas no son bonitas y uniformes como las tuyas :/ Situación actual de seguimiento de animales. Así que hay una solución alternativa para ajustar una spline a esos datos en bruto algo desordenados.

Gráfico de posiciones x e y en la ruta1 y ruta2

Y aquí está el resultado del script.

Desviación de la ruta como función de la distancia a lo largo de la Ruta1

PD: si eso se representara como un gráfico de líneas en lugar de un diagrama de dispersión, verías que los puntos no están en orden a lo largo del eje x, y el eje x no está muestreado uniformemente. Esto podría solucionarse con alguna combinación de interpolación y suavizado creo, pero la solución probablemente depende de cómo quieras que se formatée tu salida, así que no lo codifiqué.

Intenté hacer que el código fuera claro, pero por favor avísame si algo es confuso. Pregunta divertida en la que trabajar, gracias.

3voto

Nikos Alexandris Puntos 764

Mi sugerencia es reescalar los puntos para que sean proporciones de la longitud del arco (la curva). En ese punto, puedes mirar interpolaciones, como (0,0.01, ..., 1.00) de la longitud del arco y comparar la correlación, o lo que sea.

Sin embargo, una pregunta más interesante podría ser las relaciones entre el gradiente de movimiento, especialmente cerca del giro. Creo que un gráfico de eso podría ser muy interesante.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X