Як знайти коваріаційну матрицю багатокутника?


9

Уявіть, що у вас є багатокутник, визначений набором координат (x1,y1)...(xn,yn) і його центр маси знаходиться в (0,0). Ви можете трактувати багатокутник як рівномірний розподіл з полігональною межею. введіть тут опис зображення

Я шукаю метод, який знайде матрицю коваріації багатокутника .

Я підозрюю, що матриця коваріації багатокутника тісно пов'язана з другим моментом області , але чи є вони еквівалентними, я не впевнений. Формули, знайдені у статті вікіпедії, до якої я пов’язаний, здаються (здогадка тут, мені не особливо зрозуміло із статті), стосуються інерції обертання навколо осей x, y та z, а не основних осей полігону.

(До речі, якщо хтось може вказати мені на те, як обчислити основні осі багатокутника, це також було б мені корисно)

Заманливо просто виконати PCA на координатах , але при цьому виникає питання про те, що координати необов'язково рівномірно розподіляються навколо багатокутника, і тому не є репрезентативною щільністю багатокутника. Крайній приклад - контур Північної Дакоти, полігон якого визначається великою кількістю точок, що слідують за річкою Червона, плюс лише дві ще точки, що визначають західний край штату.


Під «знаходженням» я припускаю, що просто відбирати пробу з багатокутника, а потім обчислювати коваріантність зразків - це не те, що ти маєш на увазі?
Стефан Коласа

Також ви можете редагувати свою публікацію, щоб вона включала координати для вашого полігону, щоб люди могли пограти з ним?
Стефан Коласа

1
@StephanKolassa Я маю на увазі трактування полігону як рівномірної двовимірної щільності ймовірності з полігональною межею. Звичайно, ви можете взяти вибірку балів, і межа буде те саме, але я шукаю апріорний метод. Малюнок - лише ілюстрація від фарби, яку я використав. Дані реального світу, які я маю намір використати, - це контури штатів та регіонів.
Інголіфс

1
Ви вірні, що звичайний термін "матриці коваріації" - це інерційний момент або другий момент. Головні осі орієнтовані в її ейджендирекціях. Запуск PCA за координатами є некоректним: це рівносильно припускати, що вся маса розташована у вершинах. Найбільш прямі методи обчислення барицентру - перший момент - обговорюються в моєму пості на сайті gis.stackexchange.com/a/22744/664 . Другі моменти обчислюються так само з незначними модифікаціями. Потрібні особливі міркування щодо сфери.
whuber

2
Це працює інакше: обчислити інерційний тензор і віднайти його основні осі. Метод у вашому випадку включає теорему Гріна, яка показує, що необхідні інтеграли
μk,l(P)=Pxkyldxdy
може бути обчислено як контурні інтеграли навколо в одній форми деТакі форми легко знайти, оскільки будь-яка відповідна лінійна комбінація і буде працювати. Контурний інтеграл - це сума інтегралів по краях. Pωdω=xkyldxdy.xkyl+1dxxk+1yldy
whuber

Відповіді:


10

Давайте спочатку зробимо деякий аналіз.

Припустимо, у полігоні його щільність ймовірності пропорційна функції Тоді константа пропорційності - обернена інтеграл над багатокутником,Pp(x,y).p

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

Баріцентр багатокутника є точкою середніх координат, обчислених як їх перших моментів. Перший - це

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

Тензор інерції може бути представлена в вигляді симетричній матриці других моментів , обчислених після перекладу багатокутника поставити свій баріцентр на початку координат: тобто матриця центральних моментів другого

μ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)).

РС з дає головну вісь з ці поодинокі власні вектори , масштабовані їх власних значень.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 Вау, це чудова відповідь!
амеба

7

Редагувати: Не помітили, що Валер уже відповів. Я залишу це на прикладі іншого (можливо, менш елегантного) підходу до проблеми.

Коваріаційна матриця

Нехай випадкова точка з рівномірного розподілу на багатокутник з площею . Коваріаційна матриця:(X,Y)PA

C=[CXXCXYCXYCYY]

де - дисперсія , - дисперсія , а - коваріація між і . Це передбачає нульову середню, оскільки центр маси полігона розташований біля початку. Рівномірний розподіл призначає постійну густину ймовірностей кожній точці , так що:CXX=E[X2]XCYY=E[Y2]YCXY=E[XY]XY1AP

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

Тріангуляція

Замість того, щоб намагатися безпосередньо інтегруватись у складну область типу , ми можемо спростити проблему, розділивши на трикутних субрегіонів:PPn

P=T1Tn

У вашому прикладі один з можливих розділів виглядає так:

введіть тут опис зображення

Існують різні способи отримання тріангуляції (див. Тут ). Наприклад, можна обчислити триангуляцію вершин Делоне , а потім відкинути ребра, що виходять за межі (оскільки це може бути невипуклим, як у прикладі).P

Інтеграли над можуть бути розбиті на суми інтегралів над трикутниками:P

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

У трикутника є приємні, прості межі, тому ці інтеграли оцінити легше.

Інтегрування через трикутники

Існують різні способи інтеграції через трикутники. У цьому випадку я використав трюк, який передбачає відображення трикутника до одиничного квадрата. Перетворення в барицентричні координати може бути кращим варіантом.

Ось рішення інтегралів, наведених вище, для довільного трикутника визначеного вершинами . Дозволяє: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)

Збираючи все разом

Нехай і містять координати x / y вершин для кожного трикутника , як зазначено вище. Підключіть до для кожного трикутника, зазначивши, що умови площі скасовуються. Це дає рішення:vxivyiTi(3)(2)

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

Основні осі

Основні осі задаються власними векторами матриці коваріації , як і в PCA. На відміну від PCA, ми маємо аналітичний вираз для , а не для того, щоб оцінювати його з вибіркових точок даних. Зауважимо, що самі вершини не є репрезентативним вибірком з рівномірного розподілу на , тому не можна просто взяти вибіркову коваріаційну матрицю вершин. Але, * є * відносно проста функція вершин, як видно в .CCPC(4)


2
+1 Це можна спростити, якщо дозволити орієнтовані трикутники, тим самим виключивши потребу в правильній тріангуляції. Натомість ви можете просто встановити довільний центр та підсумувати (підписані) значення за трикутниками саме так це часто робиться, тому що він набагато менш метушливий. Неважко помітити, що таке підсумовування є по суті тим же, що і застосування теореми Гріна, оскільки кожен доданок у підсумовуванні в кінцевому підсумку є функцією краюТакий підхід проілюстровано в розділі "Область" на веб- сайті Quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm . OOPiPi+1:PiPi+1.
whuber

@whuber Цікаво, дякую, що вказали на це
user20160

Обидві ці відповіді хороші, хоча і трохи перевищують рівень моєї освіти. Коли я впевнений, що я їх повністю розумію, я спробую розібратися, хто отримує виграш.
Інголіфс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.