Многомерное нормальное распределение сферически симметрично. Распределение, которое вы ищете, усекает радиус ниже в точке . Поскольку этот критерий зависит только от длины , усеченное распределение остается сферически симметричным. Поскольку не зависит от сферического углаи имеют распределение , то , следовательно , может генерировать значения из усеченного распределения всего за несколько простых шагов:Xρ=||X||2aXρX/||X||ρσχ(n)
Создайте .X∼N(0,In)
Генерация как квадратный корень из усеченного в .Pχ2(d)(a/σ)2
Пусть,Y=σPX/||X||
На шаге 1 получается как последовательность независимых реализаций стандартной нормальной переменной.Xd
На шаге 2 легко генерируется инвертированием квантильной функции распределения : генерируется равномерная переменная поддерживаемая в диапазоне (квантилей) между и и установите .PF−1χ2(d)UF((a/σ)2)1P=F(U)−−−−−√
Вот гистограмма из таких независимых реализаций для в измерениях, усеченная ниже при . Генерация заняла около одной секунды, что свидетельствует об эффективности алгоритма.105σPσ=3n=11a=7
Красная кривая - это плотность усеченного масштабированное на . Его близкое совпадение с гистограммой свидетельствует о достоверности этой техники.χ(11)σ=3
Чтобы получить интуицию для усечения, рассмотрим случай , в измерениях. Вот график рассеяния против (для независимых реализаций). Это ясно показывает отверстие в радиусе :a=3σ=1n=2Y2Y1104a
Наконец, обратите внимание, что (1) компоненты должны иметь идентичные распределения (из-за сферической симметрии) и (2) за исключением случаев, когда , это общее распределение не является нормальным. В самом деле, как вырастает большое, быстрое снижение (одномерный) нормального распределения вызывает большую часть вероятности сферически усечен многомерное нормальное группироваться вблизи поверхности -сферы (радиуса ). Таким образом, предельное распределение должно приближаться к масштабированному симметричному бета-распределению сосредоточенному в интервале . Это видно на предыдущем графике рассеяния, гдеXia=0an−1a((n−1)/2,(n−1)/2)(−a,a)a=3σуже велика в двух измерениях: точки ограничивают кольцо ( сфера ) радиуса .2−13σ
Вот гистограммы маргинальных распределений из моделирования размера в измерениях с , (для которого аппроксимирующее распределение бета является равномерным):1053a=10σ=1(1,1)
Поскольку первые маргиналов процедуры, описанной в вопросе, являются нормальными (по построению), эта процедура не может быть правильной.n−1
Следующий R
код сгенерировал первую цифру. Он сконструирован так, чтобы параллельные шаги 1-3 для генерации . Он был изменен , чтобы генерировать вторую цифру путем изменения переменных , , , и , а затем выдачи команды участок после того, как был создан.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
Поколение изменяется в коде для более высокого численного решения: код фактически производит и использует для вычисления .U1−UP
Тот же метод моделирования данных в соответствии с предполагаемым алгоритмом, суммирования его с гистограммой и наложения гистограммы может быть использован для проверки метода, описанного в вопросе. Это подтвердит, что метод не работает должным образом.
a <- 7 # Lower threshold
d <- 11 # Dimensions
n <- 1e5 # Sample size
sigma <- 3 # Original SD
#
# The algorithm.
#
set.seed(17)
u.max <- pchisq((a/sigma)^2, d, lower.tail=FALSE)
if (u.max == 0) stop("The threshold is too large.")
u <- runif(n, 0, u.max)
rho <- sigma * sqrt(qchisq(u, d, lower.tail=FALSE))
x <- matrix(rnorm(n*d, 0, 1), ncol=d)
y <- t(x * rho / apply(x, 1, function(y) sqrt(sum(y*y))))
#
# Draw histograms of the marginal distributions.
#
h <- function(z) {
s <- sd(z)
hist(z, freq=FALSE, ylim=c(0, 1/sqrt(2*pi*s^2)),
main="Marginal Histogram",
sub="Best Normal Fit Superimposed")
curve(dnorm(x, mean(z), s), add=TRUE, lwd=2, col="Red")
}
par(mfrow=c(1, min(d, 4)))
invisible(apply(y, 1, h))
#
# Draw a nice histogram of the distances.
#
#plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010") # For figure 2
rho.max <- min(qchisq(1 - 0.001*pchisq(a/sigma, d, lower.tail=FALSE), d)*sigma,
max(rho), na.rm=TRUE)
k <- ceiling(rho.max/a)
hist(rho, freq=FALSE, xlim=c(0, rho.max),
breaks=seq(0, max(rho)+a, by=a/ceiling(50/k)))
#
# Superimpose the theoretical distribution.
#
dchi <- function(x, d) {
exp((d-1)*log(x) + (1-d/2)*log(2) - x^2/2 - lgamma(d/2))
}
curve((x >= a)*dchi(x/sigma, d) / (1-pchisq((a/sigma)^2, d))/sigma, add=TRUE,
lwd=2, col="Red", n=257)