def spherical_beta_logp(x, lon_lat, alpha):
if x[1] < -90. or x[1] > 90.:
raise ZeroProbability
return -np.inf
if alpha == 1.0:
return np.log(1. / 4. / np.pi)
mu = np.array([np.cos(lon_lat[1] * d2r) * np.cos(lon_lat[0] * d2r),
np.cos(lon_lat[1] * d2r) * np.sin(lon_lat[0] * d2r),
np.sin(lon_lat[1] * d2r)])
test_point = np.transpose(np.array([np.cos(x[1] * d2r) * np.cos(x[0] * d2r),
np.cos(x[1] * d2r) *
np.sin(x[0] * d2r),
np.sin(x[1] * d2r)]))
thetas = np.arccos(np.dot(test_point, mu))
normalization = sp.gamma(alpha + 0.5) / \
sp.gamma(alpha) / np.sqrt(np.pi) / np.pi / 2.
logp_elem = np.log(np.sin(thetas)) * (2. * alpha - 2) + \
np.log(normalization)
logp = logp_elem.sum()
return logp
评论列表
文章目录