алгоритм генерации равномерно распределенных случайных точек на N-сфере

1

Я не нашел реализацию такого алгоритма на Python

Что-то вроде этого:

Есть два входных аргумента:

  • n - размерность пространства.
  • m - количество точек на сфере n-1.

Мне нужно приблизительно равномерно расположить их на поверхности n-сферы.

Координатные оси расположены в центре сферы n-1. Например, в 3d на обычной сфере можно расположить точки, подобные этому

На мой взгляд, алгоритм Фибоначчи очень хорош визуально. Я не знаю, есть ли что-то подобное для n-сферы. У меня 512D пространство, и я собираюсь разместить 1000 или даже 10 000 очков в нем.

Как это сделать в python?

  • 1
    (1) Генерация n d-наборов выборок из среднего 0, дисперсии 1 гауссовского распределения и нормализация каждого d-набора к длине 1. Тогда ваши n d-наборов приблизительно равномерно распределены по поверхности (d - 1) -сферы. (Под d я предполагаю, что вы имеете в виду размерность вложения сферы, а не размерность самой сферы. Например, 2-сфера - это нечто локально 2-мерное, которое живет в 3-мерном пространстве.) Этот подход такой же, как и размещенный ниже другим респондентом, но я думаю, что это более понятно, чтобы объяснить это таким образом.
  • 1
    (2) Стратифицированный отбор проб: разделите сферу на несколько частей равной площади и отберите образцы из каждого фрагмента. Вы упоминаете, что у вас есть n, которое не слишком много больше, чем d, что означает, что чисто случайная выборка оставит много пробелов. Я предполагаю, что стратифицированная выборка, или другой метод, который выбирает более равномерно, будет лучше работать над этой проблемой. Что касается других методов для более равномерной выборки, может быть, вы можете найти что-то о последовательностях с низким расхождением (или квазислучайных числах) на сфере.
Показать ещё 6 комментариев
Теги:
math

1 ответ

2

Существует простой подход Мюллера и Марсалья для создания равномерного распределения на поверхности гиперсферы.

Сгенерируйте n переменных с гауссовым распределением (список l здесь). Они образуют некоторый вектор.

Найдите длину этого вектора и нормализовать его компоненты, чтобы обеспечить результат длины единицы

Пример показывает создание одной точки на сфере в пространстве 10d, а также визуально проверяет однородность для пачки точек на круге (сфера в 2d, значения гистограммы должны быть близкими)

import random, math

#muller-marsaglia method
def spherepicking(n):
    while True:           #to get rid off [0,0,0,0] case
        l = [random.gauss(0, 1) for i in range(n)]
        sumsq = sum([x * x for x in l])
        if sumsq > 0:
            break
    norm = 1.0 / math.sqrt(sumsq)
    pt = [x * norm for x in l]
    return pt

print(spherepicking(10))

cnt = [0] * 18
for i in range(10000):
   pt = spherepicking(2)
   an = math.atan2(pt[1], pt[0]) + math.pi / 2
   cnt[math.floor(an * 9 / math.pi)] += 1
print(cnt)

-0.31811419572739935, 0.2845442135156396, -0.2849019746359018,
-0.1326796017012003, 0.7388447238721524, -0.287062305232526, 
-0.08794741714783766, 0.131707880836534, 0.22059937624019868, 
-0.13047162618106062]

[554, 560, 529, 589, 534, 538, 550, 558, 578, 556, 522, 553, 561, 513, 592, 583, 593, 537]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню