Как найти ковариационную матрицу многоугольника?

9

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

Мне нужен метод, который найдет ковариационную матрицу многоугольника .

Я подозреваю, что ковариационная матрица многоугольника тесно связана со вторым моментом площади , но я не уверен, эквивалентны ли они. Формулы, найденные в статье в Википедии, которую я связал, кажутся (наверное, из статьи мне это не особо понятно) относятся к инерции вращения вокруг осей x, y и z, а не к главным осям многоугольника.

(Кстати, если кто-нибудь может указать мне, как рассчитать главные оси многоугольника, это также будет полезно для меня)

Соблазнительно просто выполнить PCA по координатам , но при этом возникает проблема, заключающаяся в том, что координаты не обязательно равномерно распределены по многоугольнику и, следовательно, не отражают плотность многоугольника. Экстремальным примером является контур Северной Дакоты, полигон которого определяется большим количеством точек, следующих за Красной рекой, плюс только еще две точки, определяющие западный край штата.

Ingolifs
источник
Под «найти» я предполагаю, что просто выборка из многоугольника, а затем вычисление ковариации выборок, это не то, что вы имеете в виду?
Стефан Коласса
Кроме того, можете ли вы отредактировать свое сообщение, включив в него координаты своего многоугольника, чтобы люди могли поиграть с ним?
Стефан Коласса
1
@StephanKolassa Я имею в виду обработку многоугольника как однородной двумерной плотности вероятности с многоугольной границей. Конечно, вы можете выбрать точки и предел будет то же самое, но я ищу априорный метод. Картина - просто иллюстрация от краски, которую я использовал. Данные реального мира, которые я намереваюсь использовать, представляют собой контуры штатов и регионов.
Инголифс
1
Вы правы, что обычный термин для «ковариационной матрицы» - это момент инерции или второй момент. Главные оси ориентированы в своих направлениях. Запуск PCA по координатам некорректен: это равносильно предположению, что вся масса находится в вершинах. Самые прямые методы вычисления барицентра - первый момент - обсуждаются в моем посте на gis.stackexchange.com/a/22744/664 . Вторые моменты вычисляются таким же образом с небольшими изменениями. Особые соображения необходимы в сфере.
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
μК,L(п)знак равнопИксКYLdИксdY
пωdωзнак равноИксКYLdИксdY,ИксКYL+1dИксИксК+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),

я(п)знак равно(μ2,0'(п)μ1,1'(п)μ1,1'(п)μ0,2'(п)),

РС из дает главную ось из эти единичные собственные векторы , масштабированные их собственных значений.я(п)П :п:


Далее давайте разберемся, как делать расчеты. Поскольку многоугольник представлен в виде последовательности вершин, описывающих его ориентированную границу естественно вызыватьп,

Теорема Грина: где - это единая форма, определенная в окрестности и

пdωзнак равнопω
ωзнак равноM(Икс,Y)dИкс+N(Икс,Y)dYп
dωзнак равно(ИксN(Икс,Y)-YM(Икс,Y))dИксdY,

Например, с и постоянной ( то есть равномерной) плотностью мы можем (осмотром) выбрать один из множества решения, такие какdωзнак равноИксКYLdИксdYп,

ω(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")
Whuber
источник
+1 Ого, это отличный ответ!
амеба
7

Изменить: не заметил, что Whuber уже ответил. Я оставлю это как пример другого (возможно, менее изящного) подхода к проблеме.

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

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

C=[CXXCXYCXYCYY]

где - дисперсия , - дисперсия , а - ковариация между и . Это предполагает нулевое среднее значение, так как центр масс многоугольника находится в начале координат. Равномерное распределение назначает постоянную плотность вероятности каждой точке в , поэтому:CXX=E[X2]XCYY=E[Y2]YCИксYзнак равноЕ[ИксY]ИксY1Aп

(1)СИксИксзнак равно1AпИкс2dВСYYзнак равно1AпY2dВСИксYзнак равно1AпИксYdВ

триангуляция

Вместо того, чтобы пытаться напрямую интегрироваться в сложную область, такую ​​как , мы можем упростить задачу, разбив на треугольных областей:ппN

пзнак равноT1TN

В вашем примере одно из возможных разделов выглядит следующим образом:

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

Существуют различные способы создания триангуляции (см. Здесь ). Например, вы можете вычислить триангуляцию Делоне для вершин, а затем отбросить ребра, которые выходят за пределы (поскольку это может быть невыпуклым, как в примере).п

Интегралы по можно затем разбить на суммы интегралов по треугольникам:п

(2)СИксИксзнак равно1AΣязнак равно1NTяИкс2dВСYYзнак равно1AΣязнак равно1NTяY2dВСИксYзнак равно1AΣязнак равно1NTяИксYdВ

Треугольник имеет красивые простые границы, поэтому эти интегралы легче оценить.

Интегрирование по треугольникам

Существуют различные способы объединения по треугольникам. В этом случае я использовал трюк, который включает в себя отображение треугольника на единицу площади. Преобразование в барицентрические координаты может быть лучшим вариантом.

Ниже приведены решения для приведенных выше интегралов для произвольного треугольника определенного вершинами . Позволять:T(Икс1,Y1),(Икс2,Y2),(Икс3,Y3)

vИксзнак равно[Икс1Икс2Икс3]vYзнак равно[Y1Y2Y3]1знак равно[111]Lзнак равно[100110111]

Затем:

(3)TИкс2dВзнак равноA6Tr(vИксvИксTL)TY2dВзнак равноA6Tr(vYvYTL)TИксYdВзнак равноA12(1TvИксvYT1+vИксTvY)

Собираем все вместе

Пусть и содержат координаты x / y вершин для каждого треугольника , как указано выше. Вставьте в для каждого треугольника, отметив, что условия области отменяются. Это дает решение:vИксяvYяTя(3)(2)

(4)СИксИксзнак равно16Σязнак равно1NTr(vИкся(vИкся)TL)СYYзнак равно16Σязнак равно1NTr(vYя(vYя)TL)СИксYзнак равно112Σязнак равно1N(1TvИкся(vYя)T1+(vИкся)TvYя)

Главные оси

Главные оси задаются собственными векторами ковариационной матрицы , как и в PCA. В отличие от PCA, у нас есть аналитическое выражение для , вместо того, чтобы оценивать его по выборочным точкам данных. Обратите внимание, что сами вершины не являются репрезентативной выборкой из равномерного распределения на , поэтому нельзя просто взять выборочную ковариационную матрицу вершин. Но * является * относительно простой функцией вершин, как видно из .ССпС(4)

user20160
источник
2
+1 Это можно упростить, разрешив ориентированные треугольники, тем самым устраняя необходимость в правильной триангуляции. Вместо этого вы можете просто установить произвольный центр и суммировать (подписанные) значения по треугольникам это часто делается так, потому что это гораздо менее суетно. Легко видеть, что такое суммирование по сути то же самое, что и применение теоремы Грина, потому что каждый член в суммировании в конечном итоге является функцией ребраЭтот подход проиллюстрирован в разделе «Площадь» на quantdec.com/SYSEN597/GTKAV/section2/chapter_11.htm . ООпяпя+1:пяпя+1,
whuber
@whuber Интересно, спасибо за указание на это
user20160
Оба эти ответа хороши, хотя и немного выше моего уровня образования. Как только я уверен, что полностью понимаю их, я попытаюсь выяснить, кто получает награду.
Инголифс