¿Cómo encontrar la matriz de covarianza de un polígono?

9

Imagine que tiene un polígono definido por un conjunto de coordenadas y su centro de masa está en . Puede tratar el polígono como una distribución uniforme con un límite poligonal. (x1,y1)...(xn,yn)(0,0)ingrese la descripción de la imagen aquí

Busco un método que encuentre la matriz de covarianza de un polígono .

Sospecho que la matriz de covarianza de un polígono está estrechamente relacionada con el segundo momento de área , pero no sé si son equivalentes. Las fórmulas que se encuentran en el artículo de Wikipedia que vinculé parecen (una suposición aquí, no me resulta especialmente claro en el artículo) referirse a la inercia rotacional alrededor de los ejes x, y y z en lugar de los ejes principales del polígono.

(Por cierto, si alguien me puede indicar cómo calcular los ejes principales de un polígono, eso también me sería útil)

Es tentador simplemente realizar PCA en las coordenadas , pero al hacerlo se encuentra con el problema de que las coordenadas no están necesariamente distribuidas uniformemente alrededor del polígono y, por lo tanto, no son representativas de la densidad del polígono. Un ejemplo extremo es el contorno de Dakota del Norte, cuyo polígono se define por una gran cantidad de puntos que siguen al río Rojo, más solo dos puntos más que definen el borde occidental del estado.

Ingolifs
fuente
Por "encontrar", supongo que simplemente tomar muestras del polígono y luego calcular la covarianza de las muestras, ¿no es lo que tienes en mente?
Stephan Kolassa
Además, ¿puedes editar tu publicación para incluir coordenadas para tu polígono, para que la gente pueda jugar con él?
Stephan Kolassa
1
@StephanKolassa Me refiero a tratar el polígono como una densidad de probabilidad bivariada uniforme con límite poligonal. Claro, puede muestrear puntos y el límite sería lo mismo, pero estoy buscando un método a priori. La imagen es solo una ilustración de la pintura que usé. Los datos del mundo real que pretendo usar son los contornos de estados y regiones.
Ingolifs
1
Tiene razón en que el término habitual para "matriz de covarianza" es momento de inercia o segundo momento. Los ejes principales están orientados en sus direcciones propias. Ejecutar PCA en las coordenadas es incorrecto: equivale a suponer que toda la masa se encuentra en los vértices. Los métodos más directos de cálculo del baricentro, el primer momento, se analizan en mi publicación en gis.stackexchange.com/a/22744/664 . Los segundos momentos se calculan de la misma manera con modificaciones menores. Se necesitan consideraciones especiales en la esfera.
whuber
2
Funciona de la otra manera: calcula el tensor inercial y encuentra sus ejes principales a partir de eso. La técnica en su caso involucra el Teorema de Green, que muestra que las integrales requeridas se puede calcular como integrales de contorno alrededor de de la forma única dondeTales formas son fáciles de encontrar porque cualquier combinación lineal adecuada de y funcionará. La integral de contorno es una suma de integrales sobre los bordes.
μk,l(P)=Pxkyldxdy
Pωdω=xkyldxdy.xkyl+1dxxk+1yldy
whuber

Respuestas:

10

Hagamos un análisis primero.

Suponga que dentro del polígono su densidad de probabilidad es la función proporcional Entonces la constante de proporcionalidad es la inversa de la integral de sobre el polígono,Pp(x,y).p

μ0,0(P)=Pp(x,y)dxdy.

El baricentro del polígono es el punto de coordenadas promedio, calculado como sus primeros momentos. El primero es

μ1,0(P)=1μ0,0(P)Pxp(x,y)dxdy.

El tensor inercial se puede representar como la matriz simétrica de segundos momentos calculados después de traducir el polígono para colocar su baricentro en el origen: es decir, la matriz de segundos momentos centrales

μk,l(P)=1μ0,0(P)P(xμ1,0(P))k(yμ0,1(P))lp(x,y)dxdy

donde van de a a El tensor en sí, también conocido como matriz de covarianza, es(k,l)(2,0)(1,1)(0,2).

I(P)=(μ2,0(P)μ1,1(P)μ1,1(P)μ0,2(P)).

Un PCA de produce los ejes principales de estos son los vectores propios unitarios escalados por sus valores propios.I(P)P:


A continuación, veamos cómo hacer los cálculos. Debido a que el polígono se presenta como una secuencia de vértices que describe su límite orientado es natural invocarP,

Teorema de Green: where es una forma definida en una vecindad de y

Pdω=Pω
ω=M(x,y)dx+N(x,y)dyP
dω=(xN(x,y)yM(x,y))dxdy.

Por ejemplo, con y densidad constante ( es decir , uniforme) podemos (por inspección) seleccionar uno de los muchos soluciones, comodω=xkyldxdyp,

ω(x,y)=1l+1xkyl+1dx.

El punto de esto es que la integral de contorno sigue los segmentos de línea determinados por la secuencia de vértices. Cualquier segmento de línea desde el vértice al vértice puede parametrizarse mediante una variable real en la formauvt

tu+tw

donde es la dirección normal de la unidad de aPor lo tanto, los valores de varían de a Bajo esta parametrización, e son funciones lineales de y y son funciones lineales de Por lo tanto, el integrando de la integral de contorno sobre cada borde se convierte en una función polinómica de que se evalúa fácilmente para los pequeños ywvuuv.t0|vu|.xytdxdydt.t,kl.


Implementar este análisis es tan sencillo como codificar sus componentes. En el nivel más bajo necesitaremos una función para integrar un polinomio de una forma sobre un segmento de línea. Las funciones de nivel superior los agregarán para calcular los momentos sin procesar y centrales para obtener el baricentro y el tensor inercial, y finalmente podemos operar en ese tensor para encontrar los ejes principales (que son sus vectores propios escalados). El Rsiguiente código realiza este trabajo. No tiene pretensiones de eficiencia: solo pretende ilustrar la aplicación práctica del análisis anterior. Cada función es sencilla y las convenciones de denominación son paralelas a las del análisis.

Se incluye en el código un procedimiento para generar polígonos cerrados, simplemente conectados, no auto-intersectantes (deformando al azar los puntos a lo largo de un círculo e incluyendo el vértice inicial como su punto final para crear un bucle cerrado). A continuación se presentan algunas declaraciones para trazar el polígono, mostrar sus vértices, unir el baricentro y trazar los ejes principales en rojo (el más grande) y azul (el más pequeño), creando un sistema de coordenadas centrado positivamente centrado en el polígono.

Figura que muestra el polígono y los ejes principales.

#
# Integrate a monomial one-form x^k*y^l*dx along the line segment given as an 
# origin, unit direction vector, and distance.
#
lintegrate <- function(k, l, origin, normal, distance) {
  # Binomial theorem expansion of (u + tw)^k
  expand <- function(k, u, w) {
    i <- seq_len(k+1)-1
    u^i * w^rev(i) * choose(k,i)
  }
  # Construction of the product of two polynomials times a constant.
  omega <- normal[1] * convolve(rev(expand(k, origin[1], normal[1])), 
                                expand(l, origin[2], normal[2]),
                                type="open")
  # Integrate the resulting polynomial from 0 to `distance`.
  sum(omega * distance^seq_along(omega) / seq_along(omega))
}
#
# Integrate monomials along a piecewise linear path given as a sequence of
# (x,y) vertices.
#
cintegrate <- function(xy, k, l) {
  n <- dim(xy)[1]-1 # Number of edges
  sum(sapply(1:n, function(i) {
    dv <- xy[i+1,] - xy[i,]               # The direction vector
    lambda <- sum(dv * dv)
    if (isTRUE(all.equal(lambda, 0.0))) {
      0.0
    } else {
      lambda <- sqrt(lambda)              # Length of the direction vector
      -lintegrate(k, l+1, xy[i,], dv/lambda, lambda) / (l+1)
    }
  }))
}
#
# Compute moments of inertia.
#
inertia <- function(xy) {
  mass <- cintegrate(xy, 0, 0)
  barycenter = c(cintegrate(xy, 1, 0), cintegrate(xy, 0, 1)) / mass
  uv <- t(t(xy) - barycenter)   # Recenter the polygon to obtain central moments
  i <- matrix(0.0, 2, 2)
  i[1,1] <- cintegrate(uv, 2, 0)
  i[1,2] <- i[2,1] <- cintegrate(uv, 1, 1)
  i[2,2] <- cintegrate(uv, 0, 2)
  list(Mass=mass,
       Barycenter=barycenter,
       Inertia=i / mass)
}
#
# Find principal axes of an inertial tensor.
#
principal.axes <- function(i.xy) {
  obj <- eigen(i.xy)
  t(t(obj$vectors) * obj$values)
}
#
# Construct a polygon.
#
circle <- t(sapply(seq(0, 2*pi, length.out=11), function(a) c(cos(a), sin(a))))
set.seed(17)
radii <- (1 + rgamma(dim(circle)[1]-1, 3, 3))
radii <- c(radii, radii[1])  # Closes the loop
xy <- circle * radii
#
# Compute principal axes.
#
i.xy <- inertia(xy)
axes <- principal.axes(i.xy$Inertia)
sign <- sign(det(axes))
#
# Plot barycenter and principal axes.
#
plot(xy, bty="n", xaxt="n", yaxt="n", asp=1, xlab="x", ylab="y",
     main="A random polygon\nand its principal axes", cex.main=0.75)
polygon(xy, col="#e0e0e080")
arrows(rep(i.xy$Barycenter[1], 2), 
       rep(i.xy$Barycenter[2], 2),
       -axes[1,] + i.xy$Barycenter[1],     # The -signs make the first axis .. 
       -axes[2,]*sign + i.xy$Barycenter[2],# .. point to the right or down.
       length=0.1, angle=15, col=c("#e02020", "#4040c0"), lwd=2)
points(matrix(i.xy$Barycenter, 1, 2), pch=21, bg="#404040")
whuber
fuente
+1 ¡Guau, esta es una gran respuesta!
ameba
7

Editar: No noté que Whuber ya había respondido. Dejaré esto como un ejemplo de otro enfoque (quizás menos elegante) del problema.

La matriz de covarianza

Deje que sea un punto al azar de la distribución uniforme en un polígono con zona . La matriz de covarianza es:(X,Y)PA

C=[CXXCXYCXYCYY]

donde es la varianza de , es la varianza de , y es la covarianza entre y . Esto supone una media cero, ya que el centro de masa del polígono se encuentra en el origen. La distribución uniforme asigna densidad de probabilidad constante a cada punto en , entonces:CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

(1)CXX=1APx2dVCYY=1APy2dVCXY=1APxydV

Triangulación

En lugar de intentar integrar directamente sobre una región complicada como , podemos simplificar el problema dividiendo en subregiones triangulares:PPn

P=T1Tn

En su ejemplo, una posible partición se ve así:

ingrese la descripción de la imagen aquí

Hay varias formas de producir una triangulación (ver aquí ). Por ejemplo, podría calcular la triangulación de Delaunay de los vértices, luego descartar los bordes que quedan fuera de (ya que puede no ser convexo como en el ejemplo).P

Las integrales sobre se pueden dividir en sumas de integrales sobre los triángulos:P

(2)CXX=1Ai=1nTix2dVCYY=1Ai=1nTiy2dVCXY=1Ai=1nTixydV

Un triángulo tiene límites agradables y simples, por lo que estas integrales son más fáciles de evaluar.

Integrando sobre triángulos

Hay varias formas de integrarse sobre triángulos. En este caso, utilicé un truco que implica mapear un triángulo al cuadrado de la unidad. La transformación a coordenadas barcéntricas podría ser una mejor opción.

Aquí hay soluciones para las integrales anteriores, para un triángulo arbitrario definido por vértices . Dejar:T(x1,y1),(x2,y2),(x3,y3)

vx=[x1x2x3]vy=[y1y2y3]1=[111]L=[100110111]

Entonces:

(3)Tx2dV=A6Tr(vxvxTL)Ty2dV=A6Tr(vyvyTL)TxydV=A12(1TvxvyT1+vxTvy)

Poniendo todo junto

Supongamos que y contienen las coordenadas x / y de los vértices de cada triángulo , como se anteriormente. Enchufe en para cada triángulo, observando que los términos del área se cancelan. Esto da la solución:vxivyiTi(3)(2)

(4)CXX=16i=1nTr(vxi(vxi)TL)CYY=16i=1nTr(vyi(vyi)TL)CXY=112i=1n(1Tvxi(vyi)T1+(vxi)Tvyi)

Ejes principales

Los ejes principales están dados por los vectores propios de la matriz de covarianza , al igual que en PCA. A diferencia de PCA, tenemos una expresión analítica para , en lugar de tener que estimarla a partir de puntos de datos muestreados. Tenga en cuenta que los vértices en sí no son una muestra representativa de la distribución uniforme en , por lo que uno no puede simplemente tomar la matriz de covarianza de la muestra de los vértices. Pero, * es * una función relativamente simple de los vértices, como se ve en .CCPC(4)

usuario20160
fuente
2
+1 Esto puede simplificarse permitiendo triángulos orientados , eliminando así la necesidad de una triangulación adecuada. En su lugar, puede establecer un centro arbitrario y sumar los valores (con signo) sobre los triángulos así es como se hace a menudo porque es mucho menos exigente. Es fácil ver que tal suma es esencialmente lo mismo que aplicar el Teorema de Green, porque cada término en la suma es, en última instancia, una función del bordeEste enfoque se ilustra en la sección "Área" en quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm . OOPiPi+1:PiPi+1.
whuber
@whuber Interesante, gracias por señalar esto
user20160
Ambas respuestas son buenas, aunque un poco por encima de mi nivel educativo. Una vez que esté seguro de entenderlos por completo, trataré de averiguar quién recibe la recompensa.
Ingolifs