import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import copy
15wk-1: MCMC (3)
2023-06-01
강의영상
youtube: https://youtube.com/playlist?list=PLQqh36zP38-z-M7HO1xUnq2z5lK8aq1_a
imports
모티브
-
축구기사
-
16강진출 경우의 수
-
통계, 데이터과학
- 생략
문제소개
-
3개의 문서가 있으며 각 문서에는 아래와 같이 2개의 단어가 있는 데이터를 고려하자.
= {
D 'doc1':['손흥민','골'],
'doc2':['골','확률'],
'doc3':['확률','데이터과학']
} D
{'doc1': ['손흥민', '골'], 'doc2': ['골', '확률'], 'doc3': ['확률', '데이터과학']}
- 여기에서
는 문서들의 집합, 즉 코퍼스를 의미한다.
-
데이터설명
토픽
- 토픽0 = 축구 : ‘골’, ‘손흥민’ 와 같은 단어가 쓰임.
- 토픽1 = 통계 : ‘데이터과학’, ‘확률’ 와 같은 단어가 쓰임.
문서
- doc0은 축구를 주제로 쓰여진 글인듯 하다.
- doc2은 데이터과학을 주제로 쓰여진 글인듯 하다.
- doc1는 축구와 데이터과학이 혼합된 주제인듯 하다.
-
원하는 것1: 문서별로 토픽이 얼마나 들어있는지 알고싶다.
- 즉
를 입력으로 넣으면 아래와 같은 가 나오면 좋겠음
= {
θ 'doc1':[1,1],
'doc2':[1,2],
'doc3':[2,2]
} θ
{'doc1': [1, 1], 'doc2': [1, 2], 'doc3': [2, 2]}
-
원하는것1에 대한 아쉬움
- 그런데 생각해보니까 “손흥민”이라는 단어는 완전 축구단어
- “골”이라는 단어는 가끔 데이터과학과 섞일 수 있는 단어
- “손흥민”이라는 단어는 축구토픽에서 나올 확률이 90퍼 이상, “골”은 축구토픽에서 나올 확률이 80퍼정도일수도 있잖음?
-
원하는 것2: 특정한 하나의
-
어려운점: 현재
가능한 해결책: 아이디어 단계
-
이론적인 근거는 아직 설명하기 어렵지만 되게 그럴듯한 해결책이 있습니다.
-
문제의 단순화:
- 결국 길이가 6인 랜덤벡터
를 뽑는 일이다.
단계1: 아무값이나 넣어서 를 초기화한다.
-
= {
θ 'doc1':[2,1],
'doc2':[1,2],
'doc3':[2,1]
}
이라고 생각하자.
-
임의의 초기값이 셋팅된 상황은 아래와 같다.
단계2: 을 순서대로 샘플링
-
예비개념: MCMC에서 베타분포를 뽑았던 예제로 돌아가보자
- 임의의 초기값
생성 - 새로운 값으로
를 고려 (추천받을 수도 있고 그냥 고려할수도 있음) 가 그럴듯한지, 가 그럴듯한지 판단하고 의 값은 어떠한확률로 중에서 선택
-
전략: 그동안 pmf 혹은 pdf의 정보가 필요했던 것은 “그럴듯한 정도” 를 판단할 기준을 얻기 위해서였다. 그런데 만약, “그럴듯한 정도”를 판단하는 기준을 pmf, pdf 로 정하지 않는다면? pmf 혹은 pdf 가 필요하지 않다.
stage0: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
-
- 토픽1의 타당성: (
doc1
에 토픽1이 포함된 비율) (토픽1에서손흥민
이라는 단어가 포함된 비율) = 1 0 - 토픽2의 타당성: (
doc1
에 토픽2가 포함된 비율) (토픽2에서손흥민
이라는 단어가 포함된 비율) = 0 0
둘 다
이라서 비긴거야?? 그런데 그래도 토픽1가 그나마 타당한거아냐?
-
수정된 타당성
- 토픽1의 타당성: (
doc1
에 토픽1이 포함된 비율) (토픽1에서손흥민
이라는 단어가 포함된 비율) = 1 0.001 - 토픽2의 타당성: (
doc1
에 토픽2가 포함된 비율) (토픽2에서손흥민
이라는 단어가 포함된 비율) = 0.001 0.001
의 생각: 나는 토픽1인듯해
-
업데이트
'doc1'][0] θ[
2
'doc1'][0] = 1 θ[
stage1: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
- 파란색/볼드: 과거 / 업데이트O
-
수정된 타당성
- 토픽1의 타당성: (
doc1
에 토픽1이 포함된 비율) (토픽1에서골
이라는 단어가 포함된 비율) = 1 1/3 - 토픽2의 타당성: (
doc1
에 토픽2가 포함된 비율) (토픽2에서골
이라는 단어가 포함된 비율) = 0.001 0.001
의 생각: 나는 토픽1인듯해
-
업데이트: 안함.. 난 토픽1이 맞는것 같음
stage2: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
- 파란색/볼드: 과거 / 업데이트O
- 파란색/볼드X: 과거 / 업데이트X
-
수정된 타당성
- 토픽1의 타당성: (
doc2
에 토픽1이 포함된 비율) (토픽1에서골
이라는 단어가 포함된 비율) = 0.001 1/3 - 토픽2의 타당성: (
doc2
에 토픽2가 포함된 비율) (토픽2에서골
이라는 단어가 포함된 비율) = 1 0.001
의 생각: 나는 토픽2인듯함 (그런데 아닐 수도 있음)
-
업데이트
'doc2'][0] θ[
1
'doc2'][0] = 2 θ[
stage3: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
- 파란색/볼드: 과거 / 업데이트O
- 파란색/볼드X: 과거 / 업데이트X
-
수정된 타당성
- 토픽1의 타당성: (
doc2
에 토픽1이 포함된 비율) (토픽1에서확률
이라는 단어가 포함된 비율) = 0.001 0.001 - 토픽2의 타당성: (
doc2
에 토픽2가 포함된 비율) (토픽2에서확률
이라는 단어가 포함된 비율) = 1 1/2
의 생각: 나는 토픽2인듯함
-
업데이트: 안함. 난 토픽2가 확실한듯
stage4: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
- 파란색/볼드: 과거 / 업데이트O
- 파란색/볼드X: 과거 / 업데이트X
-
수정된 타당성
- 토픽1의 타당성: (
doc3
에 토픽1이 포함된 비율) (토픽1에서확률
이라는 단어가 포함된 비율) = 1 0.001 - 토픽2의 타당성: (
doc3
에 토픽2가 포함된 비율) (토픽2에서확률
이라는 단어가 포함된 비율) = 0.001 1/2
의 생각: 나는 토픽1인듯함 (그런데 아닐수도 있음)
-
업데이트: 안함. 난 토픽1인것 같긴한데, 확실하지 않아서 그냥 토픽2에 머무르겠음.
stage5: 을 sampling
-
현재상태
- 빨간색/볼드: 지금 focus하는 것
- 파란색/볼드: 과거 / 업데이트O
- 파란색/볼드X: 과거 / 업데이트X
-
수정된 타당성
- 토픽1의 타당성: (
doc3
에 토픽1이 포함된 비율) (토픽1에서데이터과학
이라는 단어가 포함된 비율) = 0.001 0.001 - 토픽2의 타당성: (
doc3
에 토픽2가 포함된 비율) (토픽2에서데이터과학
이라는 단어가 포함된 비율) = 1 0.001
의 생각: 나는 토픽1인듯함 (그런데 아닐수도 있음)
-
업데이트: 난 토픽2가 확실한듯
'doc3'][1] θ[
1
'doc3'][1] = 2 θ[
단계3: 에 대하여 단계2를 반복
θ
{'doc1': [1, 1], 'doc2': [2, 2], 'doc3': [2, 2]}
-
초기상태와 지금을 비교하면 아래와 같다.
-
- 문서눈치: 내가 토픽k 라면, 내가 속한 문서에는 토픽k로 분류된 단어가 많을거야.
- 토픽눈치: 내가 토픽k 라면, 토픽k에는 나랑 같은 단어가 많을거야.
구현
구현에 필요한 예비학습
enumerate
for i in 'abc':
print(i)
a
b
c
for i in enumerate('abc'):
print(i)
(0, 'a')
(1, 'b')
(2, 'c')
for i,s in enumerate('abc'):
print(i,s)
0 a
1 b
2 c
for i,s in enumerate('abc'):
print(s*(i+1))
a
bb
ccc
np.random.choice
10,100,1000],size=50) np.random.choice([
array([1000, 1000, 10, 100, 100, 1000, 100, 100, 10, 1000, 10,
1000, 100, 10, 1000, 100, 10, 100, 100, 1000, 1000, 10,
1000, 1000, 10, 1000, 1000, 100, 1000, 1000, 1000, 1000, 1000,
100, 10, 1000, 10, 1000, 10, 10, 1000, 100, 10, 1000,
100, 100, 1000, 10, 100, 100])
10,100,1000],size=50,p=[0.8,0.1,0.1]) np.random.choice([
array([ 10, 10, 10, 10, 10, 10, 10, 10, 100, 10, 1000,
10, 10, 100, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 1000, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10])
딕셔너리의 해체
-
아래와 같은 딕셔너리를 고려하자.
= {'doc1':['손흥민','골'],
D 'doc2':['골','확률'],
'doc3':['확률','데이터과학']}
= {'doc1':[2,1],
θ 'doc2':[1,2],
'doc3':[2,1]}
-
이러한 딕셔너리에를 해체하고 싶다면?
for doc in D for wrd in D[doc]] [wrd
['손흥민', '골', '골', '확률', '확률', '데이터과학']
for doc in θ for tpc in θ[doc]] [tpc
[2, 1, 1, 2, 2, 1]
리스트의 count 메소드
= list('asdfsdasdfasdfasdfasdfas')
lst 'a') lst.count(
6
for doc in D for wrd in D[doc]] [wrd
['손흥민', '골', '골', '확률', '확률', '데이터과학']
for doc in D for wrd in D[doc]].count('골') [wrd
2
조건부 컴프리헨션
= [-1,0,1,2]
lst for l in lst if l<=0] [l
[-1, 0]
딕셔너리의 원소삭제
= {'doc1':['손흥민']*5, 'doc2':['골']*5}
dct dct
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민', '손흥민'],
'doc2': ['골', '골', '골', '골', '골']}
del dct['doc1'][0]
dct
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민'], 'doc2': ['골', '골', '골', '골', '골']}
깊은복사
-
특정원소가 삭제된 dct와 삭제되지 않은 dct를 동시에 가지고 있으려면?
= {'doc1':['손흥민']*5, 'doc2':['골']*5}
dct = dct dct2
del dct['doc1'][0]
dct
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민'], 'doc2': ['골', '골', '골', '골', '골']}
# 잉 왜 같이 삭제되는거야? dct2
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민'], 'doc2': ['골', '골', '골', '골', '골']}
-
해결책
import copy
= {'doc1':['손흥민']*5, 'doc2':['골']*5}
dct = copy.deepcopy(dct) dct2
del dct['doc1'][0]
dct
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민'], 'doc2': ['골', '골', '골', '골', '골']}
# 이제야 제대로 돌아가네 dct2
{'doc1': ['손흥민', '손흥민', '손흥민', '손흥민', '손흥민'],
'doc2': ['골', '골', '골', '골', '골']}
연습문제
아래와 같은 자료가 있다고 하자.
= {'doc1':['손흥민','골'],
D 'doc2':['골','확률'],
'doc3':['확률','데이터과학']}
= {'doc1':[2,1],
θ 'doc2':[1,2],
'doc3':[2,1]}
(1)
len(set([wrd for doc in D for wrd in D[doc]]))
4
(2)
문서2에 토픽1은 몇개나 있는가?
'doc2'] θ[
[1, 2]
'doc2'].count(1) θ[
1
(3)
토픽1에 들어있는 단어들의 목록을 구하라.
= [wrd for doc in D for wrd in D[doc]]
wrdlst wrdlst
['손흥민', '골', '골', '확률', '확률', '데이터과학']
= [tpc for doc in θ for tpc in θ[doc]]
tpclst tpclst
[2, 1, 1, 2, 2, 1]
for i,wrd in enumerate(wrdlst) if tpclst[i]==1 ] [wrd
['골', '골', '데이터과학']
(4)
토픽1에서 ’골’이라는 단어는 몇번 등장하는가?
for i,wrd in enumerate(wrdlst) if tpclst[i]==1 ].count('골') [wrd
2
데이터: 와 의 설정
= {'doc1': ['심판', '헤딩', '선수', '골', '리그', '골', '선수', '공격', '헤딩', '슈팅', '공', '패스', '공격수', '페널티킥', '공'], 'doc2': ['수비', '골', '챔피언스리그', '헤딩', '경기장', '골키퍼', '챔피언스리그', '헤딩', '경기장', '수비수', '수비수', '패스', '드리블', '선수', '월드컵'], 'doc3': ['헤딩', '리그', '드리블', '골키퍼', '공격수', '공격수', '월드컵', '선수', '공', '헤딩', '중앙미드필더', '공격', '선수', '수비수', '드리블'], 'doc4': ['클럽', '선수', '챔피언스리그', '슈팅', '리그', '수비', '리그', '중앙미드필더', '공격', '공', '중앙미드필더', '골', '패스', '중앙미드필더', '클럽'], 'doc5': ['선수', '경기장', '수비', '골키퍼', '월드컵', '리그', '드리블', '공격수', '슈팅', '선수', '선수', '월드컵', '드리블', '월드컵', '골키퍼'], 'doc6': ['수비수', '심판', '공', '공격', '표준편차', '표본', '상관관계', '모집단', '딥러닝', '클러스터링', '인공지능', '챔피언스리그', '공', '심판', '챔피언스리그'], 'doc7': ['페널티킥', '중앙미드필더', '챔피언스리그', '선수', '표본', '평균', '분류', '로지스틱 회귀', '머신러닝', '클러스터링', '평균', '수비수', '중앙미드필더', '페널티킥', '심판'], 'doc8': ['공격', '경기장', '패스', '수비수', '신뢰구간', '데이터과학', '확률', '통계', '분류', '인공지능', '머신러닝', '수비수', '수비수', '페널티킥', '수비수'], 'doc9': ['페널티킥', '패스', '골키퍼', '공', '신뢰구간', '딥러닝', '평균', '인공지능', '딥러닝', '분산', '딥러닝', '월드컵', '월드컵', '슈팅', '골키퍼'], 'doc10': ['리그', '슈팅', '드리블', '선수', '평균', '데이터분석', '데이터과학', '신뢰구간', '평균', '분류', '딥러닝', '심판', '슈팅', '패스', '선수'], 'doc11': ['평균', '데이터분석', '클러스터링', '데이터과학', '신경망', '데이터분석', '상관관계', '인공지능', '상관관계', '확률', '회귀분석', '로지스틱 회귀', '평균', '표준편차', '딥러닝'], 'doc12': ['신뢰구간', '딥러닝', '확률', '평균', '데이터분석', '상관관계', '회귀분석', '통계', '신경망', '상관관계', '회귀분석', '확률', '로지스틱 회귀', '상관관계', '데이터과학'], 'doc13': ['확률', '로지스틱 회귀', '통계', '딥러닝', '모집단', '머신러닝', '인공지능', '표준편차', '상관관계', '확률', '확률', '클러스터링', '신경망', '분류', '데이터분석'], 'doc14': ['데이터분석', '데이터과학', '분류', '통계적 가설검정', '머신러닝', '로지스틱 회귀', '회귀분석', '분류', '표본', '모집단', '통계적 가설검정', '상관관계', '표본', '클러스터링', '표본'], 'doc15': ['딥러닝', '인공지능', '표본', '표준편차', '신경망', '분류', '모집단', '데이터분석', '통계', '통계적 가설검정', '통계적 가설검정', '머신러닝', '머신러닝', '상관관계', '딥러닝']}
D pd.DataFrame(D)
doc1 | doc2 | doc3 | doc4 | doc5 | doc6 | doc7 | doc8 | doc9 | doc10 | doc11 | doc12 | doc13 | doc14 | doc15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 심판 | 수비 | 헤딩 | 클럽 | 선수 | 수비수 | 페널티킥 | 공격 | 페널티킥 | 리그 | 평균 | 신뢰구간 | 확률 | 데이터분석 | 딥러닝 |
1 | 헤딩 | 골 | 리그 | 선수 | 경기장 | 심판 | 중앙미드필더 | 경기장 | 패스 | 슈팅 | 데이터분석 | 딥러닝 | 로지스틱 회귀 | 데이터과학 | 인공지능 |
2 | 선수 | 챔피언스리그 | 드리블 | 챔피언스리그 | 수비 | 공 | 챔피언스리그 | 패스 | 골키퍼 | 드리블 | 클러스터링 | 확률 | 통계 | 분류 | 표본 |
3 | 골 | 헤딩 | 골키퍼 | 슈팅 | 골키퍼 | 공격 | 선수 | 수비수 | 공 | 선수 | 데이터과학 | 평균 | 딥러닝 | 통계적 가설검정 | 표준편차 |
4 | 리그 | 경기장 | 공격수 | 리그 | 월드컵 | 표준편차 | 표본 | 신뢰구간 | 신뢰구간 | 평균 | 신경망 | 데이터분석 | 모집단 | 머신러닝 | 신경망 |
5 | 골 | 골키퍼 | 공격수 | 수비 | 리그 | 표본 | 평균 | 데이터과학 | 딥러닝 | 데이터분석 | 데이터분석 | 상관관계 | 머신러닝 | 로지스틱 회귀 | 분류 |
6 | 선수 | 챔피언스리그 | 월드컵 | 리그 | 드리블 | 상관관계 | 분류 | 확률 | 평균 | 데이터과학 | 상관관계 | 회귀분석 | 인공지능 | 회귀분석 | 모집단 |
7 | 공격 | 헤딩 | 선수 | 중앙미드필더 | 공격수 | 모집단 | 로지스틱 회귀 | 통계 | 인공지능 | 신뢰구간 | 인공지능 | 통계 | 표준편차 | 분류 | 데이터분석 |
8 | 헤딩 | 경기장 | 공 | 공격 | 슈팅 | 딥러닝 | 머신러닝 | 분류 | 딥러닝 | 평균 | 상관관계 | 신경망 | 상관관계 | 표본 | 통계 |
9 | 슈팅 | 수비수 | 헤딩 | 공 | 선수 | 클러스터링 | 클러스터링 | 인공지능 | 분산 | 분류 | 확률 | 상관관계 | 확률 | 모집단 | 통계적 가설검정 |
10 | 공 | 수비수 | 중앙미드필더 | 중앙미드필더 | 선수 | 인공지능 | 평균 | 머신러닝 | 딥러닝 | 딥러닝 | 회귀분석 | 회귀분석 | 확률 | 통계적 가설검정 | 통계적 가설검정 |
11 | 패스 | 패스 | 공격 | 골 | 월드컵 | 챔피언스리그 | 수비수 | 수비수 | 월드컵 | 심판 | 로지스틱 회귀 | 확률 | 클러스터링 | 상관관계 | 머신러닝 |
12 | 공격수 | 드리블 | 선수 | 패스 | 드리블 | 공 | 중앙미드필더 | 수비수 | 월드컵 | 슈팅 | 평균 | 로지스틱 회귀 | 신경망 | 표본 | 머신러닝 |
13 | 페널티킥 | 선수 | 수비수 | 중앙미드필더 | 월드컵 | 심판 | 페널티킥 | 페널티킥 | 슈팅 | 패스 | 표준편차 | 상관관계 | 분류 | 클러스터링 | 상관관계 |
14 | 공 | 월드컵 | 드리블 | 클럽 | 골키퍼 | 챔피언스리그 | 심판 | 수비수 | 골키퍼 | 선수 | 딥러닝 | 데이터과학 | 데이터분석 | 표본 | 딥러닝 |
-
간단한 데이터 조사
- 데이터는 총 15개의 문서로 이루어져 있으며 처음5개의 문서는 축구관련, 이후 5개는 축구와 통계 관련, 이후 5개는 통계관련이다.
- 축구와 통계가 섞인
doc6~doc11
은 축구관련4단어, 통계관련7단어, 축구관련4단어의 조합으로 이루어져 있다.
-
초기값
= {doc:np.random.choice([0,1],size=15).tolist() for doc in D}
θ θ
{'doc1': [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
'doc2': [1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0],
'doc3': [0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0],
'doc4': [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1],
'doc5': [1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0],
'doc6': [1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1],
'doc7': [0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0],
'doc8': [0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1],
'doc9': [1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1],
'doc10': [1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0],
'doc11': [1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0],
'doc12': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1],
'doc13': [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
'doc14': [1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1],
'doc15': [1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1]}
-
D와
= {'D':D, 'θ':θ} data
하이퍼파라메터
= 2 # 토픽의수 <-- 유저가 설정함 K
필요한 함수
-
여기에서
def p1(topic,doc,data):
= data['θ']
θ = θ[doc].count(topic) +0.1
a = len(θ[doc]) + 0.1 *K
b return a/b
-
여기에서
def p2(word,topic,data):
=data['D']
D=data['θ']
θ= [tpc for doc in θ for tpc in θ[doc]]
tpclst = [wrd for doc in D for wrd in D[doc]]
wrdlst = [wrd for i,wrd in enumerate(wrdlst) if tpclst[i]==topic].count(word) + 0.1
a = tpclst.count(topic) + 0.1 * len(set(wrdlst))
b return a/b
알고리즘
1. 초기값:
= {doc:np.random.choice([0,1],size=15).tolist() for doc in D}
θ list(θ.values())) plt.matshow(
2. 반복:
for t in range(5):
for doc in D:
for i, wrd in enumerate(D[doc]):
# 임시의 data를 만들고 현재 포커싱되어있는 자료를 삭제함
= {'D':copy.deepcopy(D), 'θ': copy.deepcopy(θ)}
data del data['D'][doc][i]
del data['θ'][doc][i]
# 토픽의 타당성조사, msr는 타당성을 나타내는 측도, prob는 msr의 총합을 1로 맞춤
= p1(topic=0, doc=doc, data=data) * p2(word=wrd, topic=0, data=data) # 토픽0의 타당성
msr0 = p1(topic=1, doc=doc, data=data) * p2(word=wrd, topic=1, data=data) # 토픽1의 타당성
msr1 = [msr0/(msr0 + msr1), msr1/(msr0 + msr1)]
prob
# update θ|
= np.random.choice([0,1], p=prob) θ[doc][i]
시각화
list(θ.values())) plt.matshow(
Footnotes
원래 2였는데 업데이트되었음↩︎
원래 2에 있었은데 1로 옮겼음↩︎
원래 2였는데 업데이트되었음↩︎
원래 2에 있었은데 1로 옮겼음↩︎
원래 2였는데 업데이트되었음↩︎
원래 1이었는데 업데이트되었음, 업데이트 안될수도 있었음.↩︎
원래 2에 있었은데 1로 옮겼음↩︎
원래 1에 있었은데 2로 옮겼음, 안바뀔수도 있었음.↩︎
원래 2였는데 업데이트되었음↩︎
원래 1이었는데 업데이트되었음, 업데이트 안될수도 있었음.↩︎
원래 2에 있었은데 1로 옮겼음↩︎
원래 1에 있었은데 2로 옮겼음, 안바뀔수도 있었음.↩︎
원래 2였는데 업데이트되었음↩︎
원래 1이었는데 업데이트되었음, 업데이트 안될수도 있었음.↩︎
업데이트 할수도 있었는데 안했음↩︎
원래 2에 있었은데 1로 옮겼음↩︎
1로 바뀔수도 있었는데 안바꾸었음↩︎
원래 1에 있었은데 2로 옮겼음, 안바뀔수도 있었음.↩︎
1일수도 있었음↩︎
1일 수도 있었음↩︎