алгоритм генерации равномерно распределенных случайных точек на N-сфере - PullRequest
0 голосов
/ 15 октября 2018

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

Примерно так:

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

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

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

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

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

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

1 Ответ

0 голосов
/ 15 октября 2018

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

Создание 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...