ในที่สุดฉันก็เข้าใจ นี่คือคำตอบของฉัน
ในที่สุดฉันก็วางมือบนสถิติทิศทาง (Mardia และ Jupp, 1999) และอัลกอรึทึมของ Ulrich-Wood สำหรับการสุ่มตัวอย่าง ฉันโพสต์ที่นี่สิ่งที่ฉันเข้าใจจากมันคือรหัสของฉัน (ใน Python)
รูปแบบการสุ่มตัวอย่างปฏิเสธ:
def rW(n, kappa, m):
dim = m-1
b = dim / (np.sqrt(4*kappa*kappa + dim*dim) + 2*kappa)
x = (1-b) / (1+b)
c = kappa*x + dim*np.log(1-x*x)
y = []
for i in range(0,n):
done = False
while not done:
z = sc.stats.beta.rvs(dim/2,dim/2)
w = (1 - (1+b)*z) / (1 - (1-b)*z)
u = sc.stats.uniform.rvs()
if kappa*w + dim*np.log(1-x*w) - c >= np.log(u):
done = True
y.append(w)
return y
v 1 - w2------√+ w μที่ไหน W เป็นผลมาจากรูปแบบการสุ่มตัวอย่างการปฏิเสธและ โวลต์ มีการสุ่มตัวอย่างอย่างสม่ำเสมอเหนือ hypersphere
def rvMF(n,theta):
dim = len(theta)
kappa = np.linalg.norm(theta)
mu = theta / kappa
result = []
for sample in range(0,n):
w = rW(n, kappa, dim)
v = np.random.randn(dim)
v = v / np.linalg.norm(v)
result.append(np.sqrt(1-w**2)*v + w*mu)
return result
และสำหรับการสุ่มตัวอย่างอย่างมีประสิทธิภาพด้วยรหัสนี้นี่คือตัวอย่าง:
import numpy as np
import scipy as sc
import scipy.stats
n = 10
kappa = 100000
direction = np.array([1,-1,1])
direction = direction / np.linalg.norm(direction)
res_sampling = rvMF(n, kappa * direction)
scipy.stats.vonmises
array
ดูตัวอย่าง