기본 콘텐츠로 건너뛰기

추천 게시물

[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 스케줄러는 매우 효율적이고 확장 가능하도록 설계되어 많은 수의 동시 고루틴을 손쉽게 처리할 수 있습니다. 스레드 간에 부하를 분산하여 경합을 최소화하고 성능을 개선하는 작업 훔치기 알고리즘을 사용합니다...

조건부확률(Conditional Probability)

조건부 확률

확률은 한 사건의 결과가 다른 사건의 결과에 영향을 미치지 않을 때 독립적입니다. 확률이 독립적이지 않고 특정 사건의 결과에 따라 달라지는 조건부 확률에 대해 추론하는 방법을 알아봅니다. 또한 조건부 확률의 가장 중요한 응용 분야 중 하나인 베이즈 정리를 소개합니다.

조건부 확률 소개

조건부 확률의 첫 번째 예에서 독감 백신과 백신 접종 시 발생할 수 있는 합병증에 대해 살펴보겠습니다. 독감 백신을 맞으면 일반적으로 백신과 관련된 다양한 위험에 대해 알려주는 종이 한 장이 제공됩니다. 한 가지 예로 길랭-바레 증후군(GBS)의 발생률이 증가하는 것이 있습니다. 이는 신체의 면역 체계가 신경계를 공격하여 생명을 위협할 수 있는 합병증을 유발하는 매우 드문 질환입니다. 질병통제예방센터(CDC)에 따르면, 1년에 GBS에 감염될 확률은 10만 분의 2입니다.

$$P(\text{GBS})=\frac{2}{100000}$$

일반적으로 독감 백신은 GBS에 걸릴 확률을 사소한 양만큼만 증가시킵니다. 그러나 2010년에 돼지 독감이 발생했고, 그 해에 독감 백신을 맞았다면 GBS에 걸릴 확률이 3/100,000으로 증가했습니다. 이 경우 GBS에 걸릴 확률은 독감 백신을 맞았는지 여부에 직접적으로 달려 있으므로 조건부 확률의 예입니다.

조건부확률은 P(A|B)와 같이 나타내며 B의 조건에 A의 확률을 나타냅니다. 이 표기법에 의해 위를 사항은 다음과 같이 나타낼 수 있습니다.

$$P(\text{GBS}| \text{백신})=\frac{3}{100000}$$

조건부 확률이 중요한 이유

조건부 확률은 통계학의 필수적인 부분인데, 정보가 우리의 믿음을 어떻게 변화시키는지 보여줄 수 있기 때문입니다.

$$\frac{P(\text{GBS}| \text{백신})}{P(\text{GBS})}=\frac{\dfrac{2}{100000}}{\dfrac{3}{100000}}=1.5$$

따라서 2010년에 독감 예방 접종을 했다면, 무작위로 뽑은 낯선 사람보다 GBS에 걸릴 가능성이 50% 더 높다고 믿을 만큼 충분한 정보가 있습니다. 다행히도 개인 수준에서 GBS에 걸릴 확률은 여전히 매우 낮습니다. 하지만 전체 인구를 살펴보면 독감 예방 접종을 한 사람들로 구성된 인구에서 일반 인구보다 GBS에 걸릴 사람이 50% 더 많을 것으로 예상됩니다.

GBS에 걸릴 확률을 높일 수 있는 다른 요인도 있습니다. 예를 들어, 남성과 노인은 GBS에 걸릴 가능성이 더 높습니다. 조건부 확률을 사용하면 이 모든 정보를 추가하여 개인이 GBS에 걸릴 가능성을 더 잘 추정할 수 있습니다.

종속성과 개정된 확률 규칙

조건부 확률의 두 번째 예로, 사람들이 특정 색상을 구별하기 어렵게 만드는 시력 결함인 색맹을 사용하겠습니다. 일반 인구에서 약 4.25%의 사람들이 색맹입니다. 색맹의 대부분은 유전적입니다. 색맹은 X 염색체의 결함 유전자로 인해 발생합니다. 남성은 X 염색체가 하나뿐이고 여성은 두 개이기 때문에 남성은 결함이 있는 X 염색체의 부작용을 겪을 가능성이 약 16배 더 높고 따라서 색맹이 될 가능성이 높습니다. 따라서 전체 인구의 색맹률은 4.25%인 반면 여성은 0.5%에 불과하고 남성은 8%입니다. 모든 계산에서 인구의 남성/여성 비율이 정확히 50/50이라는 단순화된 가정을 합니다. 이러한 사실을 조건부 확률로 나타내 보겠습니다.

P(색맹) = 0.0425
P(색맹| 여성) = 0.005
P(색맹| 남성) = 0.08

이 정보를 기반으로 무작위로 한 사람을 선택할 경우 남성이고 색맹일 확률은 남성일 확률과 남성중 색맹일 확률의 곱으로 계산할 수 있다.

곱의 법칙은 독립적인 확률로만 작동하기 때문에 사용할 수 없습니다. 하지만 남성(또는 여성)이고 색맹인 것은 종속 확률입니다. 따라서 색맹인 남성을 찾을 수 있는 실제 확률은 남성을 고를 확률에 그가 색맹일 확률을 곱한 것입니다.

P(남성, 색맹) = P(남성)P(색맹|남성)

p=0.5*0.08;p
0.04

위 계산을 일반화하면 식 1과 같다.

$$\tag{1} P(A, B)=P(A)P(B|A)$$

이 정의는 독립적인 확률에도 적용됩니다. 왜냐하면 독립적인 확률의 경우 P(B) = P(A|B)이기 때문입니다. 앞면이 나오고 6이 나오는 경우를 생각하면 직관적으로 이해가 됩니다. P(6)은 동전 던지기와 무관하게 1/6이기 때문에 P(6|H)도 1/6입니다.

그러므로 합의 법칙 역시 조건부확률을 사용하여 식 2와 같이 나타낼 수 있다.

$$\tag{2} P(A \cup B)=P(A)+P(B)- P(A)P(B|A)$$

역방향 조건부 확률과 베이즈 정리

조건부 확률로 할 수 있는 가장 놀라운 것 중 하나는 조건을 역으로 바꿔 조건부 확률을 계산하는 것입니다. 즉, P(A|B)를 사용하여 P(B|A)에 도달할 수 있습니다. 예를 들어, 색맹 교정 안경을 판매하는 회사의 고객 서비스 담당자에게 이메일을 보낸다고 가정해 보겠습니다. 안경은 약간 비싸고, 안경이 작동하지 않을까 걱정된다고 담당자에게 말합니다. 담당자는 "저도 색맹이고, 저도 안경을 하나 가지고 있는데, 정말 잘 작동합니다!"라고 답합니다. 이 담당자가 남성일 확률을 알아내고 싶습니다. 그러나 담당자는 ID 번호 외에는 아무런 정보를 제공하지 않습니다. 그러면 담당자가 남성일 확률을 어떻게 알아낼 수 있을까요? 즉, P(색맹| 여성) = 0.005과 P(색맹| 남성) = 0.08을 사용하여 P(남성|색맹)을 결정합니다.

베이지안 통계의 핵심은 데이터이고, 지금 당장 우리는 하나의 데이터만 가지고 있습니다(기존 확률 외에): 우리는 고객 지원 담당자가 색맹이라는 것을 알고 있습니다. 다음 단계는 전체 인구 중 색맹인 부분을 살펴보는 것입니다. 그런 다음 그 하위 집합 중 어느 부분이 남성인지 알아낼 수 있습니다.

이를 추론하는 데 도움이 되도록 전체 인구를 나타내는 새로운 변수 N을 추가해 보겠습니다. 즉, 전체 색맹인구 중 남자이고 색맹인 사람을 계산합니다. 식 3과 같이 나타낼 수 있습니다.

$$\tag{3} P(남성|색맹)=\frac{P(남성, 색맹)}{P(색맹)\times N}$$

식 3의 분자는 식 4와 같이 계산할 수 있습니다.

$$\tag{4} P(남성, 색맹)=P(남성)P(색맹|남성) \times N$$

식 4를 3에 대입하여 계산합니다.

\begin{align}\tag{5} P(남성|색맹)=\frac{P(남성)P(색맹|남성) \times N}{P(색맹)\times N}\\ \frac{0.5\cdot 0.08}{0.0425}\end{align}

0.5*0.08/0.0425
0.9411764705882353

베이즈 정리 소개

식 5를 일반화한 식이 베이즈 정리입니다.

베이즈 정리

$$\tag{7} P(A|B)=\frac{P(A)P(B|A)}{P(B)}$$

우리의 믿음은 우리가 아는 세상을 설명하므로 우리가 무언가를 관찰할 때 그 조건부 확률은 우리가 믿는 바에 따라 우리가 본 것의 가능성을 나타냅니다.

P(data | belief)

위 조건부확률을 역으로 하면 실제 얻을 수 있는 데이터가 믿음에 영향을 정량화 할 수 있습니다.

P(belief | data)

베이즈 정리를 사용하면 10년 동안 5번의 가뭄에 대한 관찰을 이러한 가뭄을 관찰한 후 기후 변화를 얼마나 강하게 믿는지에 대한 진술로 변환할 수 있습니다. 필요한 다른 정보는 10년 동안 5번의 가뭄에 대한 일반적인 확률(과거 데이터로 추정 가능)과 기후 변화에 대한 믿음에 대한 초기 확신뿐입니다. 대부분의 사람들은 기후 변화에 대한 초기 확률이 다르지만 베이즈 정리를 사용하면 데이터가 믿음을 얼마나 바꾸는지 정확하게 정량화할 수 있습니다. 예를 들어 전문가가 기후 변화가 일어나고 있다고 가정하면 10년 동안 5번의 가뭄이 일어날 가능성이 매우 높다고 말하면 대부분의 사람들은 기후 변화에 회의적이든 앨 고어이든 기후 변화를 약간 선호하도록 이전 믿음을 바꿀 것입니다. 그러나 전문가가 기후 변화가 일어나고 있다는 가정을 감안할 때 실제로 10년 동안 5번의 가뭄이 일어날 가능성은 매우 낮다고 말했다고 가정해 보겠습니다. 이 경우 증거를 감안할 때 기후 변화에 대한 사전 믿음이 약간 약해질 것입니다. 여기서 중요한 요점은 베이즈 정리가 궁극적으로 증거가 우리의 믿음의 강도를 바꿀 수 있게 한다는 것입니다.

베이즈 정리는 우리가 세상에 대한 믿음을 취하고, 데이터와 결합한 다음, 이 결합을 우리가 관찰한 증거를 바탕으로 한 믿음의 강도에 대한 추정치로 변환할 수 있게 합니다.

연습문제

연습)위의 예에서 2010년에 GBS를 앓았던 사람이 그해에 독감 백신도 접종했을 확률을 베이즈 정리를 사용하여 확인하려면 어떤 정보가 필요할까요?

$$P(\text{접종} | \text{GBS})=\frac{P(\text{접종})P(\text{GBS}|\text{접종})}{P(\text{GBS})}$$

위 예에서 \(P(\text{GBS})=\frac{2}{100000},\; P(\text{GBS}|\text{접종})=\frac{3}{100000}\)가 주어진 정보이므로 P(접종)에 대한 정보가 필요합니다.

연습) 인구에서 무작위로 뽑은 사람이 색맹이 아닌 여성일 확률은 얼마입니까?

\begin{align}P(\text{여성}|\text{색맹아님})&=\frac{P(\text{여성})P(\text{색맹아님}|\text{여성} )}{P(\text{색맹아님})}\\&=\frac{0.5\cdot (1-0.005)}{(1-0.0425)}\end{align}

0.5*(1-0.005)/(1-0.045)
0.5209424083769634

연습)카드 한 벌에는 빨간색 또는 검은색 무늬가 있는 52장의 카드가 있습니다. 카드 한 벌에는 에이스가 4장 있습니다. 빨간색 2장과 검은색 2장입니다. 덱에서 빨간색 에이스 1장을 제거하고 카드를 섞습니다. 친구가 검은색 카드를 뽑습니다. 에이스일 확률은 얼마입니까? P(에이스|검은색)

카드: 51(검은색: 26, 빨간색: 25), 에이스: 3(검은색 2, 빨간색 1)

\begin{align}P(\text{에이스}| \text{검은색})&=\frac{P(\text{에이스})P(\text{검은색}| \text{에이스})}{P(\text{검은색})}\\&=\frac{\dfrac{3}{51}\dfrac{2}{3}}{\dfrac{26}{51}} \end{align}

from sympy import *
Rational(3,51)*Rational(2,3)/Rational(26,51))

$\frac{1}{13}$

댓글

이 블로그의 인기 게시물

[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...