簡體   English   中英

Python 4 維球體上點的均勻分布

[英]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 的回答,如果高斯采樣真的創建了一個均勻分布的球面分布(與從立方體采樣不同),但是為了避免對高斯分布進行采樣並且必須證明這一點,有一個簡單的解決方案:在均勻分布采樣分布在球體上(不是在立方體上)。

  1. 均勻分布上生成點。
  2. 計算每個點的平方半徑(避免平方根)。
  3. 丟棄積分
    • 丟棄平方半徑大於 1 的點(因此,非平方半徑大於 1)。
    • 丟棄太接近零半徑的點,以避免在下一步中與除法相關的數值不穩定性。
  4. 對於保留的每個采樣點,將采樣點除以范數,以將其重新歸一化為單位半徑。
  5. 由於丟棄的樣品,清洗並重復更多點。

這顯然適用於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM