PRML10 장을 통해 근사 분해
하고 싶은 일
변분 추론은 분해를 통해 진정한 후방 분포와 비슷하다.이번에는 PRML 하권 10.1.2를 참고하여 실제 매개변수의 후분포 매개변수를 계산하고 줄거리를 Juria로 적습니다.
소스 코드 참조블로그 버스.
매개변수 업데이트 공식
상세하게 계산하면 수산 선생의 블로그는 비교적 이해하기 쉬우니 참고하세요.여기에 매개 변수 업데이트 공식만 씁니다.
이번 가설은 이변수 고스 분포를 다음과 같은 1변수 고스 분포로 나타낼 수 있다.q(\boldsymbol{z}) = q_{1}(z_{1})q_{2}(z_{2})
$q(\boldsymbol{z}) 달러에 대해 분포를 요구하는 인자 이외의 인자에 대한 기대치를 가져옵니다\log q_{1}(z_{1}) = E_{z_{2}}[ \log q(\boldsymbol{z}) ] + const \\
\log q_{2}(z_{2}) = E_{z_{1}}[ \log q(\boldsymbol{z}) ] + const
계산이 진행됨에 따라 각각 $z이다{1}, z_${2}에 대한 2차식이기 때문에 $q를 분포합니다{1}(z_{1}), q_{2}(z{2})$는 고스 분포입니다.q_{1}(z_{1}) = N( z_{1} | m_{1}, \lambda_{11}^{-1} ) \\
q_{2}(z_{2}) = N( z_{2} | m_{2}, \lambda_{22}^{-1} ) \\
m_{1} = \mu_{1} - \lambda_{11}^{-1}\lambda_{12}( E_{z_{2}}[z_{2}] - \mu_{2} ) \\
m_{2} = \mu_{2} - \lambda_{22}^{-1}\lambda_{21}( E_{z_{1}}[z_{1}] - \mu_{1} ) \\
여기는 $E입니다.{z_{1}}[z_{1}] = m_{1}, E_{z_{2}}[z_{2}] = m_{2}달러이기 때문에 매개 변수의 업데이트식은 서로 의존합니다.이 연립 방정식이 풀리면 즉시 $m{1} =\mu_{1}, m_{2} =\mu_{2}달러이지만 이번에는 매개 변수의 수렴 상황을 보아야 하기 때문에 매개 변수가 번갈아 업데이트됩니다.만약 순조롭게 갱신될 수 있다면 평균치는 매우 비슷할 것이다.
모든 분포가 독립적이라고 가정하기 때문에 공방차 행렬의 대각 분량은 0이다.또 비대각 성분은 분해 후 분포하는 방차와 같다.분산이 잘 드러나지 않는다는 것이다.
그럼 실제로 봐요.
소스 코드
gauss_decom.jlusing Distributions
using Plots
using StatsPlots
using LinearAlgebra
function update_param!( m, μ, λ )
m[1] = μ[1] - inv(λ[1,1])*λ[1,2]*(m[2] - μ[2])
m[2] = μ[2] - inv(λ[2,2])*λ[2,1]*(m[1] - μ[1])
end
function main()
# truth dist
true_μ = [0.0, 0.0]
# 回転行列は直行行列でもある
theta = 2.0*pi/12
A = reshape([cos(theta), -sin(theta),
sin(theta), cos(theta)], 2, 2)
true_Λ = inv(A * inv(reshape([1,0,0,10], 2, 2)) * A')
# init
# プロットがきれいになりそうな値で初期化した
m = [3.0,7.0]
Λ = [true_Λ[1,1] 0;0 true_Λ[2,2]]
anim = @animate for i in 1:20
update_param!( m, true_μ, true_Λ )
covellipse( true_μ, inv(true_Λ), xlim=[-2, 2], ylim=[-2, 2], title= "n=$i", label="truth_dist" )
plot!( [true_μ[1]], [true_μ[2]], markershape=:x, markersize=5, label=false )
covellipse!( m, inv(Λ), color="blue", coloralpha=0.3,label="approximate_dist" )
end
gif( anim, fps=5 )
end
main()
우선 평균에 관한 것이다.매개변수를 업데이트하면 실제 분포의 평균값에 점점 가까워집니다.분산 시비대각 성분은 0이기 때문에 변수 간의 관계를 잘 표현할 수 없다.
공부에 푹 빠졌다는 얘기인가요?
상세하게 계산하면 수산 선생의 블로그는 비교적 이해하기 쉬우니 참고하세요.여기에 매개 변수 업데이트 공식만 씁니다.
이번 가설은 이변수 고스 분포를 다음과 같은 1변수 고스 분포로 나타낼 수 있다.
q(\boldsymbol{z}) = q_{1}(z_{1})q_{2}(z_{2})
$q(\boldsymbol{z}) 달러에 대해 분포를 요구하는 인자 이외의 인자에 대한 기대치를 가져옵니다\log q_{1}(z_{1}) = E_{z_{2}}[ \log q(\boldsymbol{z}) ] + const \\
\log q_{2}(z_{2}) = E_{z_{1}}[ \log q(\boldsymbol{z}) ] + const
계산이 진행됨에 따라 각각 $z이다{1}, z_${2}에 대한 2차식이기 때문에 $q를 분포합니다{1}(z_{1}), q_{2}(z{2})$는 고스 분포입니다.q_{1}(z_{1}) = N( z_{1} | m_{1}, \lambda_{11}^{-1} ) \\
q_{2}(z_{2}) = N( z_{2} | m_{2}, \lambda_{22}^{-1} ) \\
m_{1} = \mu_{1} - \lambda_{11}^{-1}\lambda_{12}( E_{z_{2}}[z_{2}] - \mu_{2} ) \\
m_{2} = \mu_{2} - \lambda_{22}^{-1}\lambda_{21}( E_{z_{1}}[z_{1}] - \mu_{1} ) \\
여기는 $E입니다.{z_{1}}[z_{1}] = m_{1}, E_{z_{2}}[z_{2}] = m_{2}달러이기 때문에 매개 변수의 업데이트식은 서로 의존합니다.이 연립 방정식이 풀리면 즉시 $m{1} =\mu_{1}, m_{2} =\mu_{2}달러이지만 이번에는 매개 변수의 수렴 상황을 보아야 하기 때문에 매개 변수가 번갈아 업데이트됩니다.만약 순조롭게 갱신될 수 있다면 평균치는 매우 비슷할 것이다.모든 분포가 독립적이라고 가정하기 때문에 공방차 행렬의 대각 분량은 0이다.또 비대각 성분은 분해 후 분포하는 방차와 같다.분산이 잘 드러나지 않는다는 것이다.
그럼 실제로 봐요.
소스 코드
gauss_decom.jlusing Distributions
using Plots
using StatsPlots
using LinearAlgebra
function update_param!( m, μ, λ )
m[1] = μ[1] - inv(λ[1,1])*λ[1,2]*(m[2] - μ[2])
m[2] = μ[2] - inv(λ[2,2])*λ[2,1]*(m[1] - μ[1])
end
function main()
# truth dist
true_μ = [0.0, 0.0]
# 回転行列は直行行列でもある
theta = 2.0*pi/12
A = reshape([cos(theta), -sin(theta),
sin(theta), cos(theta)], 2, 2)
true_Λ = inv(A * inv(reshape([1,0,0,10], 2, 2)) * A')
# init
# プロットがきれいになりそうな値で初期化した
m = [3.0,7.0]
Λ = [true_Λ[1,1] 0;0 true_Λ[2,2]]
anim = @animate for i in 1:20
update_param!( m, true_μ, true_Λ )
covellipse( true_μ, inv(true_Λ), xlim=[-2, 2], ylim=[-2, 2], title= "n=$i", label="truth_dist" )
plot!( [true_μ[1]], [true_μ[2]], markershape=:x, markersize=5, label=false )
covellipse!( m, inv(Λ), color="blue", coloralpha=0.3,label="approximate_dist" )
end
gif( anim, fps=5 )
end
main()
우선 평균에 관한 것이다.매개변수를 업데이트하면 실제 분포의 평균값에 점점 가까워집니다.분산 시비대각 성분은 0이기 때문에 변수 간의 관계를 잘 표현할 수 없다.
공부에 푹 빠졌다는 얘기인가요?
using Distributions
using Plots
using StatsPlots
using LinearAlgebra
function update_param!( m, μ, λ )
m[1] = μ[1] - inv(λ[1,1])*λ[1,2]*(m[2] - μ[2])
m[2] = μ[2] - inv(λ[2,2])*λ[2,1]*(m[1] - μ[1])
end
function main()
# truth dist
true_μ = [0.0, 0.0]
# 回転行列は直行行列でもある
theta = 2.0*pi/12
A = reshape([cos(theta), -sin(theta),
sin(theta), cos(theta)], 2, 2)
true_Λ = inv(A * inv(reshape([1,0,0,10], 2, 2)) * A')
# init
# プロットがきれいになりそうな値で初期化した
m = [3.0,7.0]
Λ = [true_Λ[1,1] 0;0 true_Λ[2,2]]
anim = @animate for i in 1:20
update_param!( m, true_μ, true_Λ )
covellipse( true_μ, inv(true_Λ), xlim=[-2, 2], ylim=[-2, 2], title= "n=$i", label="truth_dist" )
plot!( [true_μ[1]], [true_μ[2]], markershape=:x, markersize=5, label=false )
covellipse!( m, inv(Λ), color="blue", coloralpha=0.3,label="approximate_dist" )
end
gif( anim, fps=5 )
end
main()
PCA도 가능한가요?
데이터에 PCA(주성분 분석)를 적용해 각 데이터 간의 연관성을 없앤 뒤 상사가 매개 변수를 추측하면 같은 결과가 나올 수 있다고 조언해주셔서 다음에도 해보고 싶어요.
참고 문헌
Reference
이 문제에 관하여(PRML10 장을 통해 근사 분해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takahashi-ry/items/269058f83e1dcedc9776텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)