On Thu, Nov 21, 2013 at 10:24:00AM -0600, Miguel Beltran R. wrote: > Hola lista, > > En mi trabajo me pidieron que hiciera un sistema que detectara similitud en > unos datos para revisar que no nos esten engañando. Se supone que con un > analizador se toman lecturas de diferentes vehiculos pero en ocasiones > ciertas personas usan un mismo vehiculo para ser analizado en lugar del que > se capturo, es decir en lugar los datos de V1, V2 y V3 tengo realmente los > datos V1, V1 y V1. Los datos nunca son iguales pero si son similares. Saludos,
Por lo que veo entonces, tienes dos vectores de datos: V1 = (a1, b1, c1, d1) V2 = (a2, b2, c2, d2) y quieres comparar qué tan similares son. Algo simple que puedes hacer es tomar esos dos vectores como puntos en un espacio de 4 dimensiones, y calcular la distancia ordinaria entre esos dos puntos, de tal forma que: distancia(V1, V2) = raiz((a1 - a2)^2 + (b1 - b2)^2 + (c1 - c2)^2 + (d1 - d2)^2) donde «raiz» denota la función raíz cuadrada, y «^2» denota la potencia cuadrática. Mira, aquí se explica el asunto con un poco más de detalle: http://es.wikipedia.org/wiki/Distancia_euclidiana > > La estructura de los datos es basicamente así: > > campo - valor - descripcion > ID - 1 - quien genera los datos (unos 600 analizadores) > año - 2007 - año del vehiculo que se supone se esta midiendo. Mayor año, > menor el valor de a1. > modelo - UNO - identificador del vehiculo > a1 - 11.0 - dato1 > b1 - 0.03 - dato2 > c1 - 14.9 - dato3 > d1 - 0.30 - dato4 > a2 - 13.0 - dato1 medido en otras condiciones > b2 - 0.04 - dato2 medido en otras condiciones > c2 - 14.8 - dato3 medido en otras condiciones > d2 - 0.30 - dato4 medido en otras condiciones Por el momento no tengo una estructura de datos similar para mostrarte cómo lo haría con Postgres, pero una simple línea de comandos con la calculadora «bc» muestra su funcionamiento: [dualbus@x ~]$ bc -l <<< 'a1 = 11.0; b1 = 0.03; c1 = 14.9; d1 = 0.3; a2 = 13.0; b2 = 0.04; c2 = 14.8; d2 = 0.3; sqrt((a1 - a2)^2 + (b1 - b2)^2 + (c1 - c2)^2 + (d1 - d2)^2)' 2.00252340810288657159 [dualbus@x ~]$ bc -l <<< 'a1 = 10.0; b1 = 0.035; c1 = 13.8; d1 = 0.36; a2 = 13.0; b2 = 0.04; c2 = 14.8; d2 = 0.3; sqrt((a1 - a2)^2 + (b1 - b2)^2 + (c1 - c2)^2 + (d1 - d2)^2)' 3.16285077106081626779 Si te fijas, solo son asignaciones de variable, y al final aplico la fórmula para la distancia. En el primer caso, son los puntos que tú usaste de ejemplo, y en el segundo caso los modifiqué para hacerlos «más diferentes». En el primer caso dió una distancia de 2 (menos diferentes), y en el segundo caso una distancia de 3.16. Puedes experimentar con diferentes distancias, para ver cuál es la suficiente para detectar esas mediciones duplicadas. Incluso, puedes asignar pesos a las variables para que un cambio en una variable importante tenga más efecto sobre la distancia. Algo así: V1 = (a, b) V2 = (x, y) distancia_peso(V1, V2) = raiz(((a - x)/20)^2 + (b - y)^2) Si notas, ahora la primera dimensión («a» y «x») es menos sensible al cambio, por lo que detectará como similares valores que antes no detectaba. -- Eduardo Alan Bustamante López - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda