如何生成任意橢球內的均勻分布?

時間 2021-06-17 11:56:18

1樓:

Latin Hypercube 不行麼。。真正的土法。。舍取法什麼都太洋氣了。。

不在球裡的hypercube 模擬幾次之後就可以丟掉了剩下全是在球裡的hypercube。。

缺點可能還是計算量大吧。。

2樓:王贇 Maigo

本答案探索三種演算法,其中只有一種可行,但我意在展示探索的思路。

首先,題目中的矩陣 應滿足對稱、正定的條件。

在此條件下, 可以進行 Cholesky 分解得到 ,

於是 就可以變形為 。

這樣,只要能生成 n 維單位球內均勻分布的隨機向量 ,

就可以通過 得到橢球內均勻分布的隨機向量 了。

下面探索生成 n 維單位球內均勻分布的隨機向量 的演算法。

最簡單的思路就是逐維生成 的各維分量 。

為此,需要知道 的邊緣分布,以及各個 在已知 後的條件邊緣分布。

容易得出,在 n 維空間中, 的邊緣分布的密度函式為:

若能對此密度函式做積分得到累積密度 ,

就可以先生成乙個 [0,1] 上均勻分布的隨機變數 ,

再通過變換 得到 了。

然而,這個累積分布的形式比較複雜,無法實用。

第一種方法失敗。

第二種方法,是分別生成 的模 和方位向量 ,然後組合得到 。

在 n 維空間中, 的分布的密度函式為:

累積密度

於是,先生成乙個 [0,1] 上均勻分布的隨機變數 ,則可通過 得到 的模。

而方位向量 可以通過把乙個服從 n 維標準正態分佈的隨機向量 進行歸一化得到。

生成服從標準正態分佈的隨機向量,可以使用 Box-Muller 演算法。

這就是本題的標準答案了。

另外一種「土演算法」是 rejection sampling,即在立方體 中均勻取樣,然後把所有落在單位球外的樣本篩掉。

但在高維情形下,這個立方體是很「空」的,即單位球在其中的體積佔比很小,取樣效率會很低。

不過,如果允許演算法有一定的近似性,是可以把立方體適當縮小的,縮小後的立方體仍可覆蓋單位球的絕大部分體積。

如下圖所示,在 64 維情況下,哪怕把立方體的邊長縮小一半(從 2 縮小到 1),單位球的絕大多數體積仍在立方體內。把立方體的邊長從 2 縮小到 0.7,也可以保證 80% 左右的覆蓋率。

把立方體縮小後,rejection sampling 就可行了嗎?

邊長為 1 的立方體體積為 1;

這些都仍比單位球的體積大了許多數量級。

以邊長為 0.7 的立方體為例,在其中採集 30 多億個樣本,才有乙個落在單位球裡的。

而此時立方體的覆蓋率只有 80% 左右,演算法的近似性已經很明顯了。

所以結論是,rejection sampling 在高維情況下完全不可行。

3樓:

我的想法是使用Gibbs Sampling來完成抽樣過程。Gibbs Sampling每次都是從一維分布中抽樣,這個一維分布就是以其他所有引數為條件的條件分布,即

這應該是乙個均勻分布(如果我沒想錯的話),也就是橢球被限定了 個維度後截下的線段,解乙個一元二次方程就能確定均勻分布的範圍。那麼此時使用Gibbs Sampling就很自然了。

Gibbs.ellipse <- function(n, M)

return(samples)

}set.seed(42)

M <- matrix(c(0.25,0.1,0.1,1),nrow=2)

samples <- Gibbs.ellipse(10000, M)

plot(x=samples[,1],y=samples[,2],pch=20)

PS: 補充 @王贇 Maigo 兄的答案中,給出乙個從

的取樣方案,使用的是importance resampling的思想。曲線為真實密度,直方圖為取樣結果

plot <- function(dims) )

norm.factor = integrate(f, -1, 1)$value

g = Vectorize(function(x))

curve(g, -1, 1)

}SIR.sampler <- function(n, dims)

dims <- 20

plot(dims)

samples <- SIR.sampler(100000, dims)

hist(samples, breaks=30, prob=T, add=T)

但感覺剩下的一系列後驗分布才是難點

4樓:

hint,橢球和球之間差乙個仿射變換。

至於高維球上的sampling,因為球的體積與cover他的正方體的體積的比是指數衰減的,rejection sampling 的效率也是指數衰減的…

可以考慮另外的方法。因為空間中的點由球面上的位置theta,已經徑向距離r決定。可以用多維高斯分布模擬出theta.

r的分布的概率密度~r^(d-1),也是容易模擬sample出來的。

Unity 用C 如何在球體表面生成均勻分布的座標點!求演算法!?

對於分布 那麼分布 在 單位球面上均勻分布.對於 用 每次取樣三個數 那麼 在 的球面 上是均勻分布的.用Box Muller取樣方法 整個演算法時間複雜度是線性的 玩兒的就是心跳歸來 不知道題主所說的均勻分布的點是什麼意思?是按照均勻分布隨機取乙個點還是找到一堆點均勻的落在球面上 類似Quasi ...

均勻分布次序統計量的分布函式怎麼求?

Min.L 假設分布 則概率密度函式為 其中 為indicator function。於是,在支撐集 support 中的分布函式為 記第i大的次序統計量為 對應的概率密度函式為可以推出最小次序統計量 的概率密度函式為 同理可以寫出最大次序統計量的概率密度。 Ming 首先假設 我看了一下,物理統計...

已知曲線上的點在x方向上均勻分布,如何計算在y方向上的分布?

呵呵噠 其實,數值計算也是可以擬合的嘛,你寫乙個擬合程式,numpy裡也有。如果全段擬合不好就分段,然後再求分段函式的導數。直接取樣計算間隔太小計算量一定很大,所以採用擬合近似吧。 章佳傑 用 numpy 的 histogram 函式試試import numpy asnp from matplotl...