다각형의 공분산 행렬을 찾는 방법은 무엇입니까?


9

좌표 집합 정의 된 다각형이 있고 질량 중심이 합니다. 다각형 경계를 사용하여 다각형을 균일 한 분포 로 취급 할 수 있습니다 . (x1,y1)...(xn,yn)(0,0)여기에 이미지 설명을 입력하십시오

다각형 의 공분산 행렬 을 찾는 방법을 따르고 있습니다.

다각형의 공분산 행렬이 면적두 번째 모멘트 와 밀접한 관련이 있다고 생각 하지만, 동등한 지 여부는 확실하지 않습니다. 내가 연결 한 Wikipedia 기사에서 찾은 공식은 다각형의 주축이 아닌 x, y 및 z 축 주위의 회전 관성을 나타내는 것처럼 보입니다 (여기서 기사에서 특히 명확하지 않습니다).

(우연히, 누군가가 다각형의 주축을 계산하는 방법을 알려 줄 수 있다면 나에게도 유용 할 것입니다)

좌표에 대해 PCA를 수행 하려는 유혹이 있지만, 좌표가 다각형 주위에 반드시 균등하게 분산 될 필요가 없으므로 다각형의 밀도를 나타내지 않는 문제가 발생합니다. 극단적 인 예는 노스 다코타 (North Dakota)의 개요입니다. 다각형은 레드 리버 (Red River) 다음에있는 많은 수의 포인트와주의 서쪽 가장자리를 정의하는 두 개의 포인트로 정의됩니다.


"찾기"를 사용하면 간단히 다각형에서 샘플링 한 다음 샘플의 공분산을 계산한다고 생각합니다.
Stephan Kolassa

또한 다각형에 대한 좌표를 포함하도록 게시물을 편집하여 사람들이 함께 놀 수 있습니까?
Stephan Kolassa

1
@StephanKolassa 다각형을 다각형 경계를 가진 균일 한 이변 량 확률 밀도로 취급한다는 의미입니다. 물론, 당신은 점을 샘플링 할 수 있으며 한계는 같을 것입니다. 그러나 나는 a-priori 방법을 찾고 있습니다. 그림은 내가 사용한 페인트의 그림 일뿐입니다. 내가 사용하려는 실제 데이터는 주와 지역의 개요입니다.
Ingolifs

1
"공분산 행렬"에 대한 일반적인 용어 는 관성 모멘트 또는 두 번째 모멘트 인 것이 맞습니다 . 주축은 고유 방향으로 향합니다. 좌표에서 PCA를 실행하는 것은 올바르지 않습니다. 모든 질량이 정점에 있다고 가정하는 것이 가장 좋습니다. barycenter의 가장 직접적인 계산 방법- 첫 번째 순간은 gis.stackexchange.com/a/22744/664의 내 게시물에서 설명 합니다. 두 번째 모멘트는 약간 수정하여 같은 방식으로 계산됩니다. 구체에 대한 특별한 고려가 필요합니다.
whuber

2
다른 방법으로 작동합니다. 관성 텐서를 계산하고 주축을 찾으십시오. 귀하의 경우의 기술은 Green 's Theorem과 관련이 있으며, 이는 필수 적분 는 단일 형식 주위의 등고 분 적분으로 계산 될 수 있습니다. 여기서 와 의 적절한 선형 조합이 작동하기 때문에 이러한 양식을 쉽게 찾을 수 있습니다. 윤곽 적분은 모서리에 걸친 적분의 합입니다.
μk,l(P)=Pxkyldxdy
Pωdω=xkyldxdy.xkyl+1dxxk+1yld와이
whuber

답변:


10

먼저 몇 가지 분석을 해보자.

다각형 에서 확률 밀도는 비례 함수 비례 상수 는 다각형에 대한 의 적분의 역수입니다.(엑스,와이).

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

다각형 의 중심 은 첫 번째 모멘트로 계산 된 평균 좌표 점입니다. 첫 번째는

μ1,0()=1μ0,0()엑스(엑스,와이)엑스와이.

관성 텐서는 원점에 그 중심 좌표를 넣어 다각형 번역 후 계산 번째 모멘트의 대칭 배열로 표현 될 수있다 : 즉, 행렬의 중심부 번째 순간

μ케이,'()=1μ0,0()(엑스μ1,0())케이(와이μ0,1())(엑스,와이)엑스와이

여기서 은 에서 에서 텐서 itself-- 일명 공분산 행렬은 -입니다(케이,)(2,0)(1,1)(0,2).

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

의 PCA는 주축 을 산출합니다 이들은 고유 값으로 스케일 된 단위 고유 벡터입니다.I(P)P:


다음으로 계산 방법을 알아 보겠습니다. 다각형은 방향 경계 설명하는 일련의 꼭짓점으로 표시되므로 호출하는 것이 당연합니다.P,

녹색 정리 : 여기서 는 및 근처에 정의 된 단일 형식입니다.

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

예를 들어, 및 일정한 ( , 균일 한) 밀도 검사를 통해 여러 가지 중 하나를 선택할 수 있습니다 와 같은 솔루션dω=xkyldxdyp,

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

요점은 형상 적분이 정점 시퀀스에 의해 결정된 선분을 따른다는 것입니다. 정점 에서 정점 까지의 모든 선분 은 형식 의 실수 변수 에 의해 매개 변수화 될 수 있습니다uvt

tu+tw

여기서 는 에서 로의 단위 법선 방향입니다따라서 의 값 범위는 에서 이 매개 변수화에서 와 는 선형 함수 이고 와 는 의 선형 함수입니다 따라서 각 모서리에 걸친 적분의 적분은 다항식 함수 가됩니다.wvuuv.t0|vu|.xytdxdydt.t, 작은 것으로 쉽게 평가됩니다 kl.


이 분석을 구현 하는 것은 구성 요소를 코딩하는 것만 큼 간단합니다. 가장 낮은 수준에서 우리는 선분에 다항식 한 형태를 통합하는 함수가 필요합니다. 더 높은 수준의 함수는 이들을 모아 중심 및 관성 텐서를 얻기 위해 원시 및 중심 모멘트를 계산하며, 마지막으로 텐서에서 작동하여 주 축 (축척 된 고유 벡터)을 찾을 수 있습니다. R수행 아래 코드이 작동합니다. 그것은 효율성을 강조하지 않습니다. 그것은 전술 한 분석의 실제 적용만을 설명하기위한 것입니다. 각 기능은 간단하며 명명 규칙은 분석 기능과 유사합니다.

이 코드에는 유효한 폐쇄 형, 간단하게 연결된 비 자체 교차 다각형을 생성하는 절차가 포함되어 있습니다 (원형을 따라 점을 임의로 변형하고 시작 정점을 최종 점으로 포함하여 폐쇄 루프를 생성 함). 다음은 폴리곤을 플로팅하고 정점을 표시하고 바리 센터에 인접하며 주축을 빨간색 (최대) 및 파란색 (최소)으로 표시하여 다각형 중심의 양의 방향 좌표계를 작성하는 몇 가지 명령문입니다.

다각형과 주축을 보여주는 그림

#
# 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와, 대단한 답변입니다!
amoeba

7

편집 : whuber가 이미 응답했음을 알지 못했습니다. 나는 이것을 문제에 대한 또 다른 (아마도 우아하지 않은) 접근법의 예로 남겨 둘 것이다.

공분산 행렬

허락하다 (X,Y) 다각형의 균일 분포에서 랜덤 포인트 P 지역으로 A. 공분산 행렬은 다음과 같습니다.

C=[CXXCXYCXYCYY]

어디 CXX=E[X2] 의 분산입니다 X, CYY=E[Y2] 의 분산입니다 Y, CXY=E[XY] 사이의 공분산입니다 XY. 다각형의 질량 중심이 원점에 있기 때문에 평균이 0이라고 가정합니다. 균일 분포는 일정한 확률 밀도를 할당합니다1A 모든 지점에 P따라서 :

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

삼각 분할

복잡한 지역에 직접 통합하려고하는 대신 P파티셔닝을 통해 문제를 단순화 할 수 있습니다. P 으로 n 삼각 소구역 :

P=T1Tn

귀하의 예에서 가능한 파티션은 다음과 같습니다.

enter image description here

삼각 분할을 생성하는 다양한 방법이 있습니다 ( 여기 참조 ). 예를 들어 정점 의 들로네 삼각 분할 (Delaunay Triangulation) 을 계산 한 다음 바깥쪽으로 떨어지는 모서리를 버릴 수 있습니다.P( 예와 같이 볼록 하지 않을 수 있으므로 ).

적분 P 그런 다음 삼각형 위에 적분의 합계로 나눌 수 있습니다.

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

삼각형에는 멋지고 간단한 경계가 있으므로 이러한 적분을 쉽게 평가할 수 있습니다.

삼각형에 통합

삼각형을 통합하는 다양한 방법이 있습니다. 이 경우 삼각형을 단위 사각형에 매핑하는 트릭 을 사용했습니다 . Barycentric Coordint로 변환 하는 것이 더 나은 옵션 일 수 있습니다.

임의의 삼각형에 대한 위의 적분에 대한 솔루션은 다음과 같습니다. T 꼭짓점으로 정의 (x1,y1),(x2,y2),(x3,y3). 허락하다:

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

그때:

(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 방향 삼각형 을 허용함으로써이를 단순화 할 수 있으므로 적절한 삼각 측량이 필요 없습니다. 대신 임의의 중심을 설정할 수 있습니다영형 삼각형 위에 (서명 된) 값을 합산 영형나는나는+1:이것은 덜 까다로워서 종종 수행되는 방법입니다. 이러한 합산은 본질적으로 그린의 정리를 적용하는 것과 동일하다는 것을 쉽게 알 수 있습니다. 합산의 각 항은 궁극적으로 모서리의 함수이므로나는나는+1.이 방법은 quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm 의 "Area"섹션에 설명되어 있습니다.
whuber

@ whuber 흥미로운, 이것을 지적 해 주셔서 감사합니다
user20160

Both of these answers are good, albeit a bit over my education level. Once I'm sure I fully understand them I'll try to figure out who gets the bounty.
Ingolifs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.