Expectation Maximization(EM algorithm)

Author

SEOYEON CHOI

Published

May 9, 2023

Expectation Maximization

import random

동전 던지기

어떤 동전인지 알 때 Expactation

어떤 동전에서 어떤 면이 나올 기댓값을 직접 구할 수 있다.

  • 1: 앞 면
  • 2: 뒷 면

A 동전

N = 80
outcomes = []
for i in range(N):
    outcome = random.choice([1, 2])
    outcomes.append(outcome)
num_of_ones = outcomes.count(1)
probability_of_one = num_of_ones / N
print("Number of ones:", num_of_ones)
print("Probability of one:", probability_of_one)
Number of ones: 37
Probability of one: 0.4625

B 동전

N = 80
outcomes = []
for i in range(N):
    outcome = random.choice([1, 2])
    outcomes.append(outcome)
num_of_ones = outcomes.count(1)
probability_of_one = num_of_ones / N
print("Number of ones:", num_of_ones)
print("Probability of one:", probability_of_one)
Number of ones: 45
Probability of one: 0.5625

어떤 동전인지 모를 때 Expactation

값이 어떤 동전에서 나오는지 모르는 경우

  • 10번 시도한 1 sequence: 앞/뒤/앞/뒤/뒤/앞/뒤/앞/앞/뒤

  • 사용되는 동전의 수 = hidden variable/latent variable

임의의 초기값(랜덤 부여 가능)

  • θA=0.4
  • θB=0.3

E step

1 sequence에서 Hidden variable의 responsibility를 구한다.

A 동전

(0.4)**5*(0.6)**5
0.0007962624

B 동전

(0.3)**5*(0.7)**5
0.00040841009999999976

1 sequence에서 A 동전을 사용했을 비율(responsibility)

round(((0.4)**5*(0.6)**5)/((0.4)**5*(0.6)**5 + (0.3)**5*(0.7)**5),2)
0.66

1 sequence에서 B 동전을 사용했을 비율(responsibility)

round(((0.3)**5*(0.7)**5)/((0.4)**5*(0.6)**5 + (0.3)**5*(0.7)**5),2)
0.34

M step

1 sequence에서 A 동전 앞면

round((0.66)*5,2)
3.3

1 sequence에서 A 동전 뒷면

round((0.44)*5,2)
2.2

1 sequence에서 B 동전 앞면

round((0.34)*5,2)
1.7

1 sequence에서 B 동전 뒷면

round((0.66)*5,2)
3.3

이런 식으로 모든 sequence의 동전의 앞 뒷명면의 reponsibility를 사용하여 probability를 계산한다.

Update

θ^A(1)1414+160.47

θ^B(1)1414+160.38

…E/M step and Update Repeat

Local maximum으로 답 찾을 수 있음.