Re: OT Detectar similitud de datos

From: Eduardo A(dot) Bustamante López <dualbus(at)gmail(dot)com>
To: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: OT Detectar similitud de datos
Date: 2013-11-21 18:11:12
Message-ID: 20131121181112.GA23108@dualbus.me
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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(at)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(at)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(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Arcel Labrada Batista 2013-11-21 18:32:39 Re: query para contar registros
Previous Message Lazaro Ruben Garcia Martinez 2013-11-21 18:02:41 RE: query para contar registros