Я не нашел реализацию такого алгоритма на Python
Что-то вроде этого:
Есть два входных аргумента:
Мне нужно приблизительно равномерно расположить их на поверхности n-сферы.
Координатные оси расположены в центре сферы n-1. Например, в 3d на обычной сфере можно расположить точки, подобные этому
На мой взгляд, алгоритм Фибоначчи очень хорош визуально. Я не знаю, есть ли что-то подобное для n-сферы. У меня 512D пространство, и я собираюсь разместить 1000 или даже 10 000 очков в нем.
Как это сделать в python?
Существует простой подход Мюллера и Марсалья для создания равномерного распределения на поверхности гиперсферы.
Сгенерируйте 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]