[英]Python Uniform distribution of points on 4 dimensional sphere
我需要在 4 維球面上均勻分布點。 我知道這不像選擇 3 個角度和使用極坐標那么簡單。
在我使用的 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)
這給出了 x、y 和 z 的均勻分布。
如何獲得 4 個維度的類似分布?
然而,一種標准方法,也許不是最快的,是使用穆勒的方法在 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()
只需將dim = 3
更改為dim = 4
即可在 4 球體上生成點。
在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)
我喜歡@unutbu 的回答,如果高斯采樣真的創建了一個均勻分布的球面分布(與從立方體采樣不同),但是為了避免對高斯分布進行采樣並且必須證明這一點,有一個簡單的解決方案:在均勻分布上采樣分布在球體上(不是在立方體上)。
這顯然適用於 n 維空間,因為半徑始終是更高維度的 L2 范數。
它很快,以避免在高斯分布上進行平方根和采樣,但它不是矢量化算法。
我找到了一個從 N-dim 球體采樣的好方法。 主要思想是:
如果 Y 來自不相關的多元正態分布,則S = Y / ||Y|| 在單位 d 球面上具有均勻分布。 將 S 乘以U 1/d ,其中 U 在單位間隔 (0,1) 上具有均勻分布,在單位 d 維球中創建均勻分布。
這是執行此操作的python代碼:
Y = np.random.multivariate_normal(mean=[0], cov=np.eye(1,1), size=(n_dims, n_samples))
Y = np.squeeze(Y, -1)
Y /= np.sqrt(np.sum(Y * sample_isotropic, axis=0))
U = np.random.uniform(low=0, high=1, size=(n_samples)) ** (1/n_dims)
Y *= distr * radius # in my case radius is one
這是我得到的球體:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.