{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 15wk-1: MCMC (3)\n", "\n", "최규빈 \n", "2023-06-01" ], "id": "ae5bb001-605b-47e3-8848-c4033c28c020" }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pylab as plt\n", "import copy" ], "id": "b591b151-322d-4bef-8c59-b70c311720c2" }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 강의영상\n", "\n", "> youtube:\n", "> \n", "\n", "# imports\n", "\n", "# 모티브\n", "\n", "`-` 축구기사\n", "\n", "- 손흥민: \n", "\n", "`-` 16강진출 경우의 수\n", "\n", "- 16강 가능할까? :\n", " \n", "\n", "`-` 통계, 데이터과학\n", "\n", "- 생략\n", "\n", "# 문제소개\n", "\n", "`-` 3개의 문서가 있으며 각 문서에는 아래와 같이 2개의 단어가 있는\n", "데이터를 고려하자." ], "id": "27a197c1-d2bc-4b41-9ae9-e63e4fa76062" }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "D = {\n", " 'doc1':['손흥민','골'],\n", " 'doc2':['골','확률'],\n", " 'doc3':['확률','데이터과학']\n", "}\n", "D" ], "id": "f3ff1e89-fad5-4424-8378-93cca3109512" }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 여기에서 $D$는 문서들의 집합, 즉 코퍼스를 의미한다.\n", "\n", "`-` 데이터설명\n", "\n", "***토픽***\n", "\n", "- 토픽0 = 축구 : ‘골’, ‘손흥민’ 와 같은 단어가 쓰임.\n", "- 토픽1 = 통계 : ‘데이터과학’, ‘확률’ 와 같은 단어가 쓰임.\n", "\n", "***문서***\n", "\n", "- doc0은 축구를 주제로 쓰여진 글인듯 하다.\n", "- doc2은 데이터과학을 주제로 쓰여진 글인듯 하다.\n", "- doc1는 축구와 데이터과학이 혼합된 주제인듯 하다.\n", "\n", "`-` 원하는 것1: 문서별로 토픽이 얼마나 들어있는지 알고싶다.\n", "\n", "- 즉 $D$를 입력으로 넣으면 아래와 같은 $\\theta$ 가 나오면 좋겠음" ], "id": "8c3ecfb9-fb91-4b9e-a14b-036390c9b4dd" }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "θ = {\n", " 'doc1':[1,1],\n", " 'doc2':[1,2],\n", " 'doc3':[2,2]\n", "}\n", "θ" ], "id": "aff70504-a752-4713-9963-21512348b873" }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θ: 추정된\n", "토픽
doc1doc2doc3
112
122
\n", "
\n", "\n", "Table 1: 우리가 원하는것 (1)\n", "\n", "`-` 원하는것1에 대한 아쉬움\n", "\n", "- 그런데 생각해보니까 “손흥민”이라는 단어는 완전 축구단어\n", "- “골”이라는 단어는 가끔 데이터과학과 섞일 수 있는 단어\n", "- “손흥민”이라는 단어는 축구토픽에서 나올 확률이 90퍼 이상, “골”은\n", " 축구토픽에서 나올 확률이 80퍼정도일수도 있잖음?\n", "\n", "`-` 원하는 것2: 특정한 하나의 ${\\boldsymbol \\theta}$ 값이 아니라 아래와\n", "같이\n", "\n", "$${\\boldsymbol \\theta} \\sim {\\boldsymbol \\pi}$$\n", "\n", "${\\boldsymbol \\theta}$를 뽑아낼 수 있는 분포 ${\\boldsymbol \\pi}$를\n", "알아내는게 더 좋지 않을까?\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θ:\n", "토픽
doc1doc2doc3
112
122
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) π:\n", "정상분포
doc1doc2doc3
$\\begin{bmatrix}0.9\\\\0.1\\end{bmatrix}$$\\begin{bmatrix}0.8\\\\0.2\\end{bmatrix}$$\\begin{bmatrix}0.3\\\\0.7\\end{bmatrix}$
$\\begin{bmatrix}0.8\\\\0.2\\end{bmatrix}$$\\begin{bmatrix}0.3\\\\0.7\\end{bmatrix}$$\\begin{bmatrix}0.05\\\\0.95\\end{bmatrix}$
\n", "
\n", "\n", "Table 2: 우리가 원하는것 (2)\n", "\n", "`-` 어려운점: 현재 ${\\boldsymbol \\pi}$ (=${\\boldsymbol \\theta}$의 pmf)\n", "의 수식을 알 수 없어서 직접 뽑기 어렵다.\n", "\n", "# 가능한 해결책: 아이디어 단계\n", "\n", "`-` 이론적인 근거는 아직 설명하기 어렵지만 되게 그럴듯한 해결책이\n", "있습니다.\n", "\n", "`-` 문제의 단순화:\n", "\n", "- 결국 길이가 6인 랜덤벡터\n", " ${\\boldsymbol \\theta}=(\\theta[0],\\dots,\\theta[5])$ 를 뽑는 일이다.\n", "\n", "## ***단계1: 아무값이나 넣어서 ${\\boldsymbol \\theta}_0$를 초기화한다.***\n", "\n", "`-` ${\\boldsymbol \\theta}_0=(\\theta_0[0],\\dots,\\theta_0[5])$를\n", "아무값이나 셋팅" ], "id": "c020a47d-8a1f-4665-b585-d661c31aa530" }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "θ = {\n", " 'doc1':[2,1],\n", " 'doc2':[1,2],\n", " 'doc3':[2,1]\n", "}" ], "id": "f054c929-780a-4161-9d4b-6fa347ae6fef" }, { "cell_type": "markdown", "metadata": {}, "source": [ "- ${\\boldsymbol \\theta}_0 = [2,1,1,2,2,1]$ 이라고 생각하자.\n", "\n", "`-` 임의의 초기값이 셋팅된 상황은 아래와 같다.\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "임의의 초기값으로 설정된 토픽
doc1doc2doc3
2 (=θ0[0])1 (=θ0[2])2 (=θ0[4])
1 (=θ0[1])2 (=θ0[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1골, 골, 데이터과학
2손흥민, 확률, 확률
\n", "
\n", "\n", "Table 3: 초기상태요약\n", "\n", "## ***단계2: ${\\boldsymbol \\theta}_0[0], {\\boldsymbol \\theta}_0[1] \\cdots, {\\boldsymbol \\theta}_0[5]$ 을 순서대로 샘플링***\n", "\n", "***`-` 예비개념: MCMC에서 베타분포를 뽑았던 예제로 돌아가보자***\n", "\n", "1. 임의의 초기값 $x$ 생성\n", "2. 새로운 값으로 $y$를 고려 (추천받을 수도 있고 그냥 고려할수도 있음)\n", "3. $x$가 그럴듯한지, $y$가 그럴듯한지 판단하고 $x'$의 값은 어떠한확률로\n", " $x,y$ 중에서 선택\n", "\n", "`-` 전략: 그동안 pmf 혹은 pdf의 정보가 필요했던 것은 “그럴듯한 정도” 를\n", "판단할 기준을 얻기 위해서였다. 그런데 만약, “그럴듯한 정도”를 판단하는\n", "기준을 pmf, pdf 로 정하지 않는다면? pmf 혹은 pdf 가 필요하지 않다.\n", "\n", "### stage0: ***${\\boldsymbol \\theta}_0[0]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
2 (=θ0[0])1 (=θ0[2])2 (=θ0[4])
1 (=θ0[1])2 (=θ0[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1골, 골, 데이터과학
2손흥민, 확률,\n", "확률
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[0]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽1으로 분류되어있음나도 토픽1인듯
토픽눈치토픽1에도, 토픽2에도 나랑 같은 단어는 없음난 토픽1도 2도 아닌듯
\n", "
\n", "\n", "Table 4: $t=0$, $d={\\tt doc1}$, $w={\\tt 손흥민}$\n", "\n", "`-` $\\theta_0[0]$이 토픽1에서 뽑혓다고 보는게 타당한지 토픽1에서\n", "뽑혔다고 보는게 타당하지 아래와 같이 따져보자.\n", "\n", "- 토픽1의 타당성: (`doc1`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `손흥민`이라는 단어가 포함된 비율) = 1 $\\times$ 0\n", "- 토픽2의 타당성: (`doc1`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `손흥민`이라는 단어가 포함된 비율) = 0 $\\times$ 0\n", "\n", "> 둘 다 $0$ 이라서 비긴거야?? 그런데 그래도 토픽1가 그나마 타당한거아냐?\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc1`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `손흥민`이라는 단어가 포함된 비율) = 1 $\\times$ 0.001\n", "- 토픽2의 타당성: (`doc1`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `손흥민`이라는 단어가 포함된 비율) = 0.001 $\\times$ 0.001\n", "\n", "> $\\theta_0[0]$의 생각: 나는 토픽1인듯해\n", "\n", "`-` 업데이트" ], "id": "f020fdac-fb1a-4cb3-8b6d-02cffd812318" }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "θ['doc1'][0]" ], "id": "0e8a1d00-0d0e-4df9-ab02-63667ff5905b" }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "θ['doc1'][0] = 1" ], "id": "44abb322-a98c-4cc0-b073-1151fe719c8d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### stage1: ***${\\boldsymbol \\theta}_0[1]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "- 파란색/볼드: 과거 / 업데이트O\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
1 (=θ1[0])11 (=θ0[2])2 (=θ0[4])
1 (=θ0[1])2 (=θ0[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1, 골,\n", "데이터과학, 손흥민1
2확률, 확률
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[1]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽1으로 분류되어있음나도 토픽1인듯
토픽눈치토픽1에는 나랑 같은 단어가 있는데 토픽2에는 없음나도 토픽1인듯
\n", "
\n", "\n", "\n", "Table 5: $t=0$, $d={\\tt doc1}$, $w={\\tt 골}$\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc1`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `골`이라는 단어가 포함된 비율) = 1 $\\times$ 1/3\n", "- 토픽2의 타당성: (`doc1`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `골`이라는 단어가 포함된 비율) = 0.001 $\\times$ 0.001\n", "\n", "> $\\theta_0[1]$의 생각: 나는 토픽1인듯해\n", "\n", "`-` 업데이트: 안함.. 난 토픽1이 맞는것 같음\n", "\n", "### stage2: ***${\\boldsymbol \\theta}_0[2]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "- 파란색/볼드: 과거 / 업데이트O\n", "- 파란색/볼드X: 과거 / 업데이트X\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
1 (=θ1[0])1 1 (=θ0[2]) 2 (=θ0[4])
1 (=θ1[1])2 (=θ0[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1, 골, 데이터과학, 손흥민1
2확률, 확률
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[2]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽2로 분류되어있음나도 토픽2인듯
토픽눈치토픽1에는 나랑 같은 단어가 있는데 토픽2에는 없음나도 토픽1인듯
\n", "
\n", "\n", "\n", "Table 6: $t=0$, $d={\\tt doc2}$, $w={\\tt 골}$\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc2`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `골`이라는 단어가 포함된 비율) = 0.001 $\\times$ 1/3\n", "- 토픽2의 타당성: (`doc2`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `골`이라는 단어가 포함된 비율) = 1 $\\times$ 0.001\n", "\n", "> $\\theta_0[2]$의 생각: 나는 토픽2인듯함 (그런데 아닐 수도 있음)\n", "\n", "`-` 업데이트" ], "id": "2a741be1-db82-4139-9ab0-82880447468e" }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "θ['doc2'][0]" ], "id": "54dbf90d-cd38-43de-af50-8438aec80cfb" }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "θ['doc2'][0] = 2" ], "id": "eb2bd827-9c23-4a1d-aea4-800cbde02b76" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### stage3: ***${\\boldsymbol \\theta}_0[3]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "- 파란색/볼드: 과거 / 업데이트O\n", "- 파란색/볼드X: 과거 / 업데이트X\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
1 (=θ1[0])1 2 (=θ1[2]) 22 (=θ0[4])
1 (=θ1[1]) 2 (=θ0[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1, 데이터과학, 손흥민1
2확률, 확률,\n", "2
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[3]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽2로 분류되어있음나도 토픽2인듯
토픽눈치토픽1에는 나랑 같은 단어가 없는데 토픽2에는 있음나도 토픽2인듯
\n", "
\n", "\n", "\n", "Table 7: $t=0$, $d={\\tt doc2}$, $w={\\tt 확률}$\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc2`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `확률`이라는 단어가 포함된 비율) = 0.001 $\\times$ 0.001\n", "- 토픽2의 타당성: (`doc2`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `확률`이라는 단어가 포함된 비율) = 1 $\\times$ 1/2\n", "\n", "> $\\theta_0[3]$의 생각: 나는 토픽2인듯함\n", "\n", "`-` 업데이트: 안함. 난 토픽2가 확실한듯\n", "\n", "### stage4: ***${\\boldsymbol \\theta}_0[4]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "- 파란색/볼드: 과거 / 업데이트O\n", "- 파란색/볼드X: 과거 / 업데이트X\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
1 (=θ1[0])1 2 (=θ1[2]) 22 (=θ0[4])
1 (=θ1[1]) 2 (=θ1[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1, 데이터과학, 손흥민1
2확률, 확률, 2
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[4]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽1로 분류되어있음나도 토픽1인듯
토픽눈치토픽1에는 나랑 같은 단어가 없는데 토픽2에는 있음나도 토픽2인듯
\n", "
\n", "\n", "\n", "Table 8: $t=0$, $d={\\tt doc3}$, $w={\\tt 확률}$\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc3`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `확률`이라는 단어가 포함된 비율) = 1 $\\times$ 0.001\n", "- 토픽2의 타당성: (`doc3`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `확률`이라는 단어가 포함된 비율) = 0.001 $\\times$ 1/2\n", "\n", "> $\\theta_0[4]$의 생각: 나는 토픽1인듯함 (그런데 아닐수도 있음)\n", "\n", "`-` 업데이트: 안함. 난 토픽1인것 같긴한데, 확실하지 않아서 그냥 토픽2에\n", "머무르겠음.\n", "\n", "### stage5: ***${\\boldsymbol \\theta}_0[5]$을 sampling***\n", "\n", "`-` 현재상태\n", "\n", "- 빨간색/볼드: 지금 focus하는 것\n", "- 파란색/볼드: 과거 / 업데이트O\n", "- 파란색/볼드X: 과거 / 업데이트X\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) D:\n", "코퍼스(=관찰한자료)
doc1doc2doc3
손흥민확률
확률데이터과학
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θt:\n", "추정된 토픽
doc1doc2doc3
1 (=θ1[0])1 2 (=θ1[2]) 22 (=θ1[4])3
1 (=θ1[1]) 2 (=θ1[3])1 (=θ0[5])
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) 토픽별로 등장하는 단어
topicwords
1,\n", "데이터과학, 손흥민1
2확률, 확률2, 3
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(d) θ0[5]의 고민 = 나는\n", "토픽1인가 토픽2인가?
관찰결론
문서눈치문서안에서 나말고 다른 단어는 토픽2로 분류되어있음나도 토픽2인듯
토픽눈치토픽1에도, 토픽2에도 나랑 같은 단어는 없음나는 토픽1도 토픽2도 아닌듯
\n", "
\n", "\n", "\n", "Table 9: $t=0$, $d={\\tt doc3}$, $w={\\tt 데이터과학}$\n", "\n", "`-` 수정된 타당성\n", "\n", "- 토픽1의 타당성: (`doc3`에 토픽1이 포함된 비율) $\\times$ (토픽1에서\n", " `데이터과학`이라는 단어가 포함된 비율) = 0.001 $\\times$ 0.001\n", "- 토픽2의 타당성: (`doc3`에 토픽2가 포함된 비율) $\\times$ (토픽2에서\n", " `데이터과학`이라는 단어가 포함된 비율) = 1 $\\times$ 0.001\n", "\n", "> $\\theta_0[5]$의 생각: 나는 토픽1인듯함 (그런데 아닐수도 있음)\n", "\n", "`-` 업데이트: 난 토픽2가 확실한듯" ], "id": "b0646103-eb97-4923-9820-bf649887211e" }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "θ['doc3'][1]" ], "id": "8c0f4251-c139-48a2-a59b-735f3a2067ff" }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "θ['doc3'][1] = 2" ], "id": "e96e52b8-82c5-4db4-b4b3-481525f0ebdd" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 단계3: $t=1,2,3,4,\\dots$ 에 대하여 단계2를 반복" ], "id": "c2d2f557-6899-450c-8054-34525cbbfca4" }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "θ" ], "id": "e29e4dfe-7a4b-473b-8711-cd148f6bdd26" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 초기상태와 지금을 비교하면 아래와 같다.\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(a) π
doc1doc2doc3
$\\begin{bmatrix}0.9\\\\0.1\\end{bmatrix}$$\\begin{bmatrix}0.8\\\\0.2\\end{bmatrix}$$\\begin{bmatrix}0.3\\\\0.7\\end{bmatrix}$
$\\begin{bmatrix}0.8\\\\0.2\\end{bmatrix}$$\\begin{bmatrix}0.3\\\\0.7\\end{bmatrix}$$\\begin{bmatrix}0.05\\\\0.95\\end{bmatrix}$
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(b) θ0
doc1doc2doc3
212
121
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
(c) θ1
doc1doc2doc3
12122
122
\n", "
\n", "\n", "\n", "Table 10: 수정된 상태\n", "\n", "`-` $t=1,2,3,4\\dots$로 진행하다보면 서로 눈치를 보면서 아래와 같은\n", "원리로 이동한다.\n", "\n", "1. 문서눈치: 내가 토픽k 라면, 내가 속한 문서에는 토픽k로 분류된 단어가\n", " 많을거야.\n", "2. 토픽눈치: 내가 토픽k 라면, 토픽k에는 나랑 같은 단어가 많을거야.\n", "\n", "# 구현\n", "\n", "## 구현에 필요한 예비학습\n", "\n", "### ***enumerate***" ], "id": "840f4be1-abd3-4b5c-b37b-ac873dfabdf1" }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "a\n", "b\n", "c" ] } ], "source": [ "for i in 'abc':\n", " print(i)" ], "id": "51712fc9-4813-491b-86b4-c5e9ba0e3ef1" }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(0, 'a')\n", "(1, 'b')\n", "(2, 'c')" ] } ], "source": [ "for i in enumerate('abc'):\n", " print(i)" ], "id": "4a219e7f-f8e8-48e5-8471-9ca991a515a5" }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0 a\n", "1 b\n", "2 c" ] } ], "source": [ "for i,s in enumerate('abc'):\n", " print(i,s)" ], "id": "f4bf42c0-23b5-4188-a1c1-1c1415dc2da7" }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "a\n", "bb\n", "ccc" ] } ], "source": [ "for i,s in enumerate('abc'):\n", " print(s*(i+1))" ], "id": "7ea6fb08-0a6b-4750-ae54-9b8e45a2999b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***np.random.choice***" ], "id": "504299c6-1e7e-451f-8683-b7134ed3b3e0" }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "np.random.choice([10,100,1000],size=50)" ], "id": "3e645138-5fcd-4e7d-b431-761e2210e472" }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "np.random.choice([10,100,1000],size=50,p=[0.8,0.1,0.1])" ], "id": "36ff8598-8d7f-41de-bd49-719f310ee1ee" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***딕셔너리의 해체***\n", "\n", "`-` 아래와 같은 딕셔너리를 고려하자." ], "id": "3625dda9-43f9-4e08-bdd6-8f52527e1f78" }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "D = {'doc1':['손흥민','골'],\n", " 'doc2':['골','확률'],\n", " 'doc3':['확률','데이터과학']}\n", "θ = {'doc1':[2,1],\n", " 'doc2':[1,2],\n", " 'doc3':[2,1]}" ], "id": "63f11cd0-b631-4436-8a70-b73a1879d2a2" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 이러한 딕셔너리에를 해체하고 싶다면?" ], "id": "446c60f8-7588-498a-8480-22a43b49e198" }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "[wrd for doc in D for wrd in D[doc]]" ], "id": "63a58133-ea79-4dbe-a7f2-584a380152af" }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "[tpc for doc in θ for tpc in θ[doc]]" ], "id": "762fbc20-05c8-498c-8e39-db1dae9667c0" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***리스트의 count 메소드***" ], "id": "6fdeb36b-5c55-4aa2-b65f-a3591037f8c4" }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "lst = list('asdfsdasdfasdfasdfasdfas')\n", "lst.count('a')" ], "id": "b94ec29a-bd8e-49ba-b4c8-60971f0d269d" }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "[wrd for doc in D for wrd in D[doc]]" ], "id": "03aad2ad-8589-4fbe-ba1d-c215ef6636e8" }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "[wrd for doc in D for wrd in D[doc]].count('골')" ], "id": "a5265ebe-5c72-4471-9727-271a619f4c0c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***조건부 컴프리헨션***" ], "id": "5b042d4d-9265-44ce-ad99-ae86c28f869e" }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "lst = [-1,0,1,2]\n", "[l for l in lst if l<=0]" ], "id": "47f77fac-7711-4f58-b09a-31a95073201a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***딕셔너리의 원소삭제***" ], "id": "7f2aa17f-a896-49c9-be65-5ce371902ab8" }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "dct = {'doc1':['손흥민']*5, 'doc2':['골']*5}\n", "dct" ], "id": "20e62652-15e7-4cf0-bf89-0c90d0c2ee90" }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "del dct['doc1'][0]" ], "id": "694ddcd1-10fd-4e50-9ba2-58b68fe8e9cf" }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "dct" ], "id": "c4806c25-1d22-4e36-b195-a27e5213ff5d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***깊은복사***\n", "\n", "`-` 특정원소가 삭제된 dct와 삭제되지 않은 dct를 동시에 가지고 있으려면?" ], "id": "659d27e5-41ae-499d-bedb-903e6dab3913" }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "dct = {'doc1':['손흥민']*5, 'doc2':['골']*5}\n", "dct2 = dct " ], "id": "68cc939a-06cc-4f5a-9fd0-50fa45bbb0f9" }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "del dct['doc1'][0]" ], "id": "fff75412-9e42-471f-8766-688a0e1e8ffe" }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "dct" ], "id": "3ba38e52-1698-47d8-bd05-986097323ab7" }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "dct2 # 잉 왜 같이 삭제되는거야?" ], "id": "35f272b3-da23-4ab3-b34d-f84d42fc10a8" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 해결책" ], "id": "19baf421-1921-4297-b2d7-1ac06a0e2f88" }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "import copy" ], "id": "5cc19fec-d663-4bc3-b5d5-7dddc8e35953" }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "dct = {'doc1':['손흥민']*5, 'doc2':['골']*5}\n", "dct2 = copy.deepcopy(dct)" ], "id": "589b67f9-82c3-4b7b-bc1d-c7ebe5c269b6" }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "del dct['doc1'][0]" ], "id": "78f47683-f32d-4ad2-aa6d-b83790c0a133" }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "dct" ], "id": "8e3aecd3-6626-4784-a881-71630388665e" }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "dct2 # 이제야 제대로 돌아가네" ], "id": "a3a231ed-3343-4ee0-9801-c651657a021a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***연습문제***\n", "\n", "아래와 같은 자료가 있다고 하자." ], "id": "481ee872-f56d-4a1e-9702-e23e1cbeec09" }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "D = {'doc1':['손흥민','골'],\n", " 'doc2':['골','확률'],\n", " 'doc3':['확률','데이터과학']}\n", "θ = {'doc1':[2,1],\n", " 'doc2':[1,2],\n", " 'doc3':[2,1]}" ], "id": "2bbd7b95-97ff-4727-82f4-117e3fd5dc7a" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`(1)` $D$에는 총 몇개의 단어가 있는가?" ], "id": "cd6accc6-663e-4a32-96fa-53c28eb47e21" }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "len(set([wrd for doc in D for wrd in D[doc]]))" ], "id": "c3a15213-0a7a-4984-b23b-dee67e9f79d7" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`(2)` 문서2에 토픽1은 몇개나 있는가?" ], "id": "238fe7ad-8872-417d-bf39-ca27a0e87d1f" }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "θ['doc2']" ], "id": "1c328892-6122-414e-80dd-9044546f127f" }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "θ['doc2'].count(1)" ], "id": "106a3b85-2f04-4d73-9e2d-f037c0290bb8" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`(3)` 토픽1에 들어있는 단어들의 목록을 구하라." ], "id": "b1203615-3baa-4eec-8d13-b95fc1798de7" }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "wrdlst = [wrd for doc in D for wrd in D[doc]]\n", "wrdlst" ], "id": "a0f542a3-a0bc-43c5-bdd2-3e1cba2bb4ef" }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "tpclst = [tpc for doc in θ for tpc in θ[doc]]\n", "tpclst " ], "id": "a4ebbbc9-f48a-4352-b2da-b5b0ac109dc7" }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "[wrd for i,wrd in enumerate(wrdlst) if tpclst[i]==1 ]" ], "id": "38a9a729-d6bc-4434-aab1-302b8f63020b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`(4)` 토픽1에서 ’골’이라는 단어는 몇번 등장하는가?" ], "id": "e3d21f4f-1e9f-48ab-9fb7-d1df6bfde4ec" }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "[wrd for i,wrd in enumerate(wrdlst) if tpclst[i]==1 ].count('골')" ], "id": "0e00bb36-a3d3-4f70-88b3-f4a850f24a86" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 데이터: $D$와 $\\theta$의 설정" ], "id": "d3df21fc-2d19-420d-83e1-909a72d20004" }, { "cell_type": "code", "execution_count": 303, "metadata": {}, "outputs": [], "source": [ "D = {'doc1': ['심판', '헤딩', '선수', '골', '리그', '골', '선수', '공격', '헤딩', '슈팅', '공', '패스', '공격수', '페널티킥', '공'], 'doc2': ['수비', '골', '챔피언스리그', '헤딩', '경기장', '골키퍼', '챔피언스리그', '헤딩', '경기장', '수비수', '수비수', '패스', '드리블', '선수', '월드컵'], 'doc3': ['헤딩', '리그', '드리블', '골키퍼', '공격수', '공격수', '월드컵', '선수', '공', '헤딩', '중앙미드필더', '공격', '선수', '수비수', '드리블'], 'doc4': ['클럽', '선수', '챔피언스리그', '슈팅', '리그', '수비', '리그', '중앙미드필더', '공격', '공', '중앙미드필더', '골', '패스', '중앙미드필더', '클럽'], 'doc5': ['선수', '경기장', '수비', '골키퍼', '월드컵', '리그', '드리블', '공격수', '슈팅', '선수', '선수', '월드컵', '드리블', '월드컵', '골키퍼'], 'doc6': ['수비수', '심판', '공', '공격', '표준편차', '표본', '상관관계', '모집단', '딥러닝', '클러스터링', '인공지능', '챔피언스리그', '공', '심판', '챔피언스리그'], 'doc7': ['페널티킥', '중앙미드필더', '챔피언스리그', '선수', '표본', '평균', '분류', '로지스틱 회귀', '머신러닝', '클러스터링', '평균', '수비수', '중앙미드필더', '페널티킥', '심판'], 'doc8': ['공격', '경기장', '패스', '수비수', '신뢰구간', '데이터과학', '확률', '통계', '분류', '인공지능', '머신러닝', '수비수', '수비수', '페널티킥', '수비수'], 'doc9': ['페널티킥', '패스', '골키퍼', '공', '신뢰구간', '딥러닝', '평균', '인공지능', '딥러닝', '분산', '딥러닝', '월드컵', '월드컵', '슈팅', '골키퍼'], 'doc10': ['리그', '슈팅', '드리블', '선수', '평균', '데이터분석', '데이터과학', '신뢰구간', '평균', '분류', '딥러닝', '심판', '슈팅', '패스', '선수'], 'doc11': ['평균', '데이터분석', '클러스터링', '데이터과학', '신경망', '데이터분석', '상관관계', '인공지능', '상관관계', '확률', '회귀분석', '로지스틱 회귀', '평균', '표준편차', '딥러닝'], 'doc12': ['신뢰구간', '딥러닝', '확률', '평균', '데이터분석', '상관관계', '회귀분석', '통계', '신경망', '상관관계', '회귀분석', '확률', '로지스틱 회귀', '상관관계', '데이터과학'], 'doc13': ['확률', '로지스틱 회귀', '통계', '딥러닝', '모집단', '머신러닝', '인공지능', '표준편차', '상관관계', '확률', '확률', '클러스터링', '신경망', '분류', '데이터분석'], 'doc14': ['데이터분석', '데이터과학', '분류', '통계적 가설검정', '머신러닝', '로지스틱 회귀', '회귀분석', '분류', '표본', '모집단', '통계적 가설검정', '상관관계', '표본', '클러스터링', '표본'], 'doc15': ['딥러닝', '인공지능', '표본', '표준편차', '신경망', '분류', '모집단', '데이터분석', '통계', '통계적 가설검정', '통계적 가설검정', '머신러닝', '머신러닝', '상관관계', '딥러닝']}\n", "pd.DataFrame(D)" ], "id": "34a86bfb-546b-43c7-a6d1-f6ae42421a76" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` 간단한 데이터 조사\n", "\n", "- 데이터는 총 15개의 문서로 이루어져 있으며 처음5개의 문서는 축구관련,\n", " 이후 5개는 축구와 통계 관련, 이후 5개는 통계관련이다.\n", "- 축구와 통계가 섞인 `doc6~doc11`은 축구관련4단어, 통계관련7단어,\n", " 축구관련4단어의 조합으로 이루어져 있다.\n", "\n", "`-` 초기값" ], "id": "c1334968-f61b-4a2d-89b9-5aacc1b7a442" }, { "cell_type": "code", "execution_count": 304, "metadata": {}, "outputs": [], "source": [ "θ = {doc:np.random.choice([0,1],size=15).tolist() for doc in D}\n", "θ" ], "id": "3e9bebfe-8b69-4006-bcfa-e91360358ea7" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` D와 $\\theta$를 묶어서 하나의 dict를 만들자." ], "id": "7f96acc1-af22-4d9f-b5dc-2ceb10532dc8" }, { "cell_type": "code", "execution_count": 305, "metadata": {}, "outputs": [], "source": [ "data = {'D':D, 'θ':θ} " ], "id": "37ca855e-87f3-4480-babc-b11550e2f675" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 하이퍼파라메터" ], "id": "cdca7afb-a94c-4570-aba4-34bf6582692c" }, { "cell_type": "code", "execution_count": 306, "metadata": {}, "outputs": [], "source": [ "K = 2 # 토픽의수 <-- 유저가 설정함" ], "id": "8c4f6d80-da4f-4d78-b884-1bc362a5c004" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 필요한 함수\n", "\n", "`-` $p_1$: $d$-th document에 포함된 토픽 $k$의 비율을 리턴하는 함수, 즉\n", "아래를 계산한다.\n", "\n", "$$p_1=:\\frac{\\#({\\tt topic == k, document == d})+0.1}{\\#({\\tt document == d})+0.1\\times K}$$\n", "\n", "여기에서 $K$는 토픽의 수." ], "id": "dcf362c8-bb4e-444e-9d92-88274ba4d2ec" }, { "cell_type": "code", "execution_count": 307, "metadata": {}, "outputs": [], "source": [ "def p1(topic,doc,data):\n", " θ = data['θ']\n", " a = θ[doc].count(topic) +0.1\n", " b = len(θ[doc]) + 0.1 *K \n", " return a/b" ], "id": "57ef5641-0d43-4fff-8881-341ac69d0844" }, { "cell_type": "markdown", "metadata": {}, "source": [ "`-` $p_2$: $k$-th topic에 포함된 단어 $w$의 비율을 리턴하는 함수, 즉\n", "아래를 계산한다.\n", "\n", "$$p_2=:\\frac{\\#({\\tt word ==w, topic == k})+0.1}{\\#({\\tt topic == k})+0.1\\times W}$$\n", "\n", "여기에서 $W$는 전체단어의 수. (이 예제의 경우 40개의 단어로 이루어짐)" ], "id": "e0763566-8855-4076-be18-6cf9bad41ef8" }, { "cell_type": "code", "execution_count": 312, "metadata": {}, "outputs": [], "source": [ "def p2(word,topic,data):\n", " D=data['D']\n", " θ=data['θ']\n", " tpclst = [tpc for doc in θ for tpc in θ[doc]]\n", " wrdlst = [wrd for doc in D for wrd in D[doc]]\n", " a = [wrd for i,wrd in enumerate(wrdlst) if tpclst[i]==topic].count(word) + 0.1 \n", " b = tpclst.count(topic) + 0.1 * len(set(wrdlst))\n", " return a/b" ], "id": "d08cffd6-a9a9-45ef-b1b0-8647cdf67311" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 알고리즘\n", "\n", "### ***1. 초기값: ${\\boldsymbol \\theta}_0$***" ], "id": "57c97f37-0762-4039-a3b4-2c5faa422bce" }, { "cell_type": "code", "execution_count": 313, "metadata": {}, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\n" } } ], "source": [ "θ = {doc:np.random.choice([0,1],size=15).tolist() for doc in D}\n", "plt.matshow(list(θ.values()))" ], "id": "f7c43377-4143-4df7-80c6-27b6779149dd" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ***2. 반복: ${\\boldsymbol \\theta}_0 \\to {\\boldsymbol \\theta}_1 \\to {\\boldsymbol \\theta}_2 \\to \\dots$***" ], "id": "90e8045d-eb87-470e-879c-647d3c2b8fa2" }, { "cell_type": "code", "execution_count": 314, "metadata": {}, "outputs": [], "source": [ "for t in range(5):\n", " for doc in D:\n", " for i, wrd in enumerate(D[doc]):\n", " # 임시의 data를 만들고 현재 포커싱되어있는 자료를 삭제함 \n", " data = {'D':copy.deepcopy(D), 'θ': copy.deepcopy(θ)} \n", " del data['D'][doc][i]\n", " del data['θ'][doc][i]\n", " \n", " # 토픽의 타당성조사, msr는 타당성을 나타내는 측도, prob는 msr의 총합을 1로 맞춤\n", " msr0 = p1(topic=0, doc=doc, data=data) * p2(word=wrd, topic=0, data=data) # 토픽0의 타당성\n", " msr1 = p1(topic=1, doc=doc, data=data) * p2(word=wrd, topic=1, data=data) # 토픽1의 타당성\n", " prob = [msr0/(msr0 + msr1), msr1/(msr0 + msr1)] \n", " \n", " # update θ|\n", " θ[doc][i] = np.random.choice([0,1], p=prob) " ], "id": "2013c36c-f98d-42fb-a637-8e292098a9f6" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 시각화" ], "id": "5ecdd91c-14b4-4483-b9f0-7685775f5202" }, { "cell_type": "code", "execution_count": 315, "metadata": {}, "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "image/png": "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\nQmCC\n" } } ], "source": [ "plt.matshow(list(θ.values()))" ], "id": "1528c976-a7c5-4844-b24a-d2a703361ec4" } ], "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" }, "language_info": { "name": "python", "codemirror_mode": { "name": "ipython", "version": "3" }, "file_extension": ".py", "mimetype": "text/x-python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.16" } } }