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.jl
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()

우선 평균에 관한 것이다.매개변수를 업데이트하면 실제 분포의 평균값에 점점 가까워집니다.분산 시비대각 성분은 0이기 때문에 변수 간의 관계를 잘 표현할 수 없다.

공부에 푹 빠졌다는 얘기인가요?

  • 후방 분포와 비슷한 협방차 행렬의 비대각 분량은 분포가 서로 독립한다고 가정하기 때문이다{12}=\lambda_{21}=0달러입니다.그러나 주의해야 할 것은 매개 변수 업데이트에 사용되는 협방차 행렬의 비대각 성분은 0이 아니라는 것이다.(나는 프로그램을 쓸 때 난잡해져서 비망록으로)
  • 정정값 매트릭스를 만들기 위해 지금까지 특징값을 모두 정으로 바꾸기 위해 매트릭스의 성분을 일일이 조정했지만 수산의 원본 코드를 통해 회전 매트릭스라는 직행 매트릭스를 사용하면 정정값 매트릭스를 간단하게 만들 수 있음을 알게 되었다.
  • 주리아로gif를 만드는 방법 참고여기..
  • PCA도 가능한가요?


    데이터에 PCA(주성분 분석)를 적용해 각 데이터 간의 연관성을 없앤 뒤 상사가 매개 변수를 추측하면 같은 결과가 나올 수 있다고 조언해주셔서 다음에도 해보고 싶어요.

    참고 문헌

  • 패턴 식별과 기계 학습 아래
  • 만들고 노는 기계 학습.
  • 의미 파악의 주성분 분석 Qiita 기사
  • 좋은 웹페이지 즐겨찾기