기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[data analysis] 감마분포(Gamma Distribution)

감마분포(Gamma Distribution)

확률은 전체 경우의 수 중에서 특정 시건의 비율이므로 확률을 계산하는데 있어 전체 경우의 수를 산정하는 것이 중요합니다. 이산변수의 경우 전체 경우의 수는 계승(factorial)을 사용하여 계산합니다. 연속변수의 경우에서 랜덤변수는 셀수 있는 수가 아니므로 계승을 직접적으로 사용할 수 없습니다. 대신에 계승에 대응하는 적분식을 사용하는데 이 부분을 감마함수(식 1)로 대체할 수 있습니다. 감마함수를 기본으로 하는 감마분포는 지수 분포와 정규분포와 관련된 분포입니다.

감마함수

Γ(x)로 나타내는 감마함수는 양의 정수 영역에서 factorial 함수의 형태를 가지며 식 1과 같이 정의합니다. 이 식의 첫번째는 이산변수, 두번째는 연속변수를 위한 함수입니다.

\begin{align}\tag{1} \Gamma(n)&=(n-1)! , \quad\quad n \in \{1,2,3, \cdots \}\\ &=(n-1)\Gamma(n-1)\\ &=\int^n_0 x^{n-1}e^{-x} ,\quad n > 0 \end{align}(식 1)

예 1)

n = 10인 이산변수와 연속변수의 factorial과 감마함수를 계산합니다.

factorial은 numpy 또는 scipy의 math 모듈의 factorial()함수로 계산할 수 있으며 위의 감마함수는 scipy.special의 gamma() 함수로 계산할 수 있습니다. 또한 이 계산은 sympy 패키지의 symbol()함수와 intergrate()함수를 사용하여 수행할 수 있습니다.

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
from scipy import stats
from sympy import *
np.math.factorial(10-1)
362880
from scipy import special
special.gamma(10)
362880.0
x=symbols('x')
g=x**9*exp(-x)
gam=g.integrate((x, 0, oo))
gam
362880

감마함수의 형태는 그림 1과 같습니다.

그림 1. 감마함수.
x=np.linspace(0.1, 4.1, 100)
y=scipy.special.gamma(x)
plt.figure(figsize=(4,3))
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel(r"$\Gamma(x)$")
plt.show()

식 2와 같이 연속변수의 전체 표본공간을 감마함수(Γ(α))로 계산하는 확률밀도함수를 따르는 분포를 감마분포라고 합니다. 결과적으로 감마분포는 감마함수에 역비례인 분포로서 모수 α (전체발생수)λ(단위 시간당 평균발생수)에 의해 특정됩니다.

\begin{align}f(x) &=\frac{\lambda^\alpha x^{\alpha-1} \exp(-\lambda x)}{\Gamma(\alpha)}\\& \alpha,\, \lambda\, x \gt 0 \end{align}(식 2)

이 분포를 따르는 연속랜덤변수는 식 3과 같이 나타냅니다.

X ~ Gamma(α, λ)(식 3)

만약 α = 1인 경우 감마분포의 PDF는 식 4와 같이 지수 분포의 확률밀도함수와 같게 됩니다.

\begin{align}f(x)_{\text{Gamma} (1, λ)} &= λ \exp(-λx)\\&=f(x)_{\text{Exponential}(\lambda)}\end{align}(식 4)

감마분포는 scipy.stats.gamma() 클래스를 사용하여 다양한 통계량을 계산할 수 있습니다. 예로서 감마분포의 확률밀도함수는 stats.gamma.pdf(x, a, loc=0, scale=1)를 사용하여 계산합니다. 이 메서드의 'a'는 α를 의미하고 분포의 이동과 규모는 매개변수 "loc"과 "scale"로 지정됩니다. 표준화된 데이터의 경우 "loc"과 "scale"은 0과 1이며 위 메소드의 기본값입니다. 분포의 규모를 나타내는 "scale"은 자료의 표준편차와 관련된 인수로서 표준화되지 않은 자료의 경우 $\text{scale} = \frac{1}{\lambda}$로 지정합니다. 즉, 감마함수의 모수인 λ는 분포의 scale에 영향을 주는 인자 입니다. 그림 2는 감마분포에서의 모수 α와 λ의 영향을 나타낸 것입니다.

그림 2. 감마분포의 모수 (a)α, (b)λ의 영향.
x=np.linspace(0, 20, 1000)
ab=[1, 3,5,7]
col=['g','b','r','k']
fig, (ax1, ax2)=plt.subplots(nrows=1, ncols=2, figsize=(8, 3))
for i, j in zip(col, ab):
    y=stats.gamma.pdf(x, j, 1)
    ax1.plot(x, y, color=i, label=f"Gamma({j}, 1)")
    y2=stats.gamma.pdf(x, 10, 0, 1/j)
    ax2.plot(x, y2, color=i, label=f"Gamma(10, {j})")
ax1.set_xlabel("x\n(a)", loc="center" , size="12")
ax1.set_ylabel("pdf")
ax1.legend(loc="best")
ax2.set_xlabel("x\n(b)", loc="center", size="12" )
ax2.legend(loc="best")
plt.show()

그림 2에서 나타낸 것과 같이 α가 1인 경우는 지수분포가 되며 α가 증가할수록 정규분포에 근사함을 알 수 있습니다. 이것은 샘플수가 증가하면 정규분포를 근접한다는 중심극한정리에 부합합니다. 또한 λ의 증가로 데이터의 퍼짐이 넓어지는 것으로 분포의 형태를 결정하는 인자가 됩니다.

감마분포의 확률밀도함수를 사용하여 계산한 평균과 분산은 각각 식 5와 같이 정의합니다.

\begin{align}E(X)&=\int^\infty_0 x\frac{\lambda^\alpha x^{\alpha -1}\exp(-\lambda x)}{\Gamma(\alpha)}\, dx\\ &=\int^\infty_0 \frac{\lambda^\alpha}{\Gamma(\alpha)} x^\alpha \exp(-\lambda x)\, dx\\ &= \int^\infty_0 \frac{\alpha \lambda^{\alpha+1}}{\Gamma(\alpha+1)\lambda}x^\alpha \exp(-\lambda x)\\ &=\frac{\alpha}{\lambda}\int^\infty_0 f(x)\, dx\\&=\frac{\alpha}{\lambda}\\\\ E(X^2)&=\int^\infty_0 x^2\frac{\lambda^\alpha x^{\alpha -1}\exp(-\lambda x)}{\Gamma(\alpha)}\, dx\\ &=\int^\infty_0 \frac{\lambda^\alpha}{\Gamma(\alpha)} x^{\alpha+1} \exp(-\lambda x)\, dx\\ &= \int^\infty_0 \frac{\alpha \lambda^{\alpha+2}}{\Gamma(\alpha+1)\lambda^2}x^{\alpha+1} \exp(-\lambda x)\\ &=\frac{\alpha(\alpha+1)}{\lambda^2}\int^\infty_0 f(x)\, dx\\&=\frac{\alpha(\alpha+1)}{\lambda^2}\\\\ \text{Var}(x)&=E(X^2) -(E(X))^2\\&=\frac{\alpha(\alpha+1)}{\lambda^2}-\left(\frac{\alpha}{\lambda}\right)^2\\&=\frac{\alpha}{\lambda^2}\end{align} (식 5)
a, l, x=symbols("alpha, lambda, x", positive=True)
f=l**a*x**(a-1)*exp(-l*x)/gamma(a); f

$\frac{\lambda^{\alpha} x^{\alpha - 1} e^{- \lambda x}}{\Gamma\left(\alpha\right)}$

E=simplify(integrate(x*f,(x, 0, oo)));E

$\frac{\alpha}{\lambda}$

E2=simplify(integrate(x**2*f,(x, 0, oo)));E2

$\frac{\alpha \left(\alpha + 1\right)}{\lambda^{2}}$

var=E2-E**2
simplify(var)

$\frac{\alpha}{\lambda^{2}}$

예 2)

시료 분석기기에 예비용을 포함하여 2개의 퓨즈를 포함하고 있습니다. 일반적으로 이 퓨즈는 최대 50시간이 유지되어야 합니다. 그러나 퓨즈 제조사로부터의 사양은 각 100시간에 1번 끈어진다고 보고하고 있습니다. 두 퓨즈가 50시간 동안 유지 되지 않을 확률?

정해진 기간동안 사건의 평균 발생수는 λ = 0.01 hour-1 입니다. 또한 두 번째 휴즈가 고장 날 때까지 경과 시간을 랜덤변수를 X라고하면 전체 발생수인 α = 2와 λ를 모수로하는 감마분포(X ~ Gamma (2, 0.01))로 나타낼 수 있습니다.

이 예는 P(X ≤ 50)을 계산하는 것과 같습니다.

round(stats.gamma.cdf(50, 2, scale=1/0.01),4)
0.0902

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b