기본 콘텐츠로 건너뛰기

추천 게시물

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

[Go] Pointer

Pointer Go에는 포인터가 있습니다. 포인터는 값의 메모리 주소를 값으로 갖는 타입닙니다.다음과 같이 선언할 수 있습니다. var 변수명 *타입 var p *int 이렇게 선언한 포인터 변수는 다른 변수의 주소값을 저장할 수 있으며 다른 변수의 주소값은 & 연산자를 사용하여 접근할 수 있습니다. import "fmt" func main() { a := 1 var p *int p = &a *p = 20 fmt.Println("p는 pointer 즉 변수 a의 주소를 보관: ", p) fmt.Println("*p는 정수 20을 보관: ", *p) } p는 pointer 즉 변수 a의 주소를 보관: 0xc0000a2040 *p는 정수 20을 보관: 20 위 코드에서 p는 pointer입니다. 그러므로 &a의 결과인 a의 주소를 저장할 수 있습니다. 반면에 *p는 pointer가 아니므로 일반적인 값을 보관합니다. 위 코드를 변경하여 다음을 실행해 봅니다. func main() { a := 1 var p *int p = &a *p = &a fmt.Println("p는 pointer 즉 변수 a의 주소를 보관: ", p) fmt.Println("*p는 정수 20을 보관: ", *p) } # command-line-arguments go_project\const.go:9:7: cannot use &a (value of type *int) as int value in assignment 즉, *p는 포인터가 아니므로 주소를 보관할 수 없다는 에러가 발생합니다. package main import "fmt" func main() { var a int = 10 var p *int fmt.Println(a)//a값 출력 p = &a fmt.Printf...

자료로 부터 beta 분포의 MC simulation을 위한 클래스

다음 클래스는 자료로부터 Beta 분포를 생성하고 이를 몬테카를로 시뮬레이션을 통해 최대 확률을 가진 결과를 반환합니다. class predict_MC: def __init__(self, x): self.x=x def alphaBeta(self): self.uni, self. fq=np.unique(self.x, return_counts=True) self.a=[] self.b=[] for i in range(len(self.fq)): self.a.append(self.fq[i]) self.b.append(np.sum(np.delete(self.fq, i))) return([self.uni, self.fq, self.a, self.b]) def maxP(self): self.u, self.fq, self.a, self.b=self.alphaBeta() self.p_max={} p=np.linspace(0, 1, 100) for i in range(len(self.a)): density=stats.beta.pdf(p, self.a[i], self.b[i]) self.p_max[self.uni[i]]=p[np.argmax(density)] return([self.a, self.b, self.p_max]) def mcSimul(self, n=100000, random=3) : self.u, self.fq, self.a, self.b=self.alphaBeta() sample={} for i in range(len(self.a)): sample[self.uni[i]]=stats.beta.rvs(self.a...

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

베이즈 요인과 사후 확률 소개: 아이디어의 경쟁 베이즈 요인은 한 가설을 다른 가설과 비교하여 타당성을 테스트하는 공식입니다. 결과는 한 가설이 다른 가설보다 몇 배 더 가능성이 높은지 알려줍니다. 데이터(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는 두 가설의 비를 나타내고 있으며 베이스 요인라고 합니다...

사전확률(prior probability)

사전확률 사전확룰과 그 연구를 이해하는 것은 새로운 정보를 과거데이터와 결ㅇ합하여 더 나은 결정을 내리고 정확도를 개선하는 데 도움이 되므로 중요합니다. 사전확률은 베이지안 정리의 기초로 형성되어 새로운 데이터를 이전 데이터와 통합하여 추정의 정확도를 개선할 수 있습니다. 사전 확률 새로운 데이터를 고려하기 전의 사건이나 결과의 초기 평가 또는 우도로 정의됩니다. 즉, 이전 지식이나 경험에 근거하여 우리가 아는 것에 대해 알려 줍니다. 예를 들어 과거 데이터로 부터 한달 중 비오는 날이 30%이라고 가정합니다. 이 데이터를 기반으로 그 달의 임의의 날에 비가 올 확률은 30%가 됩니다. 이 확률이 사전확률이 되며 새로운 데이터를 결합하여 더 정확한 확률을 계산할 수 있습니다. 즉, 사전확률은 머신러닝, 의료진단과 같이 사용 가능한 데이터에서 결정을 내릴 수 있는 다양한 분양한 분야에서 사용됩니다. 또한 사전확률은 새로은 데이터가 제공될 때 마다 신념을 변경하거나 업데이트할 수 있게 해줍니다. 베이지안 통계에서 사전확률 $$\tag{1} P(A|B)=\frac{P(A)P(B|A)}{P(B)}$$ 베이지안 정리인 식 1의 P(A)가 사전확률이며 미래 데이터를 고려하기 전에 사용 가능한 또는 과거 데이터에 기반한 초기 신념을 나타내기 떄문에 중요한 역할을 합니다. P(A|B)는 사후 확률로, 사건 B가 발생했을 때 사건 A가 발생할 확률로 정의됩니다. P(B|A)는 사건 A가 발생했을 때 사건 B가 발생할 확률로 정의되는 우도(likelihood)입니다. P(A)는 사건 B를 고려하기 전에 사건 A가 발생할 초기 확률을 정의하는 사전 확률입니다. P(B)는 모든 상황에서 사건 B가 발생할 총 확률로 정의되는 한계 우도입니다. = $\sum_{\forall} P(B|A)P(A)$ 사전확률의 유형 정보적 사전(informative prior) 양한 정보적 사전(wealy informative prior) ...

사전 확률을 사용한 매개변수 추정

사전 확률을 사용한 매개변수 추정 이메일 전환율 예측 데이터에 따르면 이메일을 여는 처음 다섯 명 중 두 명이 링크를 클릭합니다. 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) ratio=np.linspace(0, 1, 100) pdf=stats.beta.pdf(ratio, 2, 3) decorate_plot("conversion ratio","PDF", f"Beta(2, 3)") plt.plot(ratio, pdf) plt.show() 위 분포에서 95% 신뢰 구간(즉, 실제 전환율이 그 범위 어딘가에 있을 확률 95%)은 더 쉽게 볼 수 있도록 표시되어 있습니다. 이 시점에서 우리의 데이터는 실제 전환율이 0.06에서 0.8 사이일 수 있다고 알려줍니다! 이는 지금까지 우리가 실제로 얻은 정보가 얼마나 적은지를 반영합니다. ci=stats.beta.interval(0.95, 2, 3) print(f"하한: {ci[0].round(3)}, 상한: {ci[1].round(3)}") 하한: 0.068, 상한: 0.806 사전 확률을 사용하여 더 넓은 맥락에서 살펴보기 이 데이터(80% 전환율)는 비현실적으로 보입니다. 더 넓은 맥락을 살펴보겠습니다. 귀하의 블로그와 같은 범주에 나열된 블로그의 경우, 제공...

매개변수 추정 도구: 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...

정규분포

정규분포 사악한 행위에 대한 퓨즈 측정 퓨즈를 설치하고 퓨즈가 타서 18초 안에 탈출할 수 있도록 하는 데 걸리는 시간을 측정합니다. 각 퓨즈가 타서 기록된 시간(초)은 다음과 같습니다. 19, 22, 20, 19, 23. 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) d=np.array([19, 22, 20, 19, 23]) m=d.mean(); m 20.6 s=d.std(); s 1.624807680927192 평균을 계산하면 μ = 20.6이고 표준 편차를 계산하면 σ = 1.62입니다. 정규분포 정규분포는 연속 확률 분포로, 평균과 표준 편차가 주어졌을 때 불확실한 측정값에 대한 가능한 믿음의 강도를 가장 잘 설명합니다. decorate_plot("value","Prob.") value=np.linspace(-5, 5, 1000) st=[0.5, 1, 2] col=['b','r', 'g'] for i, j in zip(st, col): p=stats.norm.pdf(value, 0, i) plt.plot(value, p, color=j, label=f"N(0, {i})") plt.legend(loc="best", labelcolor=...