Làm thế nào để tìm ma trận hiệp phương sai của một đa giác?


9

Hãy tưởng tượng bạn có một đa giác được xác định bởi một tập hợp tọa độ và tâm khối lượng của nó là . Bạn có thể coi đa giác là phân phối đồng đều với ranh giới đa giác. (x1,y1)...(xn,yn)(0,0)nhập mô tả hình ảnh ở đây

Tôi đang theo một phương pháp sẽ tìm thấy ma trận hiệp phương sai của một đa giác .

Tôi nghi ngờ rằng ma trận hiệp phương sai của một đa giác có liên quan chặt chẽ đến khoảnh khắc thứ hai của khu vực , nhưng liệu chúng có tương đương hay không tôi không chắc chắn. Các công thức được tìm thấy trong bài viết trên wikipedia mà tôi đã liên kết dường như (một phỏng đoán ở đây, nó không đặc biệt rõ ràng với tôi từ bài viết) để đề cập đến quán tính quay quanh các trục x, y và z thay vì các trục chính của đa giác.

(Ngẫu nhiên, nếu bất cứ ai có thể chỉ cho tôi cách tính các trục chính của đa giác, điều đó cũng hữu ích với tôi)

Thật hấp dẫn khi chỉ thực hiện PCA trên tọa độ , nhưng làm như vậy sẽ gặp phải vấn đề là tọa độ không nhất thiết phải trải đều xung quanh đa giác, và do đó không đại diện cho mật độ của đa giác. Một ví dụ cực đoan là phác thảo của Bắc Dakota, có đa giác được xác định bởi một số lượng lớn các điểm theo sông Hồng, cộng với chỉ có hai điểm nữa xác định rìa phía tây của tiểu bang.


Bằng cách "tìm", tôi giả sử đơn giản là lấy mẫu từ đa giác, sau đó tính toán hiệp phương sai của các mẫu, đó không phải là điều bạn có trong đầu sao?
Stephan Kolassa

Ngoài ra, bạn có thể chỉnh sửa bài đăng của mình để bao gồm tọa độ cho đa giác của mình, để mọi người có thể chơi xung quanh nó không?
Stephan Kolassa

1
@StephanKolassa Ý tôi là coi đa giác là mật độ xác suất bivariate đồng nhất với ranh giới đa giác. Chắc chắn, bạn có thể lấy mẫu điểm và giới hạn sẽ là điều tương tự, nhưng tôi đang tìm kiếm một phương pháp tiên nghiệm. Hình ảnh chỉ là một minh họa từ sơn mà tôi đã sử dụng. Dữ liệu trong thế giới thực mà tôi dự định sử dụng là những phác thảo về các tiểu bang và khu vực.
Ingolifs

1
Bạn đúng rằng thuật ngữ thông thường cho "ma trận hiệp phương sai" là mô men quán tính hoặc giây thứ hai . Các trục chính được định hướng trong eigendirir của nó. Chạy PCA trên tọa độ là không chính xác: nó tương đương với giả định tất cả khối lượng được đặt ở các đỉnh. Các phương pháp tính toán trực tiếp nhất của barycenter - khoảnh khắc đầu tiên - sẽ được thảo luận trong bài viết của tôi tại gis.stackexchange.com/a/22744/664 . Những khoảnh khắc thứ hai được tính toán theo cùng một cách với những sửa đổi nhỏ. Cần xem xét đặc biệt trên quả cầu.
whuber

2
Nó hoạt động theo cách khác: tính toán tenxơ quán tính và tìm các trục chính của nó từ đó. Kỹ thuật trong trường hợp của bạn liên quan đến Định lý Green, cho thấy các tích phân cần thiết có thể được tính là các tích phân đường viền xung quanh của một dạng trong đóCác dạng như vậy rất dễ tìm vì mọi kết hợp tuyến tính phù hợp của và sẽ hoạt động. Tích phân đường viền là tổng của các tích phân trên các cạnh. P ω d ω = x k y l d x d y . x k y l + 1 d x x k + 1 y l d y
μk,l(P)=Pxkyldxdy
Pωdω=xkyldxdy.xkyl+1dxxk+1yldy
whuber

Câu trả lời:


10

Trước tiên hãy làm một số phân tích.

Giả sử trong đa giác mật độ xác suất của nó là hàm tỷ lệ Khi đó hằng số tỷ lệ là nghịch đảo của tích phân so với đa giác,Pp(x,y).p

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

Các khối tâm hệ thiên thể của đa giác là điểm tọa độ trung bình, tính bằng những khoảnh khắc đầu tiên của họ. Điều thứ nhất là

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

Các tenxơ quán tính có thể được biểu diễn dưới dạng mảng đối xứng của các khoảnh khắc thứ hai được tính toán sau khi dịch đa giác để đặt barycenter của nó ở gốc: đó là ma trận của các khoảnh khắc thứ hai trung tâm

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

trong đó nằm trong khoảng từ đến đến Bản thân tenor-- hay còn gọi là ma trận hiệp phương sai - là(k,l)(2,0)(1,1)(0,2).

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

Một PCA của mang lại các trục chính của đây là các hàm riêng của đơn vị được chia tỷ lệ theo giá trị riêng của chúng.I(P)P :P:


Tiếp theo, hãy tìm cách làm các phép tính. Bởi vì đa giác được trình bày dưới dạng một chuỗi các đỉnh mô tả ranh giới định hướng của nó nên việc gọi ra là điều tự nhiênP,

Định lý của Green: trong đó là một dạng được xác định trong một vùng lân cận của và

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

Chẳng hạn, với và mật độ ( tức là đồng nhất) chúng tôi có thể (bằng cách kiểm tra) chọn một trong số nhiều các giải pháp, chẳng hạn nhưdω=xkyldxdyp , ω ( x , y ) = - 1p,

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

Điểm của điều này là tích phân đường viền tuân theo các đoạn đường được xác định bởi chuỗi các đỉnh. Bất kỳ phân đoạn dòng nào từ vertex đến vertex đều có thể được tham số hóa bởi một biến thực trong biểu mẫuuvt

tu+tw

trong đó là hướng đơn vị bình thường từ đếnDo đó, các giá trị của nằm trong khoảng từ đến Theo tham số này và là các hàm tuyến tính của và và là các hàm tuyến tính của Do đó, tích phân của tích phân đường viền trên mỗi cạnh trở thành hàm đa thức của được đánh giá dễ dàng cho nhỏ vàwvuuv.t0|vu|.xytdxdydt.t , k l .t,kl.


Việc thực hiện phân tích này cũng đơn giản như mã hóa các thành phần của nó. Ở mức thấp nhất, chúng ta sẽ cần một hàm để tích hợp một dạng đa thức trên một đoạn thẳng. Các hàm cấp cao hơn sẽ tổng hợp các hàm này để tính toán các khoảnh khắc thô và trung tâm để thu được barycenter và tenor quán tính, và cuối cùng chúng ta có thể vận hành trên tenxơ đó để tìm các trục chính (là các hàm riêng của nó). Các Rmã dưới đây thực hiện công việc này. Nó không giả vờ về hiệu quả: nó chỉ nhằm mục đích minh họa ứng dụng thực tế của phân tích đã nói ở trên. Mỗi chức năng là đơn giản và các quy ước đặt tên song song với các quy ước phân tích.

Bao gồm trong mã là một thủ tục để tạo các đa giác khép kín, được kết nối đơn giản, không tự giao nhau (bằng cách biến đổi ngẫu nhiên các điểm dọc theo một vòng tròn và bao gồm cả đỉnh bắt đầu làm điểm cuối cùng của nó để tạo ra một vòng khép kín). Tiếp theo đây là một vài câu lệnh để vẽ đa giác, hiển thị các đỉnh của nó, tiếp giáp với barycenter và vẽ các trục chính có màu đỏ (lớn nhất) và màu xanh lam (nhỏ nhất), tạo ra một hệ tọa độ hướng tích cực theo hướng đa giác.

Hình hiển thị đa giác và trục chính

#
# 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, đây là một câu trả lời tuyệt vời!
amip

7

Chỉnh sửa: Không nhận thấy rằng whuber đã trả lời. Tôi sẽ để điều này như một ví dụ về một cách tiếp cận khác (có lẽ ít thanh lịch hơn) cho vấn đề.

Ma trận hiệp phương sai

Hãy là một điểm ngẫu nhiên từ sự phân bố đồng đều trên một đa giác với diện tích . Ma trận hiệp phương sai là:(X,Y)PA

C=[CXXCXYCXYCYY]

CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

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

Tam giác

Thay vì cố gắng trực tiếp tích hợp trên một khu vực phức tạp như , chúng ta có thể đơn giản hóa vấn đề bằng cách phân vùng vào tiểu vùng tam giác:PPn

P=T1Tn

Trong ví dụ của bạn, một phân vùng có thể trông như thế này:

nhập mô tả hình ảnh ở đây

Có nhiều cách khác nhau để tạo ra một tam giác (xem tại đây ). Ví dụ: bạn có thể tính toán tam giác Delaunay của các đỉnh, sau đó loại bỏ các cạnh nằm ngoài (vì nó có thể không trùng khớp như trong ví dụ).P

Các tích phân trên sau đó có thể được chia thành các tổng của các tích phân trên các tam giác:P

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

Một hình tam giác có các ranh giới đẹp, đơn giản để các tích phân này dễ đánh giá hơn.

Tích hợp trên hình tam giác

Có nhiều cách khác nhau để tích hợp trên hình tam giác. Trong trường hợp này, tôi đã sử dụng một mẹo liên quan đến việc ánh xạ một hình tam giác vào ô vuông đơn vị. Chuyển đổi sang tọa độ barycentric có thể là một lựa chọn tốt hơn.

Dưới đây là các giải pháp cho các tích phân ở trên, cho một tam giác tùy ý được xác định bởi các đỉnh . Để cho:T(x1,y1),(x2,y2),(x3,y3)

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

Sau đó:

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

Đặt mọi thứ lại với nhau

Đặt và chứa tọa độ x / y của các đỉnh cho mỗi tam giác , như trên. Cắm vào cho mỗi tam giác, lưu ý rằng các điều khoản khu vực hủy bỏ. Điều này đưa ra giải pháp:vxivyiTi(3)(2)

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

Trục chính

Các trục chính được đưa ra bởi các hàm riêng của ma trận hiệp phương sai , giống như trong PCA. Không giống như PCA, chúng tôi có biểu thức phân tích cho , thay vì phải ước tính nó từ các điểm dữ liệu được lấy mẫu. Lưu ý rằng bản thân các đỉnh không phải là mẫu đại diện từ phân bố đồng đều trên , do đó, người ta không thể đơn giản lấy ma trận hiệp phương sai mẫu của các đỉnh. Nhưng, * là * một hàm tương đối đơn giản của các đỉnh, như đã thấy trong .CCPC(4)


2
+1 Điều này có thể được đơn giản hóa bằng cách cho phép các tam giác định hướng , do đó loại bỏ sự cần thiết phải có một tam giác thích hợp. Thay vào đó, bạn chỉ có thể thiết lập một trung tâm tùy ý và tính tổng các giá trị (đã ký) trên các tam giác đây là cách nó thường được thực hiện vì nó ít phức tạp hơn. Thật dễ dàng để thấy rằng một tổng kết như vậy về cơ bản giống như áp dụng Định lý của Green, bởi vì mỗi thuật ngữ trong tổng kết cuối cùng là một hàm của cạnhCách tiếp cận này được minh họa trong phần "Khu vực" tại quantdec.com/SYSEN597/GTKAV/section2/ch CHƯƠNG_11.htm . O P i P i + 1 : P i P i + 1 .OOPiPi+1:PiPi+1.
whuber

@whuber Thú vị, cảm ơn vì đã chỉ ra điều này
user20160

Cả hai câu trả lời này đều tốt, mặc dù có một chút so với trình độ học vấn của tôi. Khi tôi chắc chắn tôi hoàn toàn hiểu họ, tôi sẽ cố gắng tìm ra ai là người nhận tiền thưởng.
Ingolifs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.