Bir çokgenin kovaryans matrisi nasıl bulunur?


9

Bir koordinat kümesi tarafından tanımlanan bir çokgeniniz olduğunu ve kütle merkezinin olduğunu . Çokgene, çokgen bir sınır ile düzgün bir dağılım olarak davranabilirsiniz. (x1,y1)...(xn,yn)(0,0)resim açıklamasını buraya girin

Bir çokgenin kovaryans matrisini bulan bir yöntemden sonrayım .

Bir çokgenin kovaryans matrisinin alanın ikinci anıyla yakından ilişkili olduğundan şüpheleniyorum , ancak eşdeğer olup olmadıklarından emin değilim. Bağladığım wikipedia makalesinde bulunan formüller, çokgenin ana eksenlerinden ziyade x, y ve z eksenleri etrafındaki dönme ataletine atıfta bulunuyor gibi görünüyor (burada bir tahmin, makaleden özellikle net değil).

(Bu arada, eğer birisi beni çokgenin ana eksenlerini nasıl hesaplayacağımı gösterebilirse, bu benim için de yararlı olacaktır)

Sadece koordinatlarda PCA gerçekleştirmek cazip gelebilir , ancak bunu yapmak koordinatların çokgen etrafında eşit olarak dağılmaması ve bu nedenle çokgenin yoğunluğunu temsil etmemesi sorunuyla karşılaşır. Aşırı bir örnek, çokgenleri Kızıl nehirden sonra çok sayıda nokta ve devletin batı kenarını tanımlayan sadece iki nokta ile tanımlanan Kuzey Dakota'nın anahatlarıdır.


"Bul" ile, ben sadece çokgenden örnekleme varsayalım, sonra örnekleri kovaryans hesaplamak, aklınızdaki şey değil mi?
Stephan Kolassa

Ayrıca, yayınınızı çokgen için koordinatlar içerecek şekilde düzenleyebilir, böylece insanlar onunla oynayabilir mi?
Stephan Kolassa

1
@StephanKolassa Poligonun, poligonal sınır ile tekdüze iki değişkenlik olasılık yoğunluğu olarak muamele edilmesi anlamına gelir. Tabii, puan örnek olabilir ve sınır aynı şey olurdu, ama ben bir a priori yöntemi arıyorum. Resim sadece kullandığım boyadan bir örnek. Kullanmayı düşündüğüm gerçek veriler, eyaletlerin ve bölgelerin ana hatlarıdır.
Ingolifs

1
"Kovaryans matrisi" için kullanılan genel terimin atalet momenti veya ikinci moment olduğu doğrudur . Ana eksenler kendi şekillerinde yönlendirilir. PCA'yı koordinatlarda çalıştırmak yanlıştır: tüm kütlenin köşe noktalarında olduğu varsayılarak eşdeğerdir. Barmerkezinin en doğrudan hesaplama yöntemleri - ilk an - gis.stackexchange.com/a/22744/664 adresindeki yazımda tartışıldı . İkinci anlar, küçük değişikliklerle aynı şekilde hesaplanır. Alanda özel hususlar gereklidir.
whuber

2
Diğer şekilde çalışır: atalet tensörünü hesaplayın ve ana eksenlerini bundan bulun. Sizin durumunuzdaki teknik, zorunlu integralleri gösteren Green Teoremini içerir.
μk,l(P)=Pxkyldxdy
etrafında kontur integralleri olarak hesaplanabilir P tek biçimli ω nerede dω=xkyldxdy. Bu tür formları bulmak kolaydır, çünkü herhangi bir uygun doğrusal kombinasyon xkyl+1dx ve xk+1yldyçalışacak. Kontur integrali, kenarlar üzerindeki integrallerin toplamıdır.
whuber

Yanıtlar:


10

Önce biraz analiz yapalım.

Çokgenin içinde olduğunu varsayalım P olasılık yoğunluğu orantılı fonksiyondur p(x,y). O halde orantısallık sabiti, integralin tersidir. p çokgenin üzerinde,

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

Ağırlık merkezi çokgenin ilk moment olarak hesaplanan ortalama koordinatlar, noktasıdır. Birincisi

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

Atalet tensör kökenli onun ağırlık merkezi koymak için poligon çeviri sonrası hesaplanan ikinci anları simetrik dizisi olarak temsil edilebilir: yani, matrisini ikinci merkezi momentler

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

nerede (k,l) dan aralığı (2,0) için (1,1) için (0,2). Tensörün kendisi - diğer adıyla kovaryans matrisi -

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

Bir PCA I(P)verir ana eksenleri arasındaP: bunlar özdeğerlerine göre ölçeklendirilmiş birim özvektörlerdir.


Sonra, hesaplamaların nasıl yapılacağını ele alalım. Çünkü çokgen, yönlendirilmiş sınırını tanımlayan bir köşe sırası dizisi olarak sunulurP, çağırmak doğaldır

Green Teoremi:

Pdω=Pω
nerede ω=M(x,y)dx+N(x,y)dy bir mahallede tanımlanan tek P ve
dω=(xN(x,y)yM(x,y))dxdy.

Örneğin, dω=xkyldxdyve sabit ( yani , muntazam) yoğunlukp, (muayene ile) gibi birçok çözümden birini seçebiliriz

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

Bunun noktası, kontur integralinin, köşe dizisi tarafından belirlenen çizgi parçalarını izlemesidir. Köşeden herhangi bir çizgi parçasıu tepe noktasına v gerçek bir değişken tarafından parametrelendirilebilir t şeklinde

tu+tw

where wvu is the unit normal direction from u to v. The values of t therefore range from 0 to |vu|. Under this parameterization x and y are linear functions of t and dx and dy are linear functions of dt. Thus the integrand of the contour integral over each edge becomes a polynomial function of t, which is easily evaluated for small k and l.


Implementing this analysis is as straightforward as coding its components. At the lowest level we will need a function to integrate a polynomial one-form over a line segment. Higher level functions will aggregate these to compute the raw and central moments to obtain the barycenter and inertial tensor, and finally we can operate on that tensor to find the principal axes (which are its scaled eigenvectors). The R code below performs this work. It makes no pretensions of efficiency: it is intended only to illustrate the practical application of the foregoing analysis. Each function is straightforward and the naming conventions parallel those of the analysis.

Included in the code is a procedure to generate valid closed, simply connected, non-self-intersecting polygons (by randomly deforming points along a circle and including the starting vertex as its final point in order to create a closed loop). Following this are a few statements to plot the polygon, display its vertices, adjoin the barycenter, and plot the principal axes in red (largest) and blue (smallest), creating a polygon-centric positively-oriented coordinate system.

Figure showing polygon and principal axes

#
# 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 Wow, this is a great answer!
amoeba

7

Edit: Didn't notice that whuber had already answered. I'll leave this up as an example of another (perhaps less elegant) approach to the problem.

The covariance matrix

Let (X,Y) be a random point from the uniform distribution on a polygon P with area A. The covariance matrix is:

C=[CXXCXYCXYCYY]

where CXX=E[X2] is the variance of X, CYY=E[Y2] is the variance of Y, and CXY=E[XY] is the covariance between X and Y. This assumes zero mean, since the polygon's center of mass is located at the origin. The uniform distribution assigns constant probability density 1A to every point in P, so:

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

Triangulation

Instead of trying to directly integrate over a complicated region like P, we can simplify the problem by partitioning P into n triangular subregions:

P=T1Tn

In your example, one possible partitioning looks like this:

enter image description here

There are various ways to produce a triangulation (see here). For example, you could compute the Delaunay triangulation of the vertices, then discard edges that fall outside P (since it may be nonconvex as in the example).

Integrals over P can then be split into sums of integrals over the triangles:

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

A triangle has nice, simple boundaries so these integrals are easier to evaluate.

Integrating over triangles

There are various ways to integrate over triangles. In this case, I used a trick that involves mapping a triangle to the unit square. Transforming to barycentric coordintes might be a better option.

Here are solutions for the integrals above, for an arbitrary triangle T defined by vertices (x1,y1),(x2,y2),(x3,y3). Let:

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

Then:

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

Putting everything together

Let vxi and vyi contain the x/y coordinates of the vertices for each triangle Ti, as above. Plug (3) into (2) for each triangle, noting that the area terms cancel out. This gives the solution:

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

Principal axes

The principal axes are given by the eigenvectors of the covariance matrix C, just as in PCA. Unlike PCA, we have an analytic expression for C, rather than having to estimate it from sampled data points. Note that the vertices themselves are not a representative sample from the uniform distribution on P, so one can't simply take the sample covariance matrix of the vertices. But, C *is* a relatively simple function of the vertices, as seen in (4).


2
+1 Bu, yönlendirilmiş üçgenlere izin verilerek basitleştirilebilir , böylece uygun bir üçgenleme ihtiyacını ortadan kaldırabilir. Bunun yerine, sadece keyfi bir merkez kurabilirsinizÖ ve üçgenler üzerindeki (imzalı) değerleri toplayın ÖPbenPben+1:bu genellikle böyle yapılır çünkü daha az telaşlıdır. Böyle bir toplamın aslında Green Teoremini uygulamakla aynı olduğunu görmek kolaydır, çünkü toplamdaki her terim sonuçta kenarın bir fonksiyonudurPbenPben+1.Bu yaklaşım quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm adresindeki "Alan" bölümünde gösterilmektedir .
whuber

@whuber Interesting, thanks for pointing this out
user20160

Bu yanıtların her ikisi de, eğitim seviyemden biraz da olsa iyi. Onları tam olarak anladığımdan emin olduğumda, ödülün kim olduğunu anlamaya çalışacağım.
Ingolifs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.