이 문제의 공식적인 해결을 위해서는 먼저 적절한 정의가 필요합니다.
"엔디( μ , Σ ) 제약 조건에 따라 배포
| | x ||2= 1"
자연스러운 방법은 엑스∼엔디( μ , Σ ) 조건부 | | 엑스| | =ϱ. 이 조건을 사례에 적용하려면ϱ = 1. 우리가 사용하는 경우 극 좌표를 ,
엑스1엑스2엑스디− 1엑스디= ϱ 왜냐하면(θ1)= ϱ 죄(θ1) cos(θ2)⋮= ϱ (∏나는 = 1디− 2죄(θ나는) ) COS(θ디− 1)= ϱ∏나는 = 1디− 1죄(θ나는)θ1∈ [ 0 , π]θ2∈ [ 0 , π]θ디− 1∈ [ 0 , 2 π]
변형의 야곱은
ϱ디− 1∏나는 = 1디− 2죄(θ나는)디− 1 − 나는
따라서 분포의 조건부 밀도
θ =(θ1, ... ,θ디− 1) 주어진
ϱ 이다
에프( θ | ϱ ) ∝ exp− 12{ ( x ( θ , ϱ ) − μ)티Σ− 1( x ( θ , ϱ ) − μ ) }∏나는 = 1디− 2죄(θ나는)디− 1 − 나는
결론 : 이 밀도는 자 코비안 (Jacobian) 때문에 노말 밀도를 단위 구의 점에 단순히 적용하는 것과 다릅니다.
두 번째 단계는 목표 밀도를 고려하는 것입니다
에프( θ | ϱ = 1 ) ∝ exp− 12{ ( x ( θ , 1 ) − μ)티Σ− 1( x ( θ , 1 ) − μ ) }∏나는 = 1디− 2죄(θ나는)디− 1 − 나는
매개 변수 공간을 탐색하기 위해 Markov 체인 Monte Carlo 알고리즘을 설계
[ 0 , π]디− 2× [ 0 , 2 π]. 나의 첫 번째 시도는 Gibbs 샘플러에서 이루어졌으며 가장 가까운 구체의 지점에서 초기화되었습니다.
μ, 그건,
μ / | | μ | |및 대도시 내 방식으로 한 번에 한 각도 씩 진행 :
- 일으키다 θ( t + 1 )1∼ U( [θ( t )1−δ1,θ( t )1+δ1] ) (합은 계산 된 모듈로 π) 및이 새로운 값을 확률로 수락
에프(θ( t + 1 )1,θ( t )2, . . . | ϱ = 1 )에프(θ( t )1,θ( t )2, . . . | ϱ = 1 )∧ 1
그밖에 θ( t + 1 )1=θ( t )1
- 일으키다 θ( t + 1 )2∼ U( [θ( t )2−δ2,θ( t )2+δ2] ) (합은 계산 된 모듈로 π) 및이 새로운 값을 확률로 수락
에프(θ( t + 1 )1,θ( t + 1 )2,θ( t )삼, . . . | ϱ = 1 )에프(θ( t + 1 )1,θ( t )2,θ( t )삼, . . . | ϱ = 1 )∧ 1
그밖에 θ( t + 1 )2=θ( t )2
- …
- 일으키다 θ( t + 1 )디− 1∼ U( [θ( t )디− 1−δ디− 1,θ( t )디− 1+δ디− 1] ) (합은 계산 된 모듈로 2 π) 및이 새로운 값을 확률로 수락
에프(θ( t + 1 )1,θ( t + 1 )2, . . . ,θ( t + 1 )디− 1| ϱ=1)에프(θ( t + 1 )1,θ( t + 1 )2, . . . ,θ( t )디− 1| ϱ=1)∧ 1
그밖에 θ( t + 1 )디− 1=θ( t )디− 1
저울 δ1, δ2, …, δ디− 1 이상적인 목표를 향해 단계의 수용 률에 따라 조정될 수 있습니다. 50 %.
위의 내용을 설명하는 R 코드는 다음과 같습니다. μ 과 Σ:
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}
}
}