Je voudrais dessiner efficacement des échantillons partir de sous la contrainte que .
Je voudrais dessiner efficacement des échantillons partir de sous la contrainte que .
La résolution formelle de ce problème nécessite d'abord une définition correcte d'un
" distribution soumise à la contrainte que "
La manière naturelle est de définir la distribution de conditionnellement à . Et pour appliquer cette condition au cas . Si nous utilisons des coordonnées polaires , le jacobien de la transformation est Donc la densité conditionnelle de la distribution de
Conclusion: Cette densité diffère de l'application simple de la densité normale à un point sur la sphère unitaire en raison du jacobien.
La deuxième étape consiste à considérer la densité cible et concevoir un algorithme de Monte Carlo à chaîne de Markov pour explorer l'espace des paramètres . Ma première tentative serait un échantillonneur Gibbs, initialisé au point sur la sphère la plus proche de , c'est-à-dire, et en procédant un angle à la fois d'une manière Metropolis-within-Gibbs:
Les échelles , , , peuvent être ajustées en fonction des taux d'acceptation des étapes, vers un objectif idéal de .
Voici un code R pour illustrer ce qui précède, avec des valeurs par défaut pour et :
library(mvtnorm)
d=4
target=function(the,mu=1:d,sigma=diag(1/(1:d))){
carte=cos(the[1])
for (i in 2:(d-1))
carte=c(carte,prod(sin(the[1:(i-1)]))*cos(the[i]))
carte=c(carte,prod(sin(the[1:(d-1)])))
prod(sin(the)^((d-2):0))*dmvnorm(carte,mean=mu,sigma=sigma)}
#Gibbs
T=1e4
#starting point
mu=(1:d)
mup=mu/sqrt(sum(mu^2))
mut=acos(mup[1])
for (i in 2:(d-1))
mut=c(mut,acos(mup[i]/prod(sin(mut))))
thes=matrix(mut,nrow=T,ncol=d-1,byrow=TRUE)
delta=rep(pi/2,d-1) #scale
past=target(thes[1,]) #current target
for (t in 2:T){
thes[t,]=thes[t-1,]
for (j in 1:(d-1)){
prop=thes[t,]
prop[j]=prop[j]+runif(1,-delta[j],delta[j])
prop[j]=prop[j]%%(2*pi-(j<d-1)*pi)
prof=target(prop)
if (runif(1)<prof/past){
past=prof;thes[t,]=prop}
}
}
n'est pas strictement possible car est une variable aléatoire (continue). Si vous souhaitez qu'il ait une variance de 1, c'est-à-dire (où le tilde signifie que nous estimons la variance), vous devrez alors exiger que sa variance soit . Cependant, cette demande peut entrer en conflit avec . Autrement dit, pour obtenir des échantillons avec cette variance, vous avez besoin que la diagonale de soit égale à .
Pour échantillonner cette distribution en général, vous pouvez générer des normales standard iid, puis multiplier par , la racine carrée de , puis ajouter les moyennes .