WLbarycenter | R Documentation |
Given a collection of von Mises-Fisher (vMF) distributions, each characterized
by a mean direction \mathbf{\mu}
and a concentration parameter \kappa
,
this function solves the geometric mean problem to compute the barycentric vMF
distribution under an approximate Wasserstein geometry.
WLbarycenter(means, concentrations, weights = NULL)
means |
An |
concentrations |
A length- |
weights |
A weight vector of length |
A named list containing:
A length-p
vector representing the barycenter direction.
A scalar representing the barycenter concentration.
# Set seed for reproducibility
set.seed(123)
# Number of vMF distributions
n <- 5
# Generate mean directions concentrated around a specific angle (e.g., 45 degrees)
base_angle <- pi / 4 # 45 degrees in radians
angles <- rnorm(n, mean = base_angle, sd = pi / 20) # Small deviation from base_angle
means <- cbind(cos(angles), sin(angles)) # Convert angles to unit vectors
# Generate concentration parameters with large magnitudes (tight distributions)
concentrations <- rnorm(n, mean = 50, sd = 5) # Large values around 50
# Compute the barycenter under the Wasserstein-like geometry
barycenter <- WLbarycenter(means, concentrations)
# Convert barycenter mean direction to an angle
bary_angle <- atan2(barycenter$mean[2], barycenter$mean[1])
## Visualize
opar <- par(no.readonly=TRUE)
par(mfrow=c(1,2), pty="s")
# Plot the unit circle
plot(cos(seq(0, 2 * pi, length.out = 200)), sin(seq(0, 2 * pi, length.out = 200)),
type = "l", col = "gray", lwd = 2, xlab = "x", ylab = "y",
main = "Barycenter of vMF Distributions on S^1")
# Add input mean directions
points(means[,1], means[,2], col = "blue", pch = 19, cex = 1.5)
# Add the computed barycenter
points(cos(bary_angle), sin(bary_angle), col = "red", pch = 17, cex = 2)
# Add legend
legend("bottomleft", legend = c("vMF Means", "Barycenter"), col = c("blue", "red"),
pch = c(19, 17), cex = 1)
# Plot the concentration parameters
hist(concentrations, main = "Concentration Parameters", xlab = "Concentration")
abline(v=barycenter$concentration, col="red", lwd=2)
par(opar)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.