5

Мне нужно равномерное распределение точек на 4-мерной сфере. Я знаю, что это не так тривиально, как подбирать 3 угла и использовать полярные координаты.Python Равномерное распределение точек на 4-мерной сфере

В 3-х измерениях я использую

from random import random 

u=random() 
costheta = 2*u -1 #for distribution between -1 and 1 
theta = acos(costheta) 
phi = 2*pi*random 

x=costheta 
y=sin(theta)*cos(phi) 
x=sin(theta)*sin(phi) 

Это дает равномерное распределение х, у и г.

Как получить аналогичное распределение для 4-х измерений?

+0

Как генерировать равномерно распределенные точки в случайном порядке в N-сфере: http://en.wikipedia.org/wiki/N-sphere#Uniformly_at_random_from_the_.28n.C2.A0.E2.88.92.C2.A01.29-сфера – unutbu

+1

wait, вы хотите, чтобы точки были на сфере, но равномерно распределены по x, y, z, (4-е измерение)? это не складывается для меня. Я не думаю, что точки, равномерно распределенные на сфере, будут отображаться равномерно распределенными в 4-пространстве. –

+0

@SchighSchagh, поэтому вы не можете запускать моделирование monte carlo в 4 измерениях? –

ответ

1

Возьмите любую случайную точку в пространстве 4D и вычислите ее единичный вектор. Это будет на 4-шаровой единице.

from random import random 
import math 
x=random.normalvariate(0,1) 
y=random.normalvariate(0,1) 
z=random.normalvariate(0,1) 
w=random.normalvariate(0,1) 
r=math.sqrt(x*x + y*y + z*z + w*w) 
x/=r 
y/=r 
z/=r 
w/=r 
print (x,y,z,w) 
+0

Несомненно, это порождает случайную точку на 4-сфере, но является ли распределение равномерным? –

+0

@SchighSchagh: Равномерно распределен? Да. – Manishearth

+1

x, y, z, w первоначально равномерно случайны относительно R^4, но затем они подвергаются нелинейному преобразованию, и мне все еще не ясно, если OP хочет равномерно случайным образом по отношению к поверхности сферы или относительно R^4. РЕДАКТИРОВАТЬ: можете ли вы указать в отношении того, что вы утверждаете единообразно наугад, и доказать это? –

5

A standard way, хотя, возможно, not the fastest, является использование метода Мюллера для генерации равномерно распределенных точек на N-сфере:

import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as axes3d 

N = 600 
dim = 3 

norm = np.random.normal 
normal_deviates = norm(size=(dim, N)) 

radius = np.sqrt((normal_deviates**2).sum(axis=0)) 
points = normal_deviates/radius 

fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) 
ax.scatter(*points) 
ax.set_aspect('equal') 
plt.show() 

enter image description here

Просто измените dim = 3 на dim = 4 для создания точек на 4-сфере.

+0

Принимая равномерное распределение, вы получите сферу, отобранную с плотностью точек, которая будет выше в сторону углов куба, которые он займет. Как доказать, что использование гауссовского распределения тоже не вызовет этой проблемы? Кажется правдоподобным, если я мысленно рисую его, но действительно ли это и почему? Я предполагаю, что гауссовские распределения numpy независимы для каждой координаты при задании размера. –

+0

А как насчет делений на ноль? –

+1

@GuillaumeChevalier: Я признаюсь, что не понимаю деталей, но, возможно, вы найдете [этот доказательный план полезен] (https://stats.stackexchange.com/questions/7977/how-to-generate-uniformly-distributed-points -он-на-поверхностно-оф-3-D-блок-sphe # comment13055_7984). По вопросу о делении на ноль: я считаю, что вероятность делителя равна 0. На практическом уровне NumPy обрабатывает деление на ноль, выдавая * предупреждение * и возвращающее «NaN» (а Matplotlib пропускает точки, равные NaN). – unutbu

0

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

  1. Создать точки на равномерное распределение.
  2. Вычислить радиус квадрата каждой точки (избегайте квадратного корня).
  3. Отклон указывает:
    • Отбросить точки, для которых квадрат радиус больше, чем 1 (таким образом, для которого unsquared радиус больше, чем 1).
    • Отклонить точки, слишком близкие к радиусу нуля, чтобы избежать числовых неустойчивостей, связанных с делением на следующем шаге.
  4. Для каждых отобранных точек сохранен, разделить сэмпл точку нормы так, чтобы он перенормировать радиус блока.
  5. Промыть и повторить для получения дополнительных баллов из-за отброшенных образцов.

Это, очевидно, работает в n-мерном пространстве, так как радиус всегда является нормой L2 в более высоких измерениях.

Это быстро, так как избежать квадратного корня и выборки по гауссовскому распределению, но это не алгоритм с векторизованным алгоритмом.

Смежные вопросы