Подтвердить что ты не робот

Каков наилучший способ расчета 3D-центра (или n-D)?

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

centroid = average(x), average(y), average(z)

где x, y и z - массивы чисел с плавающей запятой. Я, кажется, помню, что есть способ получить более точный центроид, но я не нашел простого алгоритма для этого. У кого-нибудь есть идеи или предложения? Я использую Python для этого, но я могу адаптировать примеры из других языков.

4b9b3361

Ответ 1

Нет, это единственная формула для центра тяжести набора точек. См. Википедию: http://en.wikipedia.org/wiki/Centroid

Ответ 2

Вы смутно упоминаете "способ получить более точный центроид". Возможно, вы говорите о центроиде, на который не влияют выбросы. Например, средний доход средний в США, вероятно, очень высок, потому что небольшое количество богатых людей very искажает среднее; они являются "выбросами". По этой причине статистики используют медианный. Один из способов получения медианы - сортировать значения, а затем выбирать значение на полпути вниз по списку.

Возможно, вы ищете что-то подобное, но для 2D или 3D точек. Проблема в 2D и выше, вы не можете сортировать. Там нет естественного порядка. Тем не менее, есть способы избавиться от выбросов.

Один из способов - найти выпуклый корпус. Выпуклая оболочка имеет все точки на "вне" множества точек. Если вы сделаете это и выбросите точки, находящиеся на корпусе, вы выбросите выбросы, а оставшиеся точки дадут более "представительный" центр тяжести. Вы можете даже повторить этот процесс несколько раз, и результат такой же, как пилинг лука. Фактически, это называется "выпуклым шелушением корпуса".

Ответ 3

В противоположность общему рефрену здесь существуют различные способы определения (и вычисления) центра облака точек. Вы уже предложили первое и наиболее распространенное решение, и я не утверждать, что с этим что-то не так:

centroid = average(x), average(y), average(z)

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

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

middle = middle(x), middle(y), middle(z)

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

Наконец, вы можете также использовать median (элемент в середине) в каждом измерении:

median = median(x), median(y), median(z)

Теперь это будет делать противоположное отношению к middle и фактически поможет вам игнорировать выбросы в облаке точек и найти центральную точку на основе распределения ваших точек.

Более и надежный способ поиска "хорошей" центральной точки может состоять в том, чтобы игнорировать верхний и нижний 10% в каждом измерении, а затем вычислять average или median. Как вы можете видеть, вы можете определить центральную точку по-разному. Ниже я покажу вам примеры двух 2D-точечных облаков с учетом этих предложений.

Синяя точка - средний (средний) центр тяжести. Медиана показана зеленым цветом. Середина показана красным цветом. Во втором изображении вы точно увидите, о чем я говорил раньше: зеленая точка "ближе" к самой плотной части облака точек, а красная точка - еще дальше от нее, принимая во внимание самые крайние границы облако точек.

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

Ответ 4

вы можете использовать суммирование точности увеличения - суммирование Кахана - это то, что вы имели в виду?

Ответ 5

Потенциально более эффективный: если вы вычисляете это несколько раз, вы можете немного ускорить это, сохранив две постоянные переменные

N  # number of points
sums = dict(x=0,y=0,z=0)  # sums of the locations for each point

затем изменяя N и суммы, когда точки создаются или уничтожаются. Это меняет вещи от O (N) до O (1) для вычислений за счет большей работы каждый раз, когда точка создается, перемещается или уничтожается.

Ответ 6

"Более точный центроид". Я считаю, что центроид определяется так, как вы его рассчитали, поэтому не может быть "более точного центра тяжести".

Ответ 7

Да, это правильная формула.

Если у вас есть большое количество очков, вы можете использовать симметрию проблемы (будь то цилиндрическая, сферическая, зеркальная). В противном случае вы можете заимствовать из статистики и усреднить случайное число точек и просто немного ошибиться.

Ответ 8

Вы поняли. То, что вы вычисляете, - это центроид или средний вектор.