import randomExpectation Maximization
동전 던지기
어떤 동전인지 알 때 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
임의의 초기값(랜덤 부여 가능)
- \(\theta_A = 0.4\)
- \(\theta_B = 0.3\)
E step
1 sequence에서 Hidden variable의 responsibility를 구한다.
A 동전
(0.4)**5*(0.6)**50.0007962624
B 동전
(0.3)**5*(0.7)**50.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
\(\dots\)
이런 식으로 모든 sequence의 동전의 앞 뒷명면의 reponsibility를 사용하여 probability를 계산한다.
Update
\(\hat{\theta}^{(1)}_A \sim \frac{14}{14+16} \sim 0.47\)
\(\hat{\theta}^{(1)}_B \sim \frac{14}{14+16} \sim 0.38\)
…E/M step and Update Repeat
Local maximum으로 답 찾을 수 있음.