วิธีการค้นหาเมทริกซ์ความแปรปรวนร่วมของรูปหลายเหลี่ยม?


9

ลองนึกภาพคุณมีรูปหลายเหลี่ยมที่กำหนดโดยชุดพิกัด (x1,y1)...(xn,yn) และศูนย์กลางของมวลอยู่ที่ (0,0). คุณสามารถถือว่ารูปหลายเหลี่ยมเป็นการกระจายแบบสม่ำเสมอด้วยขอบเขตรูปหลายเหลี่ยม ป้อนคำอธิบายรูปภาพที่นี่

ฉันหลังจากวิธีการที่จะได้พบกับการเมทริกซ์ความแปรปรวนของรูปหลายเหลี่ยม

ฉันสงสัยว่าเมทริกซ์ความแปรปรวนร่วมของรูปหลายเหลี่ยมนั้นเกี่ยวข้องอย่างใกล้ชิดกับช่วงเวลาที่สองของพื้นที่แต่ไม่ว่าพวกมันจะเท่ากันหรือไม่ฉันไม่แน่ใจ สูตรที่พบในบทความวิกิพีเดียที่ฉันเชื่อมโยงดูเหมือน (คาดเดาที่นี่มันไม่ชัดเจนโดยเฉพาะอย่างยิ่งกับฉันจากบทความ) เพื่ออ้างถึงความเฉื่อยหมุนรอบแกน x, y และ z มากกว่าแกนหลักของรูปหลายเหลี่ยม

(บังเอิญถ้าใครสามารถชี้ให้ฉันถึงวิธีการคำนวณแกนหลักของรูปหลายเหลี่ยมนั้นจะเป็นประโยชน์กับฉันด้วย)

เป็นที่น่าดึงดูดใจที่จะเพียงแค่ทำการ PCA บนพิกัดแต่การทำเช่นนี้จะทำให้เกิดปัญหาที่พิกัดไม่จำเป็นต้องกระจายทั่วรูปหลายเหลี่ยมอย่างสม่ำเสมอและดังนั้นจึงไม่ได้เป็นตัวแทนของความหนาแน่นของรูปหลายเหลี่ยม ตัวอย่างสุดขั้วคือโครงร่างของนอร์ทดาโคตาซึ่งรูปหลายเหลี่ยมถูกกำหนดโดยจุดจำนวนมากที่ตามแม่น้ำแดงรวมทั้งอีกสองจุดที่กำหนดขอบตะวันตกของรัฐ


ด้วย "ค้นหา" ฉันถือว่าการสุ่มตัวอย่างจากรูปหลายเหลี่ยมจากนั้นคำนวณความแปรปรวนร่วมของตัวอย่างไม่ใช่สิ่งที่คุณมีอยู่ในใจ
Stephan Kolassa

นอกจากนี้คุณสามารถแก้ไขโพสต์เพื่อรวมพิกัดสำหรับรูปหลายเหลี่ยมของคุณเพื่อให้ผู้คนสามารถเล่นกับมันได้หรือไม่
Stephan Kolassa

1
@StephanKolassa ฉันหมายถึงการรักษารูปหลายเหลี่ยมเป็นความหนาแน่นของความน่าจะเป็น bivariate สม่ำเสมอกับขอบเขตเหลี่ยม แน่นอนว่าคุณสามารถสุ่มตัวอย่างคะแนนและขีด จำกัด จะเป็นสิ่งเดียวกัน แต่ฉันกำลังมองหาวิธีการเบื้องต้น ภาพเป็นเพียงภาพประกอบจากสีที่ฉันใช้ ข้อมูลในโลกแห่งความเป็นจริงที่ฉันตั้งใจจะใช้เป็นโครงร่างของรัฐและภูมิภาค
Ingolifs

1
คุณถูกต้องว่าระยะปกติสำหรับ "แปรปรวนเมทริกซ์" เป็นโมเมนต์ความเฉื่อยหรือสองช่วงเวลา แกนหลักอยู่ในทิศทาง eigendirections การเรียกใช้ PCA บนพิกัดไม่ถูกต้อง: มันเท่ากับว่าสมมติว่ามวลทั้งหมดอยู่ที่จุดยอด วิธีการที่ตรงที่สุดของการคำนวณของ barycenter - ค่าแรกช่วงเวลา - จะกล่าวถึงในการโพสต์ของฉันที่gis.stackexchange.com/a/22744/664 ช่วงเวลาที่สองคำนวณด้วยวิธีเดียวกันกับการแก้ไขเล็กน้อย ต้องพิจารณาเป็นพิเศษในทรงกลม
whuber

2
มันทำงานในวิธีอื่น: คำนวณเมตริกซ์เฉื่อยและค้นหาแกนหลักจากนั้น เทคนิคในกรณีของคุณเกี่ยวข้องกับทฤษฎีบทของกรีนซึ่งแสดงให้เห็นว่าอินทิกรัลจำเป็น
μk,ล.(P)=PxkYล.dxdY
สามารถคำนวณได้ว่าอินทิกรัลรูปร่างรอบ ๆ P ของรูปแบบเดียว ω ที่ไหน dω=xkYล.dxdY. รูปแบบดังกล่าวหาได้ง่ายเพราะมีการรวมกันเชิงเส้นที่เหมาะสมของ xkYล.+1dx และ xk+1Yล.dYจะทำงาน. อินทิกรัลของรูปร่างคือผลรวมของปริพันธ์บนขอบ
whuber

คำตอบ:


10

ลองทำการวิเคราะห์ก่อน

สมมติว่าภายในรูปหลายเหลี่ยม P ความหนาแน่นของความน่าจะเป็นเป็นฟังก์ชันแบบสัดส่วน พี(x,Y). จากนั้นค่าคงที่ของสัดส่วนก็คือค่าผกผันของอินทิกรัลของ พี เหนือรูปหลายเหลี่ยม

μ0,0(P)=Pพี(x,Y)dxdY.

barycenterของรูปหลายเหลี่ยมเป็นจุดพิกัดเฉลี่ยคำนวณช่วงเวลาแรกของพวกเขา อันแรกก็คือ

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

เมตริกซ์เฉื่อยสามารถแสดงเป็นอาร์เรย์สมมาตรของช่วงเวลาที่สองคำนวณหลังจากแปลรูปหลายเหลี่ยมที่จะนำ barycenter ที่กำเนิด: นั่นคือเมทริกซ์ของช่วงเวลาที่สองกลาง

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

ที่ไหน (k,l) ช่วงจาก (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+ยังไม่มีข้อความ(x,Y)dY เป็นรูปแบบหนึ่งที่กำหนดไว้ในละแวกของ P และ
dω=(xยังไม่มีข้อความ(x,Y)-YM(x,Y))dxdY.

ตัวอย่างเช่นกับ dω=xkYล.dxdYและความหนาแน่นคงที่ ( เช่นสม่ำเสมอ)พี, เราอาจ (โดยการตรวจสอบ) เลือกหนึ่งในหลาย ๆ วิธีเช่น

ω(x,Y)=-1ล.+1xkYล.+1dx.

จุดนี้คือสิ่งที่อินทิกรัลของรูปร่างตามส่วนของเส้นตรงที่กำหนดโดยลำดับของจุดยอด ส่วนของเส้นใดก็ได้จากจุดสุดยอดยู เพื่อจุดสุดยอด โวลต์ สามารถแปรค่าโดยตัวแปรจริง เสื้อ ในรูปแบบ

เสื้อยู+เสื้อW

ที่ไหน Wαโวลต์-ยู เป็นทิศทางปกติของหน่วยจาก ยู ถึง โวลต์. ค่าของ เสื้อ ดังนั้นช่วงจาก 0 ถึง |โวลต์-ยู|. ภายใต้การปรับพารามิเตอร์นี้ x และ Y ฟังก์ชั่นเชิงเส้นของ เสื้อ และ dx และ dY ฟังก์ชั่นเชิงเส้นของ dเสื้อ. ดังนั้นปริพันธ์และอินทิกรัลของเส้นขอบเหนือขอบแต่ละอันจึงกลายเป็นฟังก์ชันพหุนามของเสื้อ, ซึ่งประเมินได้ง่ายสำหรับขนาดเล็ก k และ ล..


การใช้การวิเคราะห์นี้ตรงไปตรงมาเหมือนกับการเขียนโค้ดส่วนประกอบ ในระดับต่ำสุดเราจะต้องมีฟังก์ชั่นเพื่อรวมพหุนามหนึ่งรูปแบบเหนือส่วนของเส้นตรง ฟังก์ชั่นระดับที่สูงขึ้นจะรวมสิ่งเหล่านี้เพื่อคำนวณช่วงเวลาดิบและตอนกลางเพื่อรับ barycenter และเทนเซอร์แรงเฉื่อยและในที่สุดเราก็สามารถทำงานกับเทนเซอร์นั้นเพื่อค้นหาแกนหลัก Rโค้ดด้านล่างนี้ดำเนินงานนี้ ไม่มีข้อ จำกัด เรื่องประสิทธิภาพ: มีวัตถุประสงค์เพื่อแสดงให้เห็นถึงการใช้งานจริงของการวิเคราะห์ที่กล่าวมาข้างต้น แต่ละฟังก์ชั่นนั้นตรงไปตรงมาและอนุสัญญาการตั้งชื่อนั้นขนานกับการวิเคราะห์

รวมอยู่ในรหัสเป็นขั้นตอนในการสร้างปิดที่ถูกต้องเพียงเชื่อมต่อรูปหลายเหลี่ยมที่ไม่ได้ตัดตัวเอง (โดยการสุ่มจุดเปลี่ยนรูปตามวงกลมและรวมจุดสุดยอดเริ่มต้นเป็นจุดสุดท้ายเพื่อสร้างวงปิด) ต่อไปนี้เป็นข้อความสองสามข้อในการพล็อตรูปหลายเหลี่ยมแสดงจุดยอดติด barycenter และพล็อตแกนหลักในสีแดง (ใหญ่ที่สุด) และสีฟ้า (เล็กที่สุด) สร้างระบบพิกัดรูปหลายเหลี่ยมเชิงบวก

รูปที่แสดงรูปหลายเหลี่ยมและแกนหลัก

#
# 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 ว้าวนี่เป็นคำตอบที่ยอดเยี่ยม!
อะมีบา

7

แก้ไข: ไม่ได้สังเกตว่า whuber ตอบแล้ว ฉันจะทิ้งเรื่องนี้ไว้เป็นตัวอย่างของแนวทางอื่น (อาจจะดูสง่าน้อยกว่า) สำหรับปัญหา

เมทริกซ์ความแปรปรวนร่วม

ปล่อย (X,Y) เป็นจุดสุ่มจากการกระจายตัวของรูปหลายเหลี่ยม P กับพื้นที่ A. เมทริกซ์ความแปรปรวนร่วมคือ:

=[XXXYXYYY]

ที่ไหน XX=E[X2] คือความแปรปรวนของ X, YY=E[Y2] คือความแปรปรวนของ Yและ XY=E[XY] คือความแปรปรวนร่วมระหว่าง X และ Y. สิ่งนี้จะถือว่าค่าเฉลี่ยเป็นศูนย์เนื่องจากจุดศูนย์กลางมวลของรูปหลายเหลี่ยมตั้งอยู่ที่จุดกำเนิด การกระจายแบบสม่ำเสมอกำหนดความหนาแน่นของความน่าจะเป็นคงที่1A ทุกจุดใน Pดังนั้น:

(1)XX=1APx2dVYY=1APY2dVXY=1APxYdV

triangulation

แทนที่จะพยายามบูรณาการโดยตรงในพื้นที่ที่ซับซ้อนเช่น Pเราสามารถทำให้ปัญหาง่ายขึ้นโดยการแบ่งพาร์ติชัน P เข้าไป n ภูมิภาคย่อยสามเหลี่ยม:

P=T1Tn

ในตัวอย่างของคุณการแบ่งพาร์ติชันที่เป็นไปได้มีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

มีหลายวิธีในการสร้างสมการ (ดูที่นี่ ) ตัวอย่างเช่นคุณสามารถคำนวณDelaunay triangulationของจุดยอดแล้วทิ้งขอบที่อยู่ข้างนอกP(เนื่องจากอาจไม่ใช่คอนเน็กซ์ตามตัวอย่าง)

ปริพันธ์มากกว่า P จากนั้นสามารถแบ่งออกเป็นผลรวมของปริพันธ์บนสามเหลี่ยมได้:

(2)XX=1AΣผม=1nTผมx2dVYY=1AΣผม=1nTผมY2dVXY=1AΣผม=1nTผมxYdV

สามเหลี่ยมมีขอบเขตที่ดีและเรียบง่ายดังนั้นอินทิกรัลเหล่านี้จึงประเมินได้ง่ายกว่า

บูรณาการมากกว่ารูปสามเหลี่ยม

มีหลายวิธีในการรวมเข้ากับสามเหลี่ยม ในกรณีนี้ฉันใช้เคล็ดลับที่เกี่ยวข้องกับการทำแผนที่สามเหลี่ยมกับสี่เหลี่ยมหน่วย การแปลงเป็นค่าพิกัดไบโอเซนทริกอาจเป็นตัวเลือกที่ดีกว่า

นี่คือวิธีแก้ปัญหาสำหรับอินทิกรัลด้านบนสำหรับสามเหลี่ยมโดยพลการ T กำหนดโดยจุดยอด (x1,Y1),(x2,Y2),(x3,Y3). ปล่อย:

โวลต์x=[x1x2x3]โวลต์Y=[Y1Y2Y3]1=[111]L=[100110111]

แล้ว:

(3)Tx2dV=A6Tr(โวลต์xโวลต์xTL)TY2dV=A6Tr(โวลต์Yโวลต์YTL)TxYdV=A12(1Tโวลต์xโวลต์YT1+โวลต์xTโวลต์Y)

วางทุกอย่างเข้าด้วยกัน

ปล่อย โวลต์xผม และ โวลต์Yผม มีพิกัด x / y ของจุดยอดสำหรับแต่ละสามเหลี่ยม Tผมเหมือนข้างต้น ปลั๊ก(3) เข้าไป (2)สำหรับสามเหลี่ยมแต่ละรูปโดยสังเกตว่าเงื่อนไขของพื้นที่นั้นถูกยกเลิก สิ่งนี้จะช่วยแก้ปัญหา:

(4)XX=16Σผม=1nTr(โวลต์xผม(โวลต์xผม)TL)YY=16Σผม=1nTr(โวลต์Yผม(โวลต์Yผม)TL)XY=112Σผม=1n(1Tโวลต์xผม(โวลต์Yผม)T1+(โวลต์xผม)Tโวลต์Yผม)

แกนหลัก

แกนหลักถูกกำหนดโดย eigenvectors ของเมทริกซ์ความแปรปรวนร่วม เช่นเดียวกับใน PCA ซึ่งแตกต่างจาก PCA เรามีการแสดงออกการวิเคราะห์สำหรับแทนที่จะต้องประเมินจากจุดข้อมูลที่สุ่มตัวอย่าง โปรดทราบว่าจุดยอดเองไม่ใช่ตัวอย่างตัวแทนจากการกระจายเครื่องแบบบนPดังนั้นเราจึงไม่สามารถใช้เมทริกซ์ความแปรปรวนร่วมตัวอย่างของจุดยอดได้ แต่, * คือ * เป็นฟังก์ชันที่ค่อนข้างง่ายของจุดยอดตามที่เห็นใน (4).


2
+1 สิ่งนี้สามารถทำให้ง่ายขึ้นได้โดยการอนุญาตให้ใช้รูปสามเหลี่ยมที่มุ่งเน้นจึงไม่จำเป็นต้องใช้รูปสามเหลี่ยมที่เหมาะสม แต่คุณสามารถสร้างศูนย์ควบคุมได้O และรวมค่า (ลงนาม) เหนือสามเหลี่ยม OPผมPผม+1:นี่เป็นวิธีที่ทำกันบ่อยๆเพราะมันจุกจิกน้อยกว่ามาก เป็นเรื่องง่ายที่จะเห็นว่าการรวมดังกล่าวนั้นเป็นสิ่งเดียวกับการใช้ทฤษฎีบทของกรีนเพราะแต่ละคำในการรวมในท้ายที่สุดคือการทำงานของขอบPผมPผม+1.วิธีการนี้จะแสดงในส่วน "พื้นที่" ที่quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm
whuber

@whuber น่าสนใจขอบคุณที่ชี้ให้เห็น
user20160

คำตอบทั้งสองนี้ดีแม้ว่าระดับการศึกษาของฉันจะดีขึ้นเล็กน้อย เมื่อฉันแน่ใจว่าฉันเข้าใจพวกเขาอย่างเต็มที่ฉันจะพยายามหาผู้ที่ได้รับรางวัล
Ingolifs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.