[Papers][HMM] Hidden Markov Model for Gesture Recognition - The ...
Machine Learning/Papers - 논문 2015. 3. 11. 10:16http://www-preview.ri.cmu.edu/pub_files/pub3/yang_jie_1994_1/yang_jie_1994_1.pdf
HMM을 이용한 제스쳐 인식에 대해 잘 설명 되어 있는 것 같음
지금 읽는 중
http://www-preview.ri.cmu.edu/pub_files/pub3/yang_jie_1994_1/yang_jie_1994_1.pdf
HMM을 이용한 제스쳐 인식에 대해 잘 설명 되어 있는 것 같음
지금 읽는 중
결국 YAHMM라이브러리로 사용하기로 결정~!!
아래에 자세한 설명이 있고,
https://pypi.python.org/pypi/yahmm/0.1.1
'패턴인식 - 오일식 저'의 평가, 디코딩, 학습에 대한 설명도 있다.
*평가, 디코딩, 학습에 대한 예제가 뭔지 모르는 사람은 wiki에도 있으니 확인 : http://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example
코드 설명 : https://github.com/jmschrei/yahmm/wiki
설치 방법도 쉽다.
그냥
pip install yahmm
끝~!!
소스코드는 아래와 같다.
Baum-Welch 알고리즘도 구현이 됐다고 하는데 내가 책에서 봤던 것 처럼 최적화된 모델을 찾아준 건지는 모르겠다.
최적화된 모델을 찾았다면 그 모델에 대한 A, B, 초기확률 을 찾아줘야 할 것 같은데 그게 아니다.
이 부분에 대해서는 좀 더 공부를 해 봐야할 것 같다.
# rainy_sunny_hmm.py
# Contact: Jacob Schreiber
# jmschreiber91@gmail.com
"""
Example rainy-sunny HMM using yahmm. Example drawn from the wikipedia HMM
article: http://en.wikipedia.org/wiki/Hidden_Markov_model describing what
Bob likes to do on rainy or sunny days.
"""
from yahmm import *
import random
import math
random.seed(0)
model = Model( name="Rainy-Sunny" )
# Emission probabilities
rainy = State( DiscreteDistribution({ 'walk': 0.1, 'shop': 0.4, 'clean': 0.5 }), name='rainy')
sunny = State( DiscreteDistribution({ 'walk': 0.6, 'shop': 0.3, 'clean': 0.1 }), name='sunny' )
# Add the states to the model
model.add_state( rainy )
model.add_state( sunny )
model.add_transition( model.start, rainy, 0.6 )
model.add_transition( model.start, sunny, 0.4 )
# Transition matrix, with 0.05 subtracted from each probability to add to
# the probability of exiting the hmm
model.add_transition( rainy, rainy, 0.7 )
model.add_transition( rainy, sunny, 0.3 )
model.add_transition( sunny, rainy, 0.4 )
model.add_transition( sunny, sunny, 0.6 )
# Finalize the model structure
model.bake( verbose=True )
# Lets call Bob every hour and see what he's doing!
# (aka build up a sequence of observations)
sequence = [ 'walk', 'walk', 'clean', 'shop']
print 'Evaluation : ', math.e**model.log_probability(sequence)
print 'Observation : ', sequence
logp, path = model.viterbi(sequence)
for i in range(4):
if(i == 0):
print 'Decoding : [', \
if(path[i+1][0]==0):
print "'Rainy'", \
else:
print "'Sunny'", \
print ']\n'
model.train( [sequence], algorithm='baum-welch' )
print math.e**model.log_probability(sequence)
print 'sequence : ', sequence
logp, path = model.viterbi(sequence)
print path
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models(2) (0) | 2015.03.02 |
---|---|
[파이썬 용 HMM 라이브러리][hmmpytk] (0) | 2015.02.27 |
파이썬 용 HMM 라이브러리 (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models (0) | 2015.02.26 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] (0) | 2015.02.25 |
내가 하고 싶은 문제에 대한 코드가 user guide에는 제대로 나와 있지 않아 검색해보다가 제대로 된 예제코드가 있어서 아래에 주소를 남겨 두었다.
http://sujitpal.blogspot.kr/2013/03/the-wikipedia-bob-alice-hmm-example.html
예제코드는 아래의 예제를 코딩한 것이라고 하는데 관측확률 입력값만 다를 뿐 모든 것이 '패턴인식-오일식 저'의 예제 7.4 여자친구의 삶과 동일했다.
http://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example
위 예제에서는 디코딩에 대한 예제만 있어서 이 예제에서 했던 방식을 통해 guide를 참고하여 7.4.1 평가 문제까지 풀었다.
guide출처 : http://scikit-learn.org/0.6/modules/generated/scikits.learn.hmm.MultinomialHMM.html
7.4.3 학습은 다음에 다루겠다.
코드 내용은 아래와 같다.
from __future__ import division
import numpy as np
from hmmlearn import hmm
states = ["Rainy", "Sunny"]
n_states = len(states)
observations = ["walk", "shop", "clean"]
n_observations = len(observations)
start_probability = np.array([0.6, 0.4])
transition_probability = np.array([
[0.7, 0.3],
[0.4, 0.6]
])
emission_probability = np.array([
[0.1, 0.4, 0.5],
[0.6, 0.3, 0.1]
])
model = hmm.MultinomialHMM(n_components=n_states)
model._set_startprob(start_probability)
model._set_transmat(transition_probability)
model._set_emissionprob(emission_probability)
# predict a sequence of hidden states based on visible states
#bob_says = [0, 2, 1, 1, 2, 0]
bob_says = [0, 0, 2, 1]
prob, arr = model.eval(bob_says)
#print model.decode(bob_says)
print "evaluation : ", exp(prob)
logprob, alice_hears = model.decode(bob_says, algorithm="viterbi")
print "Bob says:", ", ".join(map(lambda x: observations[x], bob_says))
print "Alice hears:", ", ".join(map(lambda x: states[x], alice_hears))
mode.eval은 log를 취한 값을 return해 주기 때문에 지수함수를 취한 값을 최종 결과 값으로 생각하면 된다.
이로써 내가 하려고 했던 평가와 디코딩에 대한 코딩 실험이 끝났다.
이제 학습을 공부할 차례인다.
[파이썬 용 HMM 라이브러리][YAHMM] YAHMM라이브러리 (0) | 2015.03.03 |
---|---|
[파이썬 용 HMM 라이브러리][hmmpytk] (0) | 2015.02.27 |
파이썬 용 HMM 라이브러리 (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models (0) | 2015.02.26 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] (0) | 2015.02.25 |
- 지지벡터머신( SMV: Support Vector Machines)
01. 중매 데이터 세트
02. 데이터를 다루는 어려움
r.data[0] : 남
r.data[1] : 여
특성 : 비선형(nonlinearity), 변수 간 상호작용(interplay)
*matplotlib를 사용해서 그래프를 그렸음. 나중에 그래프 그릴 때 참조
데이터를 그래프로 확인해 보니 남녀는 각자의 나이 법위 내에서 만나는 특성이 보임
- 의사 결정 분류기 사용: 다소 복잡한 관계를 보이는 다중 숫자 입력들을 가진 문제에서 분류를 결정할 때 종종 잘 동작하지 않는다.
03. 기본 선형 분류
범주의 평균점을 계산
(1) 평균점 계산으로 두 점을 찾음
- 불일치의 평균과 일치의 평균을 찾고 가운데 선을 그어서 일치와 불일치 쌍을 나누도록 한다.
(2) 데이터를 나누는 선을 찾음
(3) 유클리디안 거리를 사용해도 되지만 추후 확장을 고려하여 벡터와 백터 내적을 사용함
벡터 내적 : 가까울 수록 1에 근접, 0이면 수직이기 때문에 가장 다름 -1이면 멀다.
책에서는 각 평균점을 연결한 선과 평균점의 중간점과 분류할 데이터를 연결한 선을 벡터 계산하여 분류할 데이터가 어디에 가까운지 평가한다.
하지만 기본 선형 분류는 완벽히 제대로 된 분류를 하지 못하기 때문에 나중에 커널 트릭을 사용한다.
04. 분류 데이터의 특성
데이터를 분류기에 유용한 숫자로 바꿀 방법이 있어야 한다.
(1) 예 아니오 질문
(2) 관심 목록
(3) 야후 지도를 사용한 거리 계산
- 지오 코딩 API사용
(4) 새로운 데이터 세트 생성
05. 데이터 축척 조정
- 최저값을 0으로 최고값을 1로 그 다른 값을 0과 1사이의 값으로 비율을 조정함
06. 커널 기법 이해
값을 제곱하여 선형으로 분류할 수 있게 만듬
(1) 커널 트릭
- 방사 함수(radial-basis function) : 백터내적과 비슷해서 두 벡터를 받아 값을 리턴한다.
이것은 벡터내적가 달리 선형적이지 않아 더 복잡한 공간으로 매핑될 수 있다.
gamma를 바꿔가면서 적당한 값을 찾아야 한다.
07. 지지벡터머신
두 범주를 가르는 직선을 찾는 다른 경우를 보자.
각 범주의 평균점들과 평균점들을 포함하는 직선
각 범주 내 항목들에 걸친 평행선 중에 가장 멀리 떨어진 선을 구분선으로 선택
*지지벡터 : 선 근처의 점들
*지지벡터 머신 : 지지벡터를 찾아 이들을 이용해서 구분선을 찾는 알고리즘
ex) 얼굴 표현 분류, 침입 탐지, 단백질 구조 예측, 필기체 인식, 지진 발생 시 피해 규모 판단 등
08. LIBSVM 사용
SVM모델을 학습시키고 추정하며 데이터 세트 내 예측을 검증하는 오픈소스 라이브러리
svm_parameter : c - sort margin
[집단지성프로그래밍] 12. 알고리즘 요약 (0) | 2015.03.21 |
---|---|
[집단지성프로그래밍] 11. Evolving Intelligence (0) | 2015.03.14 |
[ML][집단지성 프로그래밍] 8장 가격 모델링 (0) | 2015.02.21 |
[ML][집단지성프로그래밍] 7. 의사 결정 트리 (0) | 2015.02.14 |
[ML][집단지성 프로그래밍] 제5회 Machine Learning Meetup 2부 (0) | 2015.02.10 |
scikit-learn을 이용하여 hmm을 사용해보려 하였으나
이런 저런 삽질 끝에 사용하기 쉽지 않다는 것을 확인했다
'패턴인식 - 오일식 저' 책을 읽다 보니 Cambridge대학에서 만든 HMM Toolkit이 있다는 것을 확인했고 이것을 C용으로 작업한게 있다고 해서 작업을 해 보려고 한다.
hmmpytk 인데 주소는 아래와 같다.
https://code.google.com/p/hmmpytk/wiki/Tutorial
[파이썬 용 HMM 라이브러리][YAHMM] YAHMM라이브러리 (0) | 2015.03.03 |
---|---|
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models(2) (0) | 2015.03.02 |
파이썬 용 HMM 라이브러리 (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models (0) | 2015.02.26 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] (0) | 2015.02.25 |
7.4.3 학습
관측 벡터 O의 확률을 최대로 하는 모델 ⓗ를 찾는 문제
O로 ⓗ를 직접 구할 수는 없고 중간에 '숨어서' 매개 역할을 하는 변수가 필요하다. 이러한 변수는 이미 3.4.2절의 EM알고리즘에서 등작하였고 은닉 변수(latent variable)라 불렀다.
가우시안 혼합에서는 샘플이 독립 동일 분포에서 발생했다는 가정 하에 요소 분포들을 독립적으로 취급하는 반면 HMM은 분포들이 시간에 따라 관련성을 갖는다고 간주하고 상태 이전 확률을 개입시키는 근본적인 차이가 있다.
알고리즘에서 기대값을 구하는 단계와 우도를 최대화 하는 (Maximum likelihood) 단계로 구성된다.
좌우 모델은 온라인 필기 인식이나 음성 인식 같은 응용에 주로 사용되는데 이런 응용에서는 T가 작다. 대신 하나의 관측이 주어지는 것이 아니라 여러 개가 주어진다. 따라서 다중 관측을 위한 학습이 가능하도록 알고리즘을 변경해야 한다. 이에 대해서는 [Davis02, Rabiner93, Rabiner89]를 참고
일단 책을 읽고 대충 이해는 했는데 양이 워낙 방대하여 쓰지는 못하겠다.
파이썬으로 코드를 짜봐야겠다.
[ML][패턴인식] 12장 혼성 모델 (0) | 2015.02.08 |
---|---|
[ML][패턴인식] 11. 최적화 알고리즘 (0) | 2015.02.08 |
[ML][패턴인식] 10. 군집화(clustering) (0) | 2015.02.08 |
[ML][패턴인식] 8. Feature Extraction (0) | 2015.02.08 |
[ML][패턴인식] 7. 순차 데이터 인식(Hidden Markov Model) (0) | 2015.02.07 |
1 . scikit-learn 라이브러리
- hmm관련 정식 지원은 종료 되었고 hmmlearn으로 분리 됨
2. hmmlearn
- 평가, 디코딩은 잘 사용할 수 있음
- 학습을 포함한 나머지는 문서가 허접해서 사용하기 힘듬
3. hmmpytk
- '패턴인식 - 오일식 저' 책을 읽다 보니 Cambridge대학에서 만든 HMM Toolkit이 있다는 것을 확인했고 이것을 Python용으로 작업한게 있다고 해서 작업을 해 보려고 했으나 speech recognition 위주로 되어 있어서 내가 사용하려는 것과는 좀 차이가 있어서 보류
주소는 아래와 같다.
https://code.google.com/p/hmmpytk/wiki/Tutorial
4. http://ghmm.org/
많이 사용하는 것 같음 but 아래 블로그에서는 문서가 많지 않다고 평이 안좋음.
그래도 사용해보려고 했으나 내가 개발하고 있는 Mac에 설치가 잘 되지 않아서 사용 실패
http://www.quora.com/What-is-the-best-Python-library-for-Hidden-Markov-Models
LGPL라이센스가 걸려있음
* LGPL 라이센스 : 라이브러리로 개발하고 LGPL을 사용했다는 것만 명시하면 소스코드는 공개하지 않아도 됨
"LGPL은 GPL보다는 훨씬 완화된(lesser) 조건의 공개 소프트웨어 라이센스입니다.
가장 큰 차이점은 LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램의 소스코드를 공개하지 않아도 된다는 점입니다. LGPL 코드를 사용했음을 명시만 하면 됩니다.
단, LGPL 코드를 단순히 이용하는 것이 아니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우에는 전체 코드를 공개해야 합니다." - 출처 : http://darkpgmr.tistory.com/89
5. 학교에서 수업용으로 만든 것 같아 이름은 짓기 어려움
http://www.cs.colostate.edu/~anderson/cs440/index.html/doku.php?id=notes:hmm2
Rabiner의 자연어 인식 알고리즘을 구현한 것 같음
일단 간단하게 적용해볼 수 있을 것 같음
6. YAHMM
앞으로 이걸 사용하게 될 것 같은데 일단 문서도 좀 제대로 되어 있는 편이고 평가, 디코딩은 제대로 구현되고 학습도 잘 구현되어 있는 것 같음
출처 : https://pypi.python.org/pypi/yahmm/0.1.1
내가 구현한 소스 코드는 아래 주소
http://gongnorina.tistory.com/74
[파이썬 용 HMM 라이브러리][YAHMM] YAHMM라이브러리 (0) | 2015.03.03 |
---|---|
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models(2) (0) | 2015.03.02 |
[파이썬 용 HMM 라이브러리][hmmpytk] (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models (0) | 2015.02.26 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] (0) | 2015.02.25 |
이 곳 구현은 아래 user-guide를 토대로 진행 됩니다.
http://www.math.unipd.it/~aiolli/corsi/1213/aa/user_guide-0.12-git.pdf
sklearn.hmm 은 HMM알고리즘을 구현하였다.
HMM에는 기본적으로 세가지 문제가 있다.
(1) 평가 : 주어진 모델의 파라미터(ⓗ) 들과 관측 데이터(O)가 주어졌을 때 최적의 hidden state의 열(sequence)를 예측하는 것
(2) 디코딩 : 주어진 모델의 파라미터(ⓗ) 들과 관측 데이터(O)가 주어졌을 때 데이터의 우도(likelihood)를 계산하는 것
(3) 학습 : 관측 데이터가 주어졌을 때 모델 파라미터(ⓗ)를 예측하는 것
(1)과 (2)는 Viterbi algorithm으로 알려진 동적 프로그래밍(dynamic programming)과 Foward-Backward 알고리즘으로 풀수 있다.
(3)은 Baum-Welch algorithm으로 알려진 Expectation-Maximization(EM)으로 풀 수 있다.
여기까지 읽어봤을 때 '패턴인식-오일식 저' 책의 내용과 일치한다.
아마 책이나 이 user guide다 둘 다 Rabiner89 논문 내용을 토대로 작성되었기 때문일 것 같다.
여튼 계속 짜 봐야지
앞부분을 짜보니 이런 젠장.. 아래와 같은 에러가 발생한다.
사이트를 가보니 HMM 이 좀 바뀐 것 같다.
scikit-learn에서 hmmlearn으로 옮겨 간 것 같다
그래서 일단 경고에 있는대로 https://github.com/hmmlearn/hmmlearn 주소로 들어가 시키는대로 하나씩 해보았다.
1. git을 clone 하고
git clone git://github.com/hmmlearn/hmmlearn.git
2. dependency를 확인하고(?)
pip install scikit-learn Python
3. hmmlearn을 git을 받은 폴더에서 설치한다.
python setup.py install
설치 후 sclearn을 hmmlearn으로 바꾸고 실행을 해보니 아래와 같은 에러 발생
stack overflow도움으로(https://github.com/hmmlearn/hmmlearn/issues/3)
hmmlearn 폴더를 통채로 복사해버렸다.
sudo cp -rf ./* /usr/local/lib/python2.7/dist-packages/hmmlearn
로 설명을 해줬지만 난 아나콘다를 설치하고 그 환경에서 개발을 하고 있으므로
sudo cp -rf ./* /anaconda/lib/python2.7/site-packages/hmmlearn
로 복사를 해 주었다.
여튼 아래 코드는 실행 완료
import numpy as np
from hmmlearn import hmm
startprob = np.array([0.6, 0.3, 0.1])
transmat = np.array([[0.7, 0.2, 0.1], [0.3, 0.5, 0.2], [0.3, 0.3, 0.4]])
means = np.array([[0.0, 0.0], [3.0, -3.0], [5.0, 10.0]])
covars = np.tile(np.identity(2), (3, 1, 1))
model = hmm.GaussianHMM(3, "full", startprob, transmat)
model.means_ = means
model.covars_ = covars
X, Z = model.sample(100)
하지만, 코드를 실행하면 user-guide 처럼 그래프가 나올 줄 알았으나 나오지 않아서 당황함..
일단 코드 분석
array에 등록하는 것 까지는 ok
np의 tile이 뭘 하는걸까??
일단 구글 검색을 하려다 그냥 '파이썬라이브러리를 활용한 데이터 분석'책을 펴고 tile을 찾아보니 491p에 배열을 복사해 쌓는 메서드라고 나옴
그럼 np.identity로 불러온 배열을 3,1,1만큼 복사하는 것 같다.
print를 뭔지 봐야겠다.
np.identity는 [[ 1. 0.] 기본 배열(? 이름 까먹음)이 생긴다.
[ 0. 1.]]
print로 보니 아래로 세개의 배열이 생긴다.
covars [[[ 1. 0.] [ 0. 1.]] [[ 1. 0.] [ 0. 1.]] [[ 1. 0.] [ 0. 1.]]]
그래프 그려주는 건 아래 코드
import numpy as np
import matplotlib.pyplot as plt
from hmmlearn import hmm
############################################################## # Prepare parameters for a 3-components HMM
# Initial population probability
start_prob = np.array([0.6, 0.3, 0.1, 0.0])
# The transition matrix, note that there are no transitions possible # between component 1 and 4
trans_mat = np.array([[0.7, 0.2, 0.0, 0.1],
[0.3, 0.5, 0.2, 0.0],
[0.0, 0.3, 0.5, 0.2],
[0.2, 0.0, 0.2, 0.6]])
# The means of each component
means = np.array([[0.0, 0.0],
[0.0, 11.0],
[9.0, 10.0],
[11.0, -1.0],
])
# The covariance of each component
covars = .5 * np.tile(np.identity(2), (4, 1, 1))
# Build an HMM instance and set parameters
model = hmm.GaussianHMM(4, "full", start_prob, trans_mat,
random_state=42)
# Instead of fitting it from the data, we directly set the estimated # parameters, the means and covariance of the components
model.means_ = means
model.covars_ = covars ###############################################################
# Generate samples
X, Z = model.sample(500)
# Plot the sampled data
plt.plot(X[:, 0], X[:, 1], "-o", label="observations", ms=6, mfc="orange", alpha=0.7)
# Indicate the component numbers
for i, m in enumerate(means):
plt.text(m[0], m[1], "Component %i" % (i + 1),
size=17, horizontalalignment="center",
bbox=dict(alpha=.7, facecolor="w"))
plt.legend(loc="best")
plt.show()
이제 내가 해보고 싶은 것은 '패턴인식 - 오일식저' 의 HMM코드를 파이썬으로 돌려보는 것이다.
이것은 다음에 다루겠다.
[파이썬 용 HMM 라이브러리][YAHMM] YAHMM라이브러리 (0) | 2015.03.03 |
---|---|
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models(2) (0) | 2015.03.02 |
[파이썬 용 HMM 라이브러리][hmmpytk] (0) | 2015.02.27 |
파이썬 용 HMM 라이브러리 (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] (0) | 2015.02.25 |
아래 주소에서 볼 수 있다.
http://www.math.unipd.it/~aiolli/corsi/1213/aa/user_guide-0.12-git.pdf
python으로 HMM 구현이 된 것을 찾다가 우연히 알게된 user guide
이걸 보고 HMM 구현을 해 보아야겠다.
[파이썬 용 HMM 라이브러리][YAHMM] YAHMM라이브러리 (0) | 2015.03.03 |
---|---|
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models(2) (0) | 2015.03.02 |
[파이썬 용 HMM 라이브러리][hmmpytk] (0) | 2015.02.27 |
파이썬 용 HMM 라이브러리 (0) | 2015.02.27 |
[파이썬 용 HMM 라이브러리][scikit-learn user guide] 1.4.7 Hidden Markov Models (0) | 2015.02.26 |
몬티홀 문제 만으로도 얘기가 길어져서 여기로 따로 빼 두었다.
몬티홀은 베이지안 문제가 아니다. 그냥 확률 문제이다.
이걸 코드로 짜보니 이유를 알겠다.
import random
length = 100000
list = [random.randrange(0,3) for i in range(length)]
#print list
o_true_sum = 0
o_false_sum = 0
c_true_sum = 0
c_false_sum = 0
for i in range(length):
select = random.randrange(0,3)
if list[i] == select:
#true_sum+=1
temp = random.randrange(1,3) + list[i]
if temp == 3:
temp = 0
#print list[i], 'correct', temp
o_true_sum+=1
c_false_sum+=1
else:
#false_sum+=1
temp = random.randrange(1,3) + list[i]
if temp == 3:
temp = 0
#print list[i], 'false', temp
o_false_sum+=1
c_true_sum+=1
print 100 * o_true_sum/length
print 100 * c_true_sum/length
허접하지만 코드를 만들어서 돌려보았다.
만들다 보니 알았다.
바꾸는 것이 맞을 확률이 더 높다.
왜냐하면 바른 걸 선택할 확률은 1/3 즉 33.3%이다.
만약 바꾸지 않으면 바른 걸 선택했다는 가정하에 맞출 확률은 100%이다.
틀린걸 선택할 확률은 2/3 즉 66.6%이다.
66.6%에서 선택을 바꾸지 않으면 맞출 확률은 0%
66.6%에서 선택을 바꾸면 맞출 확률은 100%이다.
왜냐하면 몬티홀이 잘못된 거 하나를 빼주었기 때문이다.
따라서 틀린걸 선택한 경우 바꾸면 맞출 확률은 100%이다.
게스트는 처음 선택이 틀릴 확률이 66.6%로 맞출 확률이 33%보다 2배 높다.
그렇기 때문에 게스트는 자신이 처음에 틀렸다는 가정하에 결정을 해야 한다.
게스트가 자신이 틀렸다는 가정을 하고나서 결정을 해야 한다면 그렇다.
자신의 답을 바꾸면 맞출 확률이 100%가 되므로 선택을 바꾸는 것이 확률이 더 높다.
[Think Bayes] 2. 계산 통계 (0) | 2015.02.20 |
---|---|
[Think Bayes] 1. 베이즈 이론 (0) | 2015.02.16 |