2012-02-11 30 views
5

Estoy ajustando un plano a un punto 3D configurado con el método de mínimos cuadrados. Ya tengo un algoritmo para hacer eso, pero quiero modificarlo para usar un cuadrado menos ponderado. Lo que significa que tengo un peso para cada punto (cuanto mayor sea el peso, más cerca estará el avión del punto).Mínimo cuadrado ponderado: ajuste un plano al conjunto de puntos 3D

El algoritmo actual (sin peso) es el siguiente:

Calcular la suma:

for(Point3D p3d : pointCloud) { 
    pos = p3d.getPosition(); 
    fSumX += pos[0]; 
    fSumY += pos[1]; 
    fSumZ += pos[2]; 
    fSumXX += pos[0]*pos[0]; 
    fSumXY += pos[0]*pos[1]; 
    fSumXZ += pos[0]*pos[2]; 
    fSumYY += pos[1]*pos[1]; 
    fSumYZ += pos[1]*pos[2]; 
} 

que hacen las matrices:

double[][] A = { 
    {fSumXX, fSumXY, fSumX}, 
    {fSumXY, fSumYY, fSumY}, 
    {fSumX, fSumY, pointCloud.size()} 
}; 

double[][] B = { 
    {fSumXZ}, 
    {fSumYZ}, 
    {fSumZ} 
}; 

de resolver Ax = B y el 3 componentes de la solución son los coeficientes de la llanura ajustada ...

S o, ¿puedes ayudarme a cómo modificar esto para usar pesas? ¡Gracias!

+4

FYI - si puede tener muchos puntos (> por ejemplo 20) y/o las coordenadas tienen un desplazamiento grande, no calcule las estadísticas de la forma en que lo hace (tomando las sumas de cuadrados de la posición bruta) - tiene poca sensibilidad a los errores numéricos. Como mínimo, puede restar el valor medio de las coordenadas X/Y/Z primero, luego hacer su procesamiento, y al final agregar las compensaciones. Hay otras formas específicas de algoritmo para hacer esto, pero no entiendo exactamente cómo su algoritmo usa mínimos cuadrados, así que no puedo evitar más que eso. –

+0

¿Qué quiere decir con desplazamiento? (lo siento, no lo entiendo en este contexto). –

+2

Ejemplo rápido: puntos p1 = (10001, 10002, 10003), p2 = (10005, 10006, 10007), p3 = (10009, 10004, 10008). Estos tienen valores medios de (10005, 10004, 10006). Así que compensa (traduce) las coordenadas del punto por el contrario de esta cantidad para obtener p1 '= (-4, -2, -3), p2' = (0,2,1), p3 '= (4,0, 2). Luego haz tus cálculos y luego vuelve a agregar en el desplazamiento. –

Respuesta

10

intuición

Un punto x en un plano definido por la normalidad n y un punto en el plano p obedece: n.(x - p) = 0. Si un punto y no se encuentra en el plano, n.(y -p) no será igual a cero, por lo que una forma útil de definir un costo es por |n.(y - p)|^2. Esta es la distancia cuadrada del punto y desde el plano.

Con el mismo peso, que desea encontrar un n que minimiza el error cuadrático total cuando se sumando los puntos:

f(n) = sum_i | n.(x_i - p) |^2 

Ahora bien, esto supone que sabemos algún punto p que se encuentra en el avión. Podemos calcular fácilmente uno como centroide, que es simplemente la media de componentes de la nube de puntos y siempre estará en el plano de mínimos cuadrados.

Solución

Vamos a definir una matriz M donde cada fila es el punto x_iith menos el centroide c, podemos volver a escribir:

f(n) = | M n |^2 

usted debería ser capaz de convencerse de que esta versión de multiplicación de matriz es la misma que la suma de la ecuación anterior.

A continuación, puede tomar singular value decomposition de M, y el n que desee y luego viene dado por el vector singular derecha de M que se corresponde con el valor singular más pequeño.

Para incorporar pesos, simplemente necesita definir un peso w_i para cada punto. Calcule c como el promedio ponderado de los puntos, y cambie sum_i | n.(x_i - c) |^2 por sum_i | w_i * n.(x_i - c) |^2, y la matriz M de forma similar. Luego resuelve como antes.

+0

Tenías razón después de todo, esto funciona bien. ¡Gracias! –

2

Multiplicar cada término en cada suma por el peso correspondiente. Por ejemplo:

fSumZ += weight * pos[2]; 
fSumXX += weight * pos[0]*pos[0]; 

Desde pointCloude.size() es la suma de 1 para todos los puntos, se debe reemplazar con la suma de todos los pesos.

+0

Pensé que debería ser suficiente multiplicar cada término por el peso, pero no estaba seguro ... Lo intentaré y volveré. Gracias. –

0

Comience redefiniendo el cálculo del error de mínimos cuadrados. La fórmula intenta minimizar la suma de cuadrados de errores. Multiplique el error al cuadrado por una función de dos puntos que disminuye con su distancia. Luego intenta minimizar la suma ponderada de los errores al cuadrado y derivar los coeficientes de eso.

Cuestiones relacionadas