Come trovare la matrice di covarianza di un poligono?


9

Immagina di avere un poligono definito da un insieme di coordinate e il suo centro di massa è a . Puoi considerare il poligono come una distribuzione uniforme con un confine poligonale. (x1,y1)...(xn,yn)(0,0)inserisci qui la descrizione dell'immagine

Sto seguendo un metodo che troverà la matrice di covarianza di un poligono .

Sospetto che la matrice di covarianza di un poligono sia strettamente correlata al secondo momento dell'area , ma non sono sicuro che siano equivalenti. Le formule trovate nell'articolo di Wikipedia che ho collegato sembrano (un'ipotesi qui, non mi è particolarmente chiaro dall'articolo) per riferirsi all'inerzia rotazionale attorno agli assi x, ye z piuttosto che agli assi principali del poligono.

(Per inciso, se qualcuno può indicarmi come calcolare gli assi principali di un poligono, sarebbe utile anche a me)

È allettante eseguire solo PCA sulle coordinate , ma ciò si traduce nel problema che le coordinate non sono necessariamente distribuite uniformemente attorno al poligono e quindi non sono rappresentative della densità del poligono. Un esempio estremo è il profilo del Nord Dakota, il cui poligono è definito da un gran numero di punti che seguono il fiume Rosso, più solo altri due punti che definiscono il margine occidentale dello stato.


Con "trova", presumo semplicemente il campionamento dal poligono, quindi il calcolo della covarianza dei campioni, non è quello che hai in mente?
Stephan Kolassa,

Inoltre, puoi modificare il tuo post per includere le coordinate per il tuo poligono, in modo che le persone possano giocarci?
Stephan Kolassa,

1
@StephanKolassa Intendo trattare il poligono come una densità di probabilità bivariata uniforme con confine poligonale. Certo, puoi campionare punti e il limite sarebbe la stessa cosa, ma sto cercando un metodo a priori. L'immagine è solo un'illustrazione della vernice che ho usato. I dati del mondo reale che intendo utilizzare sono i contorni di stati e regioni.
Ingolifs

1
Hai ragione a dire che il termine abituale per "matrice di covarianza" è momento di inerzia o secondo momento. Gli assi principali sono orientati nelle sue direzioni. L'esecuzione di PCA sulle coordinate non è corretta: equivale a supporre che tutta la massa si trovi sui vertici. I metodi più diretti di calcolo del baricentro - il primo momento - sono discussi nel mio post su gis.stackexchange.com/a/22744/664 . I secondi momenti vengono calcolati allo stesso modo con piccole modifiche. Considerazioni speciali sono necessarie sulla sfera.
whuber

2
Funziona diversamente: calcola il tensore inerziale e trova i suoi assi principali da quello. La tecnica nel tuo caso coinvolge il Teorema di Green, che mostra che gli integrali richiesti può essere calcolato come integrale di contorno attorno a della forma unica doveTali forme sono facili da trovare perché qualsiasi combinazione lineare adatto di e funzionerà. L'integrale del contorno è una somma di integrali sui bordi. P ω d ω = x k y l d x d y . x k
μk,l(P)=Pxkyldxdy
Pωdω=xkyldxdy.x k + 1 y l d yxkyl+1dxxk+1yldy
whuber

Risposte:


10

Facciamo prima alcune analisi.

Supponiamo che all'interno del poligono sua densità di probabilità sia la funzione proporzionale Quindi la costante di proporzionalità è l'inverso dell'integrale di sul poligono,Pp(x,y).p

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

Il baricentro del poligono è il punto di coordinate medie, calcolato come i loro primi momenti. Il primo è

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

Il tensore inerziale può essere rappresentato come la matrice simmetrica dei secondi momenti calcolata dopo aver tradotto il poligono per mettere il suo baricentro all'origine: cioè la matrice dei secondi momenti centrali

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

dove vanno da a a Il tensore stesso - alias matrice di covarianza - lo è(k,l)(2,0)(1,1)(0,2).

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

Un PCA di produce gli assi principali di questi sono gli autovettori di unità scalati in base ai loro autovalori.I(P)P :P:


Quindi, scopriamo come eseguire i calcoli. Poiché il poligono è presentato come una sequenza di vertici che ne descrive il confine orientato è naturale invocareP,

Teorema di Green: dove è una forma unica definita in un quartiere di e

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

Ad esempio, con e densità costante ( cioè uniforme) possiamo (per ispezione) selezionare uno dei tanti soluzioni, comedω=xkyldxdyp , ω ( x , y ) = - 1p,

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

Il punto di ciò è che l'integrale del contorno segue i segmenti di linea determinati dalla sequenza dei vertici. Qualsiasi segmento di linea da vertice a vertice può essere parametrizzato da una variabile reale nel modulouvt

tu+tw

dove è la direzione normale dell'unità da aI valori di pertanto vanno da a Sotto questa parametrizzazione ed sono funzioni lineari di e e sono funzioni lineari di Pertanto l'integrando dell'integrale del contorno su ciascun bordo diventa una funzione polinomiale di che può essere facilmente valutata per piccoli ewvuuv.t0|vu|.xytdxdydt.t , k l .t,kl.


L'implementazione di questa analisi è semplice come codificare i suoi componenti. Al livello più basso avremo bisogno di una funzione per integrare una forma polinomiale su un segmento di linea. Le funzioni di livello superiore le aggregheranno per calcolare i momenti grezzi e centrali per ottenere il baricentro e il tensore inerziale, e infine potremo operare su quel tensore per trovare gli assi principali (che sono i suoi autovettori scalati). Il Rcodice seguente esegue questo lavoro. Non fa pretese di efficienza: intende solo illustrare l'applicazione pratica dell'analisi che precede. Ogni funzione è semplice e le convenzioni di denominazione sono parallele a quelle dell'analisi.

Nel codice è inclusa una procedura per generare poligoni validi chiusi, semplicemente connessi e non autointersecanti (deformando casualmente i punti lungo un cerchio e includendo il vertice iniziale come punto finale per creare un circuito chiuso). Di seguito sono riportate alcune affermazioni per tracciare il poligono, visualizzare i suoi vertici, adiacente al baricentro e tracciare gli assi principali in rosso (il più grande) e blu (il più piccolo), creando un sistema di coordinate orientato positivamente al poligono.

Figura che mostra il poligono e gli assi principali

#
# 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")

+1 Caspita, questa è un'ottima risposta!
amoeba,

7

Modifica: non ho notato che whuber aveva già risposto. Lascio questo come esempio di un altro (forse meno elegante) approccio al problema.

La matrice di covarianza

Let sia un punto casuale dalla distribuzione uniforme su un poligono con area . La matrice di covarianza è:(X,Y)PA

C=[CXXCXYCXYCYY]

dove è la varianza di , è la varianza di e è la covarianza tra e . Ciò presuppone una media zero, poiché il centro di massa del poligono si trova all'origine. La distribuzione uniforme assegna densità di probabilità costante a ogni punto in , quindi:CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

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

Triangolazione

Invece di provare a integrarci direttamente in una regione complicata come , possiamo semplificare il problema suddividendo in sottoregioni triangolari:PPn

P=T1Tn

Nel tuo esempio, un possibile partizionamento è simile al seguente:

inserisci qui la descrizione dell'immagine

Esistono vari modi per produrre una triangolazione (vedi qui ). Ad esempio, potresti calcolare la triangolazione di Delaunay dei vertici, quindi scartare i bordi che cadono fuori da (poiché potrebbe essere non convesso come nell'esempio).P

Gli integrali su possono quindi essere suddivisi in somme di integrali sui triangoli:P

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

Un triangolo ha dei confini piacevoli e semplici, quindi questi integrali sono più facili da valutare.

Integrazione su triangoli

Esistono vari modi per integrare i triangoli. In questo caso, ho usato un trucco che comporta la mappatura di un triangolo sul quadrato dell'unità. Trasformarsi in coordini baricentrici potrebbe essere un'opzione migliore.

Ecco le soluzioni per gli integrali sopra, per un triangolo arbitrario definito da vertici . Permettere:T(x1,y1),(x2,y2),(x3,y3)

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

Poi:

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

Mettere tutto insieme

Lascia che e contengano le coordinate x / y dei vertici per ciascun triangolo , come sopra. Collega a per ciascun triangolo, osservando che i termini dell'area si annullano. Questo dà la soluzione:vxivyiTi(3)(2)

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

Assi principali

Gli assi principali sono dati dagli autovettori della matrice di covarianza , proprio come nel PCA. A differenza della PCA, abbiamo un'espressione analitica per , piuttosto che doverla stimare da punti di dati campionati. Si noti che i vertici stessi non sono un campione rappresentativo della distribuzione uniforme su , quindi non si può semplicemente prendere la matrice di covarianza del campione dei vertici. Ma * è * una funzione relativamente semplice dei vertici, come si vede in .CCPC(4)


2
+1 Questo può essere semplificato consentendo triangoli orientati , eliminando così la necessità di una triangolazione corretta. Invece, puoi semplicemente stabilire un centro arbitrario e sommare i valori (firmati) sui triangoli è così che viene spesso fatto perché è molto meno esigente. È facile vedere che una simile somma è essenzialmente la stessa cosa dell'applicazione del Teorema di Green, perché ogni termine nella somma alla fine è una funzione del bordoQuesto approccio è illustrato nella sezione "Area" di quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm . O P i P i + 1 : P i P i + 1 .OOPiPi+1:PiPi+1.
whuber

@whuber Interessante, grazie per
averlo segnalato

Entrambe queste risposte sono buone, anche se un po 'oltre il mio livello di istruzione. Una volta che sono sicuro di averli pienamente capiti, cercherò di capire chi ottiene la taglia.
Ingolifs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.