5 votos

Buen algoritmo para el procesamiento de estimaciones de posición

Nosotros (mi equipo) están construyendo un robot que navega alrededor de una arena.

El robot utiliza una cámara para determinar su posición con base en marcadores en la pared. Hemos probado este y se encontró que se puede determinar la posición bien cuando cerca de la pared. Sin embargo, en otras distancias, los marcadores parecen moverse al azar por una sola píxeles en el sensor (debido a la vibración, el ruido del sensor y de otros factores), causando la posición de que las estimaciones varían considerablemente.

Inicialmente se tuvo una media de la captura de muestras, pero si tenemos una lista de ejemplos como este:

(4.45, 5.06)
(4.43, 5.07)
(4.42, 6.48)
(3.95, 5.67)

a continuación, los valores atípicos cambiar considerablemente el promedio de resultado, haciendo el calculo de la posición incorrecta. Por lo tanto, debemos eliminar estos puntos de datos - reemplazar los valores con más razonable de las estimaciones, o marcarlos como los valores atípicos y los ignoran al tomar la media. Idealmente, cualquier algoritmo debe ser capaz de entregar sólo un par de puntos de datos, ya que sólo será capaz de ver a un máximo de 7 marcadores en cualquier momento, y normalmente sólo 4-5.

Tomé GCSE Estadísticas de hace unos 3 años (y tengo Una) y yo recuerdo vagamente un algoritmo que hizo exactamente esto - pero mis conocimientos desde entonces se ha desvanecido.

25voto

Martin O'Leary Puntos 2046

Suena como si estuviera buscando una medida robusta de tendencia central, de la cual hay muchos. La página de Wikipedia sobre estadísticas robustas probablemente merece una lectura. El enfoque más sencillo es probablemente utilizar la mediana de las muestras, en lugar de la media; Tendrás que hacer este cálculo para las coordenadas$x$ y$y$ por separado.

2voto

Rebecca Puntos 51

Suena como un divertido problema en el que estás trabajando.

Supongo que la pregunta es si los sensores están haciendo errores en serie, o si los errores (especialmente los grandes), de manera independiente, distribuido. Es que en realidad lo que plantea un problema para su robot?

Escribí un pequeño ensayo (abajo) que compara el uso de una media, la mediana, la media ponderada (usando la t de student probabilidad de una puntuación t de la observación de la media), la media ponderada (el uso de la probabilidad normal de una puntuación z de la observación, que se sancione a los valores atípicos más), una recortada media, y la media geométrica. La prueba muestra que (como era de esperar) que la media aritmética es más eficiente en muestras grandes, aunque no necesariamente el mejor en muestras individuales con valores atípicos. Así que de nuevo se trata de la cuestión de la distribución de los valores atípicos. Si no están en serie correlación para un determinado sensor, a continuación, tal vez una buena manera es a base menor del robot de la dirección en la observación actual, pero tal vez en un par de observaciones pasadas también.

De todos modos, aquí está mi código R, que le da el RMSE para los seis medidas diferentes. La ponderación es bastante ad-hoc, pero he tenido mucho vino para pensar en ello demasiado.

Saludos, Jim

library(psych)
# Real parameter = 4.45
compare <- function(){

    param <- 4.45

    # standard deviation = 0.3

    sd <- 0.3

    # generate 1000 observations of the param

    obs <- param + sd * rnorm(1000,0,1)

    smpl.sd <- sd(sample(obs, 30, replace = TRUE))

    # Now we randomly sample five observations, and try several different methods,
    # finally comparing the different methods in terms of their RMSE. 
    smpl.mean <- rep(NA, 100)
    smpl.med <- rep(NA, 100)
    smpl.wmt <- rep(NA, 100)
    smpl.wmp <- rep(NA, 100)
    smpl.tm <- rep(NA, 100)
    smpl.gm <- rep(NA, 100)


    for(i in 1:100){
       draw <- sample(obs, 5,replace = TRUE)
       smpl.mean[i] <- mean(draw)
       smpl.med[i] <- median(draw)
       t <- (draw - smpl.mean[i])/(smpl.sd/sqrt(length(draw)))
       p.t <- ifelse(t>0, pt(t,df = length(draw)), pt(t,df = length(draw), lower.tail = FALSE))
       smpl.wmt[i] <- weighted.mean(draw, p.t)
       z <- (draw - smpl.mean[i])/smpl.sd
       p.z <- ifelse(z>0, pnorm(z), pnorm(z, lower.tail = FALSE) )
       smpl.wmp[i] <- weighted.mean(draw, p.z)
       smpl.tm[i] <- mean(sort(draw)[2:4])
       smpl.gm[i] <- geometric.mean(draw)
    }

    working <- sqrt((cbind(smpl.mean, smpl.med, smpl.wmt, smpl.wmp, smpl.tm, smpl.gm)-param)^2)

    rmse <- colMeans(working)
    return(rmse)
}

rmses <- array(NA, c(1000,6))

for (i in 1:100){
   rmses[i, ] = t(compare())
}
colMeans(rmses) 

0voto

Bob King Puntos 12913

Profundidad de datos es una medida robusta de la tendencia central y es interpretable. La profundidad de datos de Tukey, la profundidad simplicial de Liu son algunos ejemplos de profundidad de datos. El siguiente es un paquete R que tiene funciones para calcular la profundidad de los datos: http://cran.r-project.org/web/packages/depth/depth.pdf

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