Bagaimana menemukan matriks kovarians poligon?


9

Bayangkan Anda memiliki poligon yang didefinisikan oleh seperangkat koordinat (x1,y1)...(xn,yn) dan pusat massanya adalah pada (0,0) . Anda dapat memperlakukan poligon sebagai distribusi seragam dengan batas poligon. masukkan deskripsi gambar di sini

Saya mencari metode yang akan menemukan matriks kovarian poligon .

Saya menduga bahwa matriks kovarians poligon terkait erat dengan momen kedua dari area , tetapi apakah mereka setara, saya tidak yakin. Rumus yang ditemukan dalam artikel wikipedia yang saya tautkan tampaknya (tebakan di sini, tidak terlalu jelas bagi saya dari artikel) untuk merujuk pada inersia rotasi di sekitar sumbu x, y dan z daripada sumbu utama poligon.

(Kebetulan, kalau ada yang bisa mengarahkan saya ke cara menghitung sumbu utama poligon, itu juga akan berguna bagi saya)

Ini tergoda untuk hanya melakukan PCA pada koordinat , tetapi hal itu berjalan ke masalah bahwa koordinat tidak selalu tersebar merata di sekitar poligon, dan karena itu tidak mewakili kepadatan poligon. Contoh ekstrem adalah garis besar North Dakota, yang poligonnya didefinisikan oleh sejumlah besar titik mengikuti sungai Merah, ditambah hanya dua titik lagi yang menentukan tepi barat negara bagian.


Dengan "menemukan", saya berasumsi hanya mengambil sampel dari poligon, lalu menghitung kovarians sampel, bukan apa yang ada dalam pikiran Anda?
Stephan Kolassa

Selain itu, dapatkah Anda mengedit posting untuk menyertakan koordinat untuk poligon Anda, sehingga orang-orang dapat bermain-main dengannya?
Stephan Kolassa

1
@StephanKolassa Maksud saya memperlakukan poligon sebagai kepadatan probabilitas bivariat yang seragam dengan batas poligon. Tentu, Anda dapat mencicipi poin dan batasnya adalah hal yang sama, tetapi saya mencari metode a-priori. Gambar itu hanyalah ilustrasi dari cat yang saya gunakan. Data dunia nyata yang ingin saya gunakan adalah garis besar negara bagian dan wilayah.
Ingolifs

1
Anda benar bahwa istilah umum untuk "matriks kovarians" adalah momen inersia atau momen kedua . Kapak utama berorientasi pada eigendirections-nya. Menjalankan PCA pada koordinat tidak benar: itu sama saja dengan mengasumsikan semua massa terletak pada simpul. Metode perhitungan barycenter yang paling langsung - momen pertama - dibahas dalam posting saya di gis.stackexchange.com/a/22744/664 . Momen kedua dihitung dengan cara yang sama dengan modifikasi kecil. Pertimbangan khusus diperlukan di bidang ini.
whuber

2
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

Jawaban:


10

Mari kita lakukan analisis terlebih dahulu.

Misalkan dalam poligon kepadatan probabilitasnya adalah fungsi proporsional Maka konstanta proporsionalitas adalah kebalikan dari integral atas poligon,Pp(x,y).p

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

The barycenter dari poligon adalah titik koordinat rata-rata, dihitung sebagai momen pertama mereka. Yang pertama adalah

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

The tensor inersia dapat direpresentasikan sebagai array simetris saat kedua dihitung setelah menerjemahkan poligon untuk menempatkan barycenter pada titik asal: yaitu, matriks momen kedua pusat

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

di mana berkisar dari hingga hingga Tensor itu sendiri - alias matriks kovarians - adalah(k,l)(2,0)(1,1)(0,2).

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

PCA menghasilkan sumbu utama dari ini adalah vektor satuan eigen yang diukur oleh nilai eigennya.I(P)P :P:


Selanjutnya, mari kita cari tahu cara melakukan perhitungan. Karena poligon disajikan sebagai urutan simpul yang menggambarkan batas berorientasi adalah wajar untuk memanggilP,

Teorema Green: mana adalah satu-bentuk yang didefinisikan di lingkungan dan

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

Misalnya, dengan dan kepadatan konstan ( mis. , Seragam) kita dapat (dengan inspeksi) memilih salah satu dari banyak solusi, sepertidω=xkyldxdyp,

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

Intinya adalah bahwa integral kontur mengikuti segmen garis yang ditentukan oleh urutan simpul. Segmen baris apa pun dari vertex ke vertex dapat diparameterisasi dengan variabel nyata dalam formuliruvt

tu+tw

di mana adalah arah normal satuan dari keNilai karena itu berkisar dari hingga Di bawah parameterisasi ini dan adalah fungsi linear dari dan dan adalah fungsi linear dari Dengan demikian integran dari integral kontur atas setiap tepi menjadi fungsi polinom dari yang mudah dievaluasi untuk kecil danwvuuv.t0|vu|.xytdxdydt.t,kl.


Menerapkan analisis ini sama mudahnya dengan mengkodekan komponen-komponennya. Pada level terendah kita akan memerlukan fungsi untuk mengintegrasikan satu-bentuk polinomial pada segmen garis. Fungsi tingkat yang lebih tinggi akan mengumpulkan ini untuk menghitung momen mentah dan pusat untuk mendapatkan barycenter dan tensor inersia, dan akhirnya kita dapat beroperasi pada tensor tersebut untuk menemukan sumbu utama (yang merupakan vektor eigen yang diskalakan). The Rkode di bawah melakukan pekerjaan ini. Itu tidak membuat pretensi efisiensi: ini dimaksudkan hanya untuk menggambarkan penerapan praktis dari analisis sebelumnya. Setiap fungsi mudah dan konvensi penamaan sejajar dengan analisis.

Termasuk dalam kode adalah prosedur untuk menghasilkan poligon tertutup, hanya terhubung, non-self-berpotongan yang valid (dengan mendeformasi secara acak titik-titik di sepanjang lingkaran dan termasuk titik awal sebagai titik terakhir untuk membuat loop tertutup). Berikut ini adalah beberapa pernyataan untuk memplot poligon, menampilkan simpulnya, berdampingan dengan barycenter, dan memplot sumbu utama dalam warna merah (terbesar) dan biru (terkecil), menciptakan sistem koordinat poligon-sentris berorientasi positif.

Gambar menunjukkan sumbu poligon dan utama

#
# 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, ini jawaban yang bagus!
amoeba

7

Sunting: Tidak menyadari bahwa whuber sudah menjawab. Saya akan meninggalkan ini sebagai contoh dari pendekatan lain (mungkin kurang elegan) untuk masalah ini.

Matriks kovarians

Mari menjadi titik acak dari distribusi seragam pada poligon dengan luas . Matriks kovarians adalah:(X,Y)PA

C=[CXXCXYCXYCYY]

di mana adalah varian , adalah varian , dan adalah kovarians antara dan . Ini mengasumsikan nol rata-rata, karena pusat massa poligon terletak di titik asal. Distribusi seragam memberikan kepadatan probabilitas konstan ke setiap titik dalam , jadi:CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

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

Triangulasi

Alih-alih mencoba mengintegrasikan langsung ke wilayah rumit seperti , kita dapat menyederhanakan masalah dengan mempartisi ke dalam subregional segitiga:PPn

P=T1Tn

Dalam contoh Anda, satu kemungkinan partisi tampak seperti ini:

masukkan deskripsi gambar di sini

Ada berbagai cara untuk menghasilkan triangulasi (lihat di sini ). Misalnya, Anda bisa menghitung triangulasi simpul Delaunay , kemudian membuang sisi-sisi yang berada di luar (karena ini mungkin bukan cembung seperti pada contoh).P

Integral over kemudian dapat dibagi menjadi jumlah integral atas segitiga:P

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

Segitiga memiliki batas yang bagus dan sederhana sehingga integral ini lebih mudah untuk dievaluasi.

Mengintegrasikan lebih dari segitiga

Ada berbagai cara untuk berintegrasi dengan segitiga. Dalam hal ini, saya menggunakan trik yang melibatkan pemetaan segitiga ke unit square. Mengubah ke koordinat barycentric mungkin menjadi pilihan yang lebih baik.

Berikut adalah solusi untuk integral di atas, untuk segitiga sembarang didefinisikan oleh simpul . Membiarkan:T(x1,y1),(x2,y2),(x3,y3)

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

Kemudian:

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

Menyatukan semuanya

Biarkan dan berisi koordinat x / y dari simpul untuk setiap segitiga , seperti di atas. Masukkan ke dalam untuk setiap segitiga, mencatat bahwa ketentuan daerah dibatalkan. Ini memberikan solusinya:vxivyiTi(3)(2)

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

Kapak utama

Sumbu utama diberikan oleh vektor eigen dari matriks kovarian , seperti pada PCA. Tidak seperti PCA, kami memiliki ekspresi analitik untuk , daripada harus memperkirakannya dari titik data sampel. Perhatikan bahwa simpul itu sendiri bukan sampel yang representatif dari distribusi seragam pada , jadi orang tidak bisa begitu saja mengambil matriks kovarians sampel dari simpul tersebut. Tapi, * adalah * fungsi simpul yang relatif sederhana, seperti yang terlihat pada .CCPC(4)


2
+1 Ini dapat disederhanakan dengan memungkinkan segitiga berorientasi , sehingga menghilangkan kebutuhan untuk triangulasi yang tepat. Alih-alih, Anda bisa langsung membuat pusat arbitrer dan menjumlahkan nilai-nilai (yang ditandatangani) di atas segitiga inilah yang sering dilakukan karena jauh lebih tidak rewel. Sangat mudah untuk melihat bahwa penjumlahan tersebut pada dasarnya adalah hal yang sama dengan menerapkan Green's Theorem, karena setiap istilah dalam penjumlahan akhirnya adalah fungsi dari edgePendekatan ini diilustrasikan di bagian "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 Menarik, terima kasih telah menunjukkan ini
user20160

Kedua jawaban ini baik, meskipun sedikit di atas tingkat pendidikan saya. Setelah saya yakin saya benar-benar mengerti mereka, saya akan mencoba mencari tahu siapa yang mendapat hadiah.
Ingolifs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.