기본 콘텐츠로 건너뛰기

추천 게시물

[Go] 고루틴

런타임(Runtime) visual code에서 브라우저 실행 단축키: Alt+B Go runtime은 메모리 관리, 가비지 수집, 동시성을 포함하여 Go 프로그림의 실행을 관리하는 역할을 합니다. 이 문서에서는 Go runtime을 자세히 살펴보고 아키텍초, 특성과 장점을 살펴봅니다. Go Runtime Architecture Go runtime은 모듈식이고 유연하게 설계되었으며 개발자가 특정 요구사항에 따라 동작을 사용자 정의할 수 있는 계층적 아키텍쳐를 갖추고 있습니다. 런타임은 스케줄러(schedualer), 가비지 수집기(garbage collector), 메모리 할당자(memory alllocator) 및 스택관리(stack management)를 포함한 어려 핵심 구성 요소로 구성됩니다. Schedualer Go 런타임의 핵심은 고루틴의 실행을 관리하는 스케줄러입니다. 고루틴은 효율적인 동시성을 가능하게 하는 가벼운 스레드입니다. 스케줄러는 사용 가능한 스레드에 고루틴을 분산하고, 스레드 로컬 스토리지를 관리하고, I/O 작업을 조정하는 역할을 합니다. thread(스레드): 프로그램 내에서 실행되는 흐름의 단위로 동시에 여러 작업이나 프로그램을 실행하는 것입니다. 즉, 코드를 실행할 수 있는 각 단위를 스레드라고 합니다. 고루틴(goroutine): Go 언어로 동시에 실행되는 모든 활동을 의미합니다. 고루틴을 만드는 비용을 스레드에 비해 매우 적기 떄문에 경량 스레드라고 합니다. 모든 프로그램은 적어도 하나의 main() 함수라는 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동합니다. 메인함수가 종료되면 모든 고루틴은 종료됩니다. 그러므로 고루틴보다 main이 먼저 종료되는 것을 방지해야 합니다. Go 스케줄러는 매우 효율적이고 확장 가능하도록 설계되어 많은 수의 동시 고루틴을 손쉽게 처리할 수 있습니다. 스레드 간에 부하를 분산하여 경합을 최소화하고 성능을 개선하는 작업 훔치기 알고리즘을 사용합니다...

베이즈 요인과 사후 확률 소개

베이즈 요인과 사후 확률 소개: 아이디어의 경쟁

베이즈 요인은 한 가설을 다른 가설과 비교하여 타당성을 테스트하는 공식입니다. 결과는 한 가설이 다른 가설보다 몇 배 더 가능성이 높은지 알려줍니다.

데이터(D)의 조건에 가설(H)에 대한 확률을 계산하기 위해 베이즈 정리를 적용합니다.

$$\tag{1}P(H|D)=\frac{P(H)P(D|H)}{P(D)}$$

  • P(H|D): 사후확률, 데이터를 바탕으로 가설을 얼마나 강하게 믿어야 하는지 나타냅니다.
  • P(H): 사전확률, 데이터의 고려없는 상태에서 가설의 확률
  • P(D|H): 우도, 가설이 사실일 경우 발생할 가능성(확률)
  • P(D): 데이터의 총확률로 가설과 무관하게 관찰된 데이터의 확률. 사후확률의 정규화를 위해 필요

단지 가설들의 상대적 강도를 비교하는 것에 주목하는 경우 P(D)가 반드시 필요한 것은 아닙니다. 이러한 표현을 위해 식1은 다음과 같이 비례형태로 나타내기도 합니다.

$$\tag{2}P(H|D)\propto P(H)P(D|H)$$

우리 가설의 사후 확률은 사전 확률에 우도를 곱한 것에 비례합니다. 사후 확률 공식을 사용하여 각 가설에 대한 사전 믿음과 우도의 비율을 조사하여 두 가설을 비교할 수 있습니다.

$$\tag{3}\frac{P(H_1)P(D|H_1)}{P(H_2)P(D|H_2)}$$

사후 확률을 사용하여 가설 검정 구축

사후 확률 공식은 사후 확률을 제공하며, 이를 통해 데이터에 대한 가설이나 믿음을 검정할 수 있습니다.

사후 확률을 더 잘 이해하기 위해 사후 확률 공식을 두 부분으로 나눕니다. 우도 비율 또는 베이즈 계수와 사전 확률 비율입니다.

베이즈 요인(Bayes factor)

$$\tag{4}\text{Bayes Factor}=\frac{P(D|H_1)}{P(D|H_2)}$$

식 4가 2라면 가설 H1은 H2에 비해 2배 만큼 데이터를 설명한다는 것을 의미합니다.

식 4는 두 가설의 비를 나타내고 있으며 베이스 요인라고 합니다. 이 비율의 중요한 점은 베이지안 추론은 데이터 자체의 믿음에 대한 것이 아닌 데이터가 믿음을 얼나 지지하는 가에 대해 집중한다는 것입니다. 즉, 데이터는 가설(생각)을 확증하거나 그 가설을 바꾸도록 이끌 수 있습니다.

사전 확률 오즈

각 가설의 사전 확률이 같다고 가정할 수 있지만 항상 그런 것은 아닙니다. 가설은 매우 가능성이 낮더라도 데이터를 잘 설명할 수 있습니다.

$$\tag{5}\frac{P(H_1)}{P(H_2)}$$

식 4는 데이터를 조사하기 전에 두 가설들의 확률을 비교하는 것을 나타냅니다. 베이즈 계수과 관련하여 사용될 때 이 비는 H1에 대한 사전 오즈(prior odds)라고 하며 O(H1)로 표시합니다.

  • O(H1) > 1: H1 facvor
  • O(H1) < 1: H1 against

사후 확률 오즈

\begin{align}\tag{6}\text{posterior odds}&=\frac{P(H_1|D)}{P(H_2|D)}\\&=\frac{\frac{P(H_1)P(D|H_1)}{P(D)}}{\frac{P(H_2)P(D|H_2)}{P(D)}}\\ &=\frac{P(H_1)P(D|H_1)}{P(H_2)P(D|H_2)}\\&=O(H_1)\frac{P(D|H_1)}{P(D|H_2)}\end{align}

Guidelines for Evaluating Posterior Odds
Posterior odds Strength of evidence
1 to 3 흥미롭지만 결정적인 것은 없음
3 to 20 뭔가를 알아낸 것 같음
20 to 150찬성에 대한 강한 증거
> 150 압도적인 증거

적재된 주사위에 대한 추정

베이즈 요인과 사후 확률을 가설 검정의 한 형태로 사용할 수 있으며, 각 검정은 두 가지 아이디어 간의 경쟁입니다.

친구가 6면체 주사위 3개가 들어 있는 가방을 가지고 있고, 주사위 하나에 무게(적재된 주사위)가 있어서 6이 나올 확률은 1/2이라고 가정해 보겠습니다. 나머지 두 개는 6이 나올 확률이 1/6인 전통적인 주사위입니다. 친구가 주사위를 꺼내 10번 굴리면 다음과 같은 결과가 나옵니다.

6, 1, 3, 6, 4, 5, 6, 1, 2, 6

이것이 적재된 주사위인지 일반 주사위인지 알아내고 싶습니다. 적재된 주사위를 H1, 일반 주사위를 H2라고 부를 수 있습니다. 베이즈 요인을 계산하는 것으로 시작해 보겠습니다.

\begin{align}\frac{P(D|H_1)}{P(D|H_2)}&\\P(D|H_1)&=\left(\frac{1}{2}\right)^4\left(\frac{1}{2}\right)^6\\ P(D|H_2)&=\left(\frac{1}{2}\right)^4\left(\frac{5}{6}\right)^6\end{align}

import numpy as np
import pandas as pd
from scipy import stats, special
import itertools
from sympy import *
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")

def decorate_plot(xlab, ylab, title=None, size=(4,3)):
    plt.figure(figsize=size)
    plt.xlabel(xlab)
    plt.ylabel(ylab)
    plt.title(title)   
load=(1/2)**4*(1/2)**6
regular=(1/6)**4*(5/6)**6
bayesFactor=load/regular
round(bayesFactor, 3)
3.779

위 결과는 주사위가 적재되었다는 믿음(H1)은 일반주사위라는 믿음에 비해 약 4배 강함을 나타냅니다.

위 계산은 H1과 H2 자체의 발생이 같은 경우를 기반으로 합니다. 즉, 각 가설이 일어날 확률이 같다는 전제하에 이루어진 것입니다. 그러나 이 예의 경우 백안에 적재된 주사위 1, 일반 주사위 2개에서 시작된 것으로 각 가설의 확률와 H1의 오즈는 다음과 같습니다.

p_H1=1/3
p_H2=2/3
priorRatio=p_H1/p_H2
round(priorRatio, 3)
0.5

위 O_H1은 사전 오즈입니다. 이 사전오즈를 적용하여 데이터(가방에 적재된 주사위 1, 일반 주사위 2)에 대한 가설 H1의 사후오즈(posterior odds)를 계산할 수 있습니다.

postOdds=priorRatio*bayesFactor
round(postOdds, 3)
1.89

초기 우도 비율(Bayes factor)은 H1이 H2보다 거의 4배 더 잘 데이터를 설명했지만 사후 확률은 H1이 H2보다 절반 정도 가능성이 낮기 때문에 H1이 실제로 H2보다 약 두 배 정도 더 강력하게 설명할 수 있음을 보여줍니다. 이것으로부터, 만약 당신이 주사위가 적재되었는지 아닌지에 대한 결론을 반드시 내려야 한다면, 당신의 최선의 방법은 그것이 실제로 적재되었다고 말하는 것입니다. 그러나 사후오즈가 2보다 작다는 것은 H1을 지지할 결정적인 증거가 없다고 할 수 있습니다. 적재된 주사위인지 아닌지를 알기 위해서는 더 강한 증거(데이터)가 있을 때까지 더 실행하여야 합니다.

온라인에서 질병 자가 진단하기

많은 사람들이 밤늦게 온라인에서 증상과 질병을 검색하는 실수를 저질렀고, 공포에 질려 화면에 붙어 있는 자신을 발견했습니다. 이상하고 끔찍한 질병의 희생자가 된 게 분명하니까요! 불행히도 그들의 분석은 거의 항상 베이지안 추론을 배제하는데, 이는 불필요한 불안을 완화하는 데 도움이 될 수 있습니다. 이 예에서 증상을 검색하는 실수를 했고 맞는 두 가지 질병을 찾았다고 가정해 보겠습니다. 아무 이유 없이 당황하는 대신 사후 확률을 사용하여 각각의 확률을 평가합니다.

어느 날 귀가 들리지 않고 한쪽 귀에서 울림(이명)이 들린다고 가정해 보겠습니다. 하루 종일 짜증이 나고, 퇴근해서 집에 돌아와서 증상의 잠재적 원인을 웹에서 검색해야겠다고 결심합니다. 점점 더 걱정이 되고 마침내 두 가지 가설이 생깁니다.

  • 귀지 막힘(H2): 한쪽 귀에 귀지가 너무 많습니다. 의사를 잠깐 방문하면 이 상태가 해결될 것입니다.
  • 전정 신경초종(H1): 전정 신경의 미엘린 덮개에 뇌종양이 자라서 돌이킬 수 없는 청력 상실을 초래하고 뇌 수술이 필요할 수 있습니다.

두 가지 중에서 전정 신경초종 가능성이 가장 걱정됩니다. 물론 귀지일 수도 있지만, 그게 아니라면 어떨까요? 뇌종양이 있다면 어떨까요? 뇌종양 가능성이 가장 걱정되므로 이것을 H1로 정하기로 합니다. H2는 한쪽 귀에 귀지가 너무 많다는 가설입니다. 사후 확률로 진정할 수 있는지 봅시다. 위 예에서처럼 각 가설이 참일 경우 이러한 증상을 관찰할 가능성을 살펴보고 베이즈 계수를 계산하여 탐색을 시작합니다. 즉, P(D | H)를 계산해야 합니다. 청력 상실과 이명이라는 두 가지 증상을 관찰했습니다. 전정 신경초종(vs)의 경우 청력 상실(A)을 경험할 확률은 94%이고 이명(B)을 경험할 확률은 83%입니다. 즉, 전정 신경초종이 있는 경우 청력 상실과 이명(A ∩ B = D)이 발생할 확률은 다음과 같습니다.

$$\text{Bayes Factor}=\frac{P(D|H1)}{P(D|H2)}$$

pA_H1=0.94
pB_H1=0.83
pD_H1=pA_H1*pB_H1
round(pD_H1, 3)
0.78

귀지막힘의 경우 P(A)=0.63, P(B)=0.55

pA_H2=0.63
pB_H2=0.55
pD_H2=pA_H2*pB_H2
round(pD_H2, 3)
0.347
BF=pD_H1/pD_H2
round(BF, 3)
2.252

베이즈 계수만 보면 뇌종양에 대한 우려를 완화하는 데 큰 도움이 되지 않습니다. 우도비만 고려하면 귀지 막힘이 있는 경우보다 전정 신경초종이 있는 경우 이러한 증상을 경험할 가능성이 두 배 이상 높은 것으로 보입니다! 다행히도 아직 분석이 끝나지 않았습니다. 다음 단계는 각 가설의 사전 확률을 결정하는 것입니다. 증상은 제쳐두고, 누군가가 한 가지 문제를 겪을 가능성과 다른 문제를 겪을 가능성은 얼마나 될까요? 이러한 각 질병에 대한 역학적 데이터를 찾을 수 있습니다. 전정 신경초종은 드문 질환인 것으로 밝혀졌습니다. 매년 1,000,000명 중 11명만이 이 질환에 걸립니다. 귀지막힘의 경우 보다 일반적입니다. 사전 확률은 다음과 같습니다.

\begin{align}P(H_1)&=\frac{11}{1000000}\\ P(H_2)&=\frac{37000}{1000000}\end{align}

p_H1=Rational(11, 1000000)
p_H2=Rational(37000,1000000)
priorOdds=p_H1/p_H2
priorOdds

$\frac{11}{37000}$

postOdds=priorOdds*BF
postOdds
0.000669412269412269

이 결과는 H2가 H1보다 약 1,659배 더 가능성이 높다는 것을 보여줍니다. 마지막으로, 아침에 간단한 귀 청소를 위해 병원에 가면 이 모든 것이 해결될 것이라는 사실을 알고 안심할 수 있습니다! 일상적인 추론에서 무서운 상황의 확률을 과대평가하기 쉽지만 베이지안 추론을 사용하면 실제 위험을 분석하고 실제로 얼마나 가능성이 높은지 확인할 수 있습니다.

연습문제

예1) 주사위 문제로 돌아가서, 친구가 실수를 해서 실제로는 적재된 주사위가 두 개이고 공정한 주사위는 하나뿐이라는 것을 갑자기 깨달았다고 가정해 보겠습니다. 이것은 우리 문제에 대한 사전 확률과 사후 확률을 어떻게 바꿀까요? 굴리는 주사위가 적재된 주사위라고 믿을 의향이 더 있나요?

위 주사위 예에서 우도의 비인 베이즈 요인은 변함없지만 사전오즈의 비가 달라집니다. 그 결과인 사후오즈 역시 변경됩니다.

load=(1/2)**4*(1/2)**6
regular=(1/6)**4*(5/6)**6
bayesFactor=load/regular
p_H1=2/3
p_H2=1/3
priorRatio=p_H1/p_H2
round(priorRatio, 3)
2.0
postOdds=priorRatio*bayesFactor
round(postOdds, 3)
7.558

결과적으로 시행되는 주사위가 적재된 주사위라는 증거가 확실해 집니다.

예2) 희귀 질환의 예로 돌아가서, 의사에게 가서 귀를 청소한 후에도 증상이 지속되는 것을 알아차렸다고 가정해 보겠습니다. 더 심한 것은 새로운 증상인 현기증(C)입니다. 의사는 또 다른 가능한 설명인 미로염(H3)을 제안합니다. 미로염은 내이의 바이러스 감염으로 98%의 경우 현기증이 수반됩니다. 그러나 이 질환에서는 청력 상실과 이명이 덜 흔합니다. 청력 상실(A)은 30%의 경우만 발생하고 이명(B)은 28%의 경우만 발생합니다. 현기증은 전정 신경초종(H1)의 가능한 증상이지만 49%의 경우에서만 발생합니다. 일반 인구에서 백만 명당 35명이 매년 미로염에 걸립니다. 미로염이 있다는 가설과 전정 신경초종이 있다는 가설을 비교할 때 사후 오즈는 얼마입니까?

\begin{align}& P(C|H3)=0.98, P(A|H3)=0.3, P(B|H3)=0.28\\& P(C|H1)=0.49\\& P(H3)=\frac{35}{1000000}\end{align}

pA_H1=0.94
pB_H1=0.83
PC_H1=0.49
pD_H1=pA_H1*pB_H1*PC_H1
round(pD_H1, 3)
0.382
pA_H3=0.3
pB_H3=0.28
pC_H3=0.98
pD_H3=pA_H3*pB_H3*pC_H3
round(pD_H3, 3)
0.082
BF=pD_H3/pD_H1
round(BF, 3)
0.215
p_H1=Rational(11, 1000000)
p_H3=Rational(35,1000000)
priorOdds=p_H3/p_H1
priorOdds
0.685139008645802

사전 오즈는 H3(미로염)에 걸릴 확률이 약 3배 높습니다. 그러나 각 증상들에 의한 데이터를 고려한 사후의 비는 데이터(증상)에 의해 H3이 H1보다 더 설명된다는 증거가 안됨을 의미합니다.

댓글

이 블로그의 인기 게시물

[python]KeyWord

keywords Characters or strings already used to define basic commands in programming languages such as python are called reserved words. This reserved word cannot be used when defining objects such as variables, functions, and classes when coding by the user. python has 33 reserved words, and it distinguishes between lowercase and uppercase letters in Engolsh. All other keywords are lowercase except True, False, None, etc. a and, as, assert, async, await b break c class, continue d def, del e eolf, else, except f False, finally, for, from g global i in, if, import, is l lambda n nonlocal, None, not o or r raise, return p pass ...

[Go] 고루틴

런타임(Runtime) visual code에서 브라우저 실행 단축키: Alt+B Go runtime은 메모리 관리, 가비지 수집, 동시성을 포함하여 Go 프로그림의 실행을 관리하는 역할을 합니다. 이 문서에서는 Go runtime을 자세히 살펴보고 아키텍초, 특성과 장점을 살펴봅니다. Go Runtime Architecture Go runtime은 모듈식이고 유연하게 설계되었으며 개발자가 특정 요구사항에 따라 동작을 사용자 정의할 수 있는 계층적 아키텍쳐를 갖추고 있습니다. 런타임은 스케줄러(schedualer), 가비지 수집기(garbage collector), 메모리 할당자(memory alllocator) 및 스택관리(stack management)를 포함한 어려 핵심 구성 요소로 구성됩니다. Schedualer Go 런타임의 핵심은 고루틴의 실행을 관리하는 스케줄러입니다. 고루틴은 효율적인 동시성을 가능하게 하는 가벼운 스레드입니다. 스케줄러는 사용 가능한 스레드에 고루틴을 분산하고, 스레드 로컬 스토리지를 관리하고, I/O 작업을 조정하는 역할을 합니다. thread(스레드): 프로그램 내에서 실행되는 흐름의 단위로 동시에 여러 작업이나 프로그램을 실행하는 것입니다. 즉, 코드를 실행할 수 있는 각 단위를 스레드라고 합니다. 고루틴(goroutine): Go 언어로 동시에 실행되는 모든 활동을 의미합니다. 고루틴을 만드는 비용을 스레드에 비해 매우 적기 떄문에 경량 스레드라고 합니다. 모든 프로그램은 적어도 하나의 main() 함수라는 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동합니다. 메인함수가 종료되면 모든 고루틴은 종료됩니다. 그러므로 고루틴보다 main이 먼저 종료되는 것을 방지해야 합니다. Go 스케줄러는 매우 효율적이고 확장 가능하도록 설계되어 많은 수의 동시 고루틴을 손쉽게 처리할 수 있습니다. 스레드 간에 부하를 분산하여 경합을 최소화하고 성능을 개선하는 작업 훔치기 알고리즘을 사용합니다...

매개변수 추정 도구: PDF, CDF 및 분위수 함수

매개변수 추정 도구: PDF, CDF 및 분위수 함수 확률 밀도 함수(PDF)에 대해 자세히 다루고, 값 범위의 확률을 보다 쉽게 결정하는 데 도움이 되는 누적 분포 함수(CDF)를 소개하고, 확률 분포를 동일한 확률로 나누는 분위수를 소개합니다. 예를 들어, 백분위수는 100분위수이며, 이는 확률 분포를 100개의 동일한 부분으로 나눈다는 것을 의미합니다. 이메일 가입 목록에 대한 전환율 추정 블로그를 운영하고 블로그 방문자가 이메일 목록에 가입할 확률을 알고 싶다고 가정해 보겠습니다. 마케팅 용어로 사용자가 원하는 이벤트를 수행하도록 하는 것을 전환 이벤트 또는 간단히 전환이라고 하며, 사용자가 가입할 확률을 전환율이라고 합니다. 구독자 수 k와 방문자 총 수 n을 알고 있을 때 구독 확률 p를 추정하기 위해 베타 분포를 사용할 것입니다. 베타 분포에 필요한 두 가지 매개변수는 α로, 이 경우 구독자 총 수(k)를 나타내고, β는 구독하지 않은 총 수(n – k)를 나타냅니다. 확률 밀도 함수 첫 40,000명의 방문자에 대해 300명의 구독자를 얻는다고 가정해 보겠습니다. 우리 문제에 대한 PDF는 α = 300이고 β = 39,700인 베타 분포입니다. 베타 분포의 평균 계산 $$\tag{1}\mu_{\text{beta}}=\frac{\alpha}{\alpha + \beta}$$ 식 1을 사용하여 방문자 중의 구독자에 대한 평균은 다음과 같이 계산됩니다. import numpy as np import pandas as pd from scipy import stats, special import itertools from sympy import * import matplotlib.pyplot as plt import seaborn as sns sns.set_style("darkgrid") def decorate_plot(xlab, ylab, title=None, size=(4,3)): plt.figu...