import random
Expectation Maximization
동전 던지기
어떤 동전인지 알 때 Expactation
어떤 동전에서 어떤 면이 나올 기댓값을 직접 구할 수 있다.
- 1: 앞 면
- 2: 뒷 면
A 동전
= 80
N = []
outcomes for i in range(N):
= random.choice([1, 2])
outcome
outcomes.append(outcome)= outcomes.count(1)
num_of_ones = num_of_ones / N
probability_of_one print("Number of ones:", num_of_ones)
print("Probability of one:", probability_of_one)
Number of ones: 37
Probability of one: 0.4625
B 동전
= 80
N = []
outcomes for i in range(N):
= random.choice([1, 2])
outcome
outcomes.append(outcome)= outcomes.count(1)
num_of_ones = num_of_ones / N
probability_of_one 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
임의의 초기값(랜덤 부여 가능)
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
…E/M step and Update Repeat
Local maximum으로 답 찾을 수 있음.