Comment trouver la matrice de covariance d'un polygone?

9

Imaginez que vous ayez un polygone défini par un ensemble de coordonnées et son centre de masse est à . Vous pouvez traiter le polygone comme une distribution uniforme avec une limite polygonale. (x1,y1)...(xn,yn)(0,0)entrez la description de l'image ici

Je recherche une méthode qui trouvera la matrice de covariance d'un polygone .

Je soupçonne que la matrice de covariance d'un polygone est étroitement liée au deuxième moment de l'aire , mais si elles sont équivalentes, je ne suis pas sûr. Les formules trouvées dans l'article wikipedia que j'ai lié semblent (une supposition ici, ce n'est pas particulièrement clair pour moi d'après l'article) pour faire référence à l'inertie rotationnelle autour des axes x, y et z plutôt que des axes principaux du polygone.

(Soit dit en passant, si quelqu'un peut me montrer comment calculer les axes principaux d'un polygone, cela me serait également utile)

Il est tentant de simplement effectuer une PCA sur les coordonnées , mais cela pose le problème que les coordonnées ne sont pas nécessairement réparties uniformément autour du polygone et ne sont donc pas représentatives de la densité du polygone. Un exemple extrême est le contour du Dakota du Nord, dont le polygone est défini par un grand nombre de points suivant la rivière Rouge, plus seulement deux autres points définissant le bord ouest de l'État.

Ingolifs
la source
Par «trouver», je suppose simplement échantillonner à partir du polygone, puis calculer la covariance des échantillons, n'est-ce pas ce que vous avez en tête?
Stephan Kolassa
De plus, pouvez-vous modifier votre publication pour inclure les coordonnées de votre polygone, afin que les gens puissent jouer avec?
Stephan Kolassa
1
@StephanKolassa Je veux dire que le polygone est une densité de probabilité bivariée uniforme avec une limite polygonale. Bien sûr, vous pouvez échantillonner des points et la limite serait la même chose, mais je cherche une méthode a priori. L'image n'est qu'une illustration de la peinture que j'ai utilisée. Les données réelles que j'ai l'intention d'utiliser sont les contours des États et des régions.
Ingolifs
1
Vous avez raison de dire que le terme habituel de «matrice de covariance» est moment d'inertie ou second moment. Les axes principaux sont orientés dans ses directions propres. Exécuter PCA sur les coordonnées est incorrect: cela revient à supposer que toute la masse est située aux sommets. Les méthodes de calcul les plus directes du barycentre - le premier moment - sont discutées dans mon article à gis.stackexchange.com/a/22744/664 . Les seconds moments sont calculés de la même manière avec des modifications mineures. Des considérations particulières sont nécessaires dans le domaine.
whuber
2
Cela fonctionne dans l'autre sens: calculer le tenseur inertiel et trouver ses axes principaux à partir de cela. La technique dans votre cas implique le théorème de Green, qui montre que les intégrales requises peut être calculé comme des intégrales de contour autour de de la forme unique oùDe telles formes sont faciles à trouver car toute combinaison linéaire appropriée de et fonctionnera. L'intégrale de contour est une somme d'intégrales sur les bords.
μk,l(P)=Pxkyldxdy
Pωdω=xkyldxdy.xkyl+1dxxk+1yldy
whuber

Réponses:

10

Faisons d'abord une analyse.

Supposons que dans le polygone sa densité de probabilité soit la fonction proportionnelle Alors la constante de proportionnalité est l'inverse de l'intégrale de sur le polygone,Pp(x,y).p

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

Le barycentre du polygone est le point des coordonnées moyennes, calculées comme leurs premiers moments. Le premier est

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

Le tenseur inertiel peut être représenté comme le réseau symétrique de seconds moments calculé après la translation du polygone pour mettre son barycentre à l'origine: c'est-à-dire la matrice des seconds moments centraux

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

où varie de à à Le tenseur lui-même - alias matrice de covariance - est(k,l)(2,0)(1,1)(0,2).

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

Une PCA de donne les axes principaux de ce sont les vecteurs propres unitaires mis à l'échelle par leurs valeurs propres.I(P)P:


Ensuite, découvrons comment faire les calculs. Parce que le polygone est présenté comme une séquence de sommets décrivant sa frontière orientée il est naturel d'invoquerP,

Théorème de Green: où est une forme unique définie dans un voisinage de et

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

Par exemple, avec et une densité constante ( c'est -à- dire uniforme) nous pouvons (par inspection) sélectionner l'un des nombreux telles quedω=xkyldxdyp,

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

Le fait est que l'intégrale de contour suit les segments de ligne déterminés par la séquence de sommets. Tout segment de ligne allant du sommet au sommet peut être paramétré par une variable réelle sous la formeuvt

tu+tw

où est la direction normale d'unité de àLes valeurs de vont donc de à Sous ce paramétrage, et sont des fonctions linéaires de et et sont des fonctions linéaires de Ainsi l'intégrande de l'intégrale de contour sur chaque bord devient une fonction polynomiale de qui est facilement évaluée pour les petits etwvuuv.t0|vu|.xytdxdydt.t,kl.


La mise en œuvre de cette analyse est aussi simple que le codage de ses composants. Au niveau le plus bas, nous aurons besoin d'une fonction pour intégrer une forme polynomiale sur un segment de ligne. Les fonctions de niveau supérieur les agrégeront pour calculer les moments bruts et centraux pour obtenir le barycentre et le tenseur inertiel, et enfin nous pouvons opérer sur ce tenseur pour trouver les axes principaux (qui sont ses vecteurs propres à l'échelle). Le Rcode ci-dessous effectue ce travail. Il ne fait aucune prétention d'efficacité: il ne vise qu'à illustrer l'application pratique de l'analyse qui précède. Chaque fonction est simple et les conventions de dénomination sont parallèles à celles de l'analyse.

Le code comprend une procédure pour générer des polygones fermés valides, simplement connectés et non auto-entrecroisés (en déformant aléatoirement des points le long d'un cercle et en incluant le sommet de départ comme point final afin de créer une boucle fermée). Voici quelques instructions pour tracer le polygone, afficher ses sommets, jouxter le barycentre et tracer les axes principaux en rouge (le plus grand) et bleu (le plus petit), créant un système de coordonnées orienté positivement centré sur le polygone.

Figure montrant le polygone et les axes principaux

#
# 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
la source
+1 Wow, c'est une excellente réponse!
amoeba
7

Edit: Je n'ai pas remarqué que Whuber avait déjà répondu. Je vais laisser cela comme un exemple d'une autre approche (peut-être moins élégante) du problème.

La matrice de covariance

Soit un point aléatoire de la distribution uniforme sur un polygone en zone . La matrice de covariance est:(X,Y)PA

C=[CXXCXYCXYCYY]

où est la variance de , est la variance de et est la covariance entre et . Cela suppose une moyenne nulle, car le centre de masse du polygone est situé à l'origine. La distribution uniforme attribue une densité de probabilité constante à chaque point de , donc:CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

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

Triangulation

Au lieu d'essayer de s'intégrer directement sur une région compliquée comme , nous pouvons simplifier le problème en partitionnant en sous-régions triangulaires:PPn

P=T1Tn

Dans votre exemple, un partitionnement possible ressemble à ceci:

entrez la description de l'image ici

Il existe différentes façons de produire une triangulation (voir ici ). Par exemple, vous pouvez calculer la triangulation de Delaunay des sommets, puis éliminer les arêtes qui se trouvent en dehors de (car elle peut être non convexe comme dans l'exemple).P

Les intégrales sur peuvent ensuite être divisées en sommes d'intégrales sur les triangles:P

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

Un triangle a de belles frontières simples, donc ces intégrales sont plus faciles à évaluer.

Intégration sur des triangles

Il existe différentes façons d'intégrer des triangles. Dans ce cas, j'ai utilisé une astuce qui consiste à mapper un triangle sur le carré de l'unité. La transformation en coordonnées barycentriques pourrait être une meilleure option.

Voici des solutions pour les intégrales ci-dessus, pour un triangle arbitraire défini par des sommets . Laisser:T(x1,y1),(x2,y2),(x3,y3)

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

Alors:

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

Tout mettre ensemble

Soit et les coordonnées x / y des sommets pour chaque triangle , comme ci-dessus. Branchez dans pour chaque triangle, en notant que les termes de zone s'annulent. Cela donne la solution:vxivyiTi(3)(2)

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

Axes principaux

Les axes principaux sont donnés par les vecteurs propres de la matrice de covariance , tout comme dans l'ACP. Contrairement à l'ACP, nous avons une expression analytique pour , plutôt que d'avoir à l'estimer à partir de points de données échantillonnés. Notez que les sommets eux-mêmes ne sont pas un échantillon représentatif de la distribution uniforme sur , donc on ne peut pas simplement prendre l'échantillon de matrice de covariance des sommets. Mais, * est * une fonction relativement simple des sommets, comme vu dans .CCPC(4)

user20160
la source
2
+1 Ceci peut être simplifié en autorisant des triangles orientés , éliminant ainsi la nécessité d'une triangulation appropriée. Au lieu de cela, vous pouvez simplement établir un centre arbitraire et additionner les valeurs (signées) sur les triangles c'est ainsi que cela se fait souvent car c'est beaucoup moins difficile. Il est facile de voir qu'une telle somme est essentiellement la même chose que d'appliquer le théorème de Green, car chaque terme dans la somme est finalement une fonction du bordCette approche est illustrée dans la section "Zone" sur quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm . OOPiPi+1:PiPi+1.
whuber
@whuber Intéressant, merci de l'avoir signalé
user20160
Ces deux réponses sont bonnes, même si elles dépassent un peu mon niveau de scolarité. Une fois que je suis sûr de bien les comprendre, j'essaierai de savoir qui obtient la prime.
Ingolifs