#1. 삼점추정과 삼각분포
어떤 확률변수가 있는데 그것의 자세한 분포를 모를 때, 흔히 삼점추정(Three-point Estimation; 三点估计)으로 해결하곤 한다. 삼점이란, 관측값의 최소, 최대, 최빈값을 의미한다. 즉, 확률변수가 가질 수 있는 양극단의 값 $a$, $b$와 가장 많이 등장하는 관측값 $c$로 분포를 묘사하는 것이다.
note: 예를 들어, 가게의 한 달 매출 $X$가 $x$이상일 확률을 추정하고 싶을 때, 우선 과거의 경험에 비추어 $X$의 범위를 설정한다. 여기서 $a$와 $b$가 결정된다. 그리고 최고봉에서 매출이 얼마나 나왔는지에 따라 $c$가 결정된다. 그러면 $P(X\ge x)=1-P(X<x)$이고, $P(X<x)=\int_{-\infty}^{x}f_X(x;a,b,c)\space dx$이므로 원하는 확률을 추정할 수 있게 된다.
위 그림은 삼점추정에 의해 그려진 그래프로, 이러한 그래프를 갖는 분포를 삼각분포(Triangular Distribution; 三角分布)라고 한다. 삼각분포의 기호는 따로 없고, 확률밀도는 다음과 같이 주어진다.
$$
f_X(x;a,b,c)=
\begin{cases}
\frac{2}{b-a}\cdot\frac{x-a}{c-a},&a\le x<c
\\
\frac{2}{b-a},&x=c
\\
\frac{2}{b-a}\cdot\frac{b-x}{b-c},&c<x\le b
\\
0,&\mathrm{otherwise}
\end{cases}
$$
식이 복잡해보이지만 늘 그래왔듯이 직접 유도하면 전혀 복잡하지 않다. 핵심은 PDF아래 면적이 1임을 이용하는 것이다. 이것도 자주 써왔던 테크닉이다.
#2. 대칭삼각분포와 균등분포의 합성곱
한편, 최빈값 $c$가 구간 $[a,b]$의 정중앙에 위치하면, 다시말해 $c=\frac{a+b}{2}$이면 삼각분포는 직선 $x=c$에 관해 대칭이며, 이를 대칭삼각분포(Symmetric Triangular Distribution; 对称三角分布)라고 한다. 대칭삼각분포는 대칭성 외에도 아주 중요하고 재미있는 성질이 하나 있는데, 바로 두 균등분포의 합성곱으로 나타낼 수 있다는 것이다.
이 사실을 보이기 위해, 먼저 ‘두 주사위 눈의 합이…일 확률을 구하는 문제’를 생각해보자. 이 문제는 기초수학에서 흔히 등장하는 단순한 문제이지만 아주 심오한 뜻을 담고있다. 두 주사위의 눈을 각각 확률변수 $X$와 $Y$로 두고, 그것의 합을 $Z=X+Y$라고 하자.
$X$는 1부터 6까지의 값을 같은 가능성으로 갖는다. 따라서 $X\sim\mathrm{U}[1,6]$이라고 할 수 있다. 본래 균등분포는 연속확률변수에 대해서 정의되는 것이지만, 사실 이렇게 이산적인 균등분포를 정의해도 아무런 문제가 없다. 같은 방식으로 $Y\sim\mathrm{U}[1,6]$이다. 그렇다면 합성곱의 정의에 의해 다음이 성립한다.
$$
Z=X+Y\sim\mathrm{U}[1,6]\ast\mathrm{U}[1,6]
$$
확률질량함수 $f_Z(z)$를 구해보자. 직접 $X$와 $Y$를 나열하고, 그것의 합 $Z$를 계산하여 나열한다. $Z$는 36개의 값을 가진다. 그런데 과연 이 36개의 값이 같은 빈도로 나왔을까? 아니다. 분명히 7이라는 숫자가 6회로 가장 많고, 그 다음은 6과 8이 각각 5회의 빈도로 등장한다. 그 다음으로는 5와 9이고, 총 4회 등장한다. 이런식으로 세다 보면, 2와 12가 각각 1회씩 등장하는 것으로 마무리된다. 이제 이 사실을 다음과 같이 보기 좋게 정리해보자.
그림을 보면, $Z$의 분포는 대칭삼각분포임을 알 수 있다. 한편, 구간을 바꾸어 $\mathrm{U}[1,4]$와 $\mathrm{U}[2,5]$의 합성곱을 구해도 여전히 대칭삼각분포이다.
#3. 사다리꼴 분포
그렇다면 임의의 두 균등분포를 합성곱하면 대칭삼각분포를 얻을 수 있을까? 다음 그림을 보면 그렇지 않다라는 사실을 알 수 있다.
이렇게 생긴 분포는 사다리꼴 분포(Trapezoidal Distribution; 梯形分布)라고 하며, 여기서는 그중에서도 특수한 대칭사다리꼴 분포를 얻었다. 대칭삼각분포와 다른 이유는, 합성곱을 이루는 두 균등분포의 ‘구간의 길이가 다르다’는 데 있다.
다시 말해 두 균등분포를 합성곱할 때, 구간의 길이가 같다면 대칭삼각분포를 얻고, 다르다면 대칭사다리꼴분포를 얻는다. 또 하나 중요한 사실은 항상 대칭인 분포를 얻는다는 것이다.
일반적인 사다리꼴 분포의 PDF도 삼각분포와 비슷한 방식으로 구할 수 있다.
$$
f_X(x;a,b,c,d)=
\begin{cases}
\frac{2}{b-a+d-c}\cdot\frac{x-a}{c-a},&a\le x<c
\\
\frac{2}{b-a+d-c},&c\le x\le d
\\
\frac{2}{b-a+d-c}\cdot\frac{b-x}{b-d},&d<x\le b
\\
0,&\mathrm{otherwise}
\end{cases}
$$
#4. 균등분포 합성곱의 Python 구현
#4-1. np.convolve()
Python에서 합성곱은 np.convolve(fx,fy)로 구현할 수 있는데, fx와 fy자리에는 array 또는 list가 들어가는 점을 주의해야 한다.
예를 들어 정상적인 주사위의 눈 $X$와 홀수만 나오도록 조작된 주사위의 눈 $Y$의 합 $Z=X+Y$의 분포를 np.convolve(fx,fy)로 구하는 문제를 생각해보자. 이 경우 이산확률변수 $X$와 $Y$의 분포는 다음과 같이 표현된다.
$$ X\sim \left[ {\begin{array}{} 1&2&3&4&5&6 \\ \frac{1}{6}&\frac{1}{6}&\frac{1}{6}&\frac{1}{6}&\frac{1}{6}&\frac{1}{6} \end{array}} \right] \\[2ex] Y\sim \left[ {\begin{array}{} 1&2&3&4&5&6 \\ \frac{1}{3}&0&\frac{1}{3}&0&\frac{1}{3}&0 \end{array}} \right] $$
분포행렬의 제1행은 확률변수의 관측값이고 제2행은 각 관측값을 가질 확률질량이다. np.convolve()는 2행인 확률질량만을 입력으로 받는다. 따라서 이 문제를 해결하기 위해서는 다음과 같은 코드를 실행시켜야 한다. (각 확률질량 값은 소수점 3자리만 남긴다.)
import numpy as np
fx = np.array([round(i / 6, 3) for i in [1, 1, 1, 1, 1, 1]])
fy = np.array([round(i / 3, 3) for i in [1, 0, 1, 0, 1, 0]])
fz = np.array([round(i, 3) for i in np.convolve(fx, fy)])
print("fx = %s" % fx)
print("fy = %s" % fy)
print("fz = %s" % fz)
코드를 실행시키면 다음과 같은 결과를 얻는다.
fx = [0.167 0.167 0.167 0.167 0.167 0.167]
fy = [0.333 0. 0.333 0. 0.333 0. ]
fz = [0.056 0.056 0.111 0.111 0.167 0.167 0.111 0.111 0.056 0.056 0. ]
결과물인 fz가 어떻게 나왔는지 쉽게 와닿지 않는다. 그렇다면 직접 손으로 계산하며 어떻게 .convolve() 매서드가 작동하는지 알아보기로 하자. 두 신호의 합성곱은 어느 하나를 뒤집어서 겹치는 면적(=확률)을 계산한 것임을 알고있다. 여기서는 fy를 뒤집기로 하자. 이제 fx와 fy를 조금씩 겹쳐가며 fz를 계산해보자. np.convolve()는 대략 다음과 같은 방식으로 작동한다는 사실을 알 수 있다.
$$ Z\sim \left[ {\begin{array}{} 2&3&4&5&6&7&8&9&10&11&12 \\ \frac{1}{18}&\frac{1}{18}&\frac{1}{9}&\frac{1}{9}&\frac{1}{6}&\frac{1}{6}&\frac{1}{9}&\frac{1}{9}&\frac{1}{18}&\frac{1}{18}&0 \end{array}} \right] $$
#4-2. 균등분포의 합성곱 구현
np.convolve() 매서드의 작동원리를 참고해서 두 균등분포의 합성곱을 구해보고, 그래프도 그려보자. $\mathrm{U}[2,4]$와 $\mathrm{U}[3,6]$의 합성곱을 예시로 들어보자.
<hide/>
import numpy as np
import matplotlib.pyplot as plt
n = 6
x = np.arange(1, n + 1, 1)
y = np.arange(1, n + 1, 1)
z = np.arange(2, 2 * n + 1, 1)
def uniform(a, b):
distr = []
name = "U[%s" % a + ",%s]" % b
length = b - a + 1
while len(distr) < n:
distr.append(1)
for i in range(n + 1):
if a <= i <= b:
distr[i - 1] = 1
else:
distr[i - 1] = 0
return np.array(distr), name, length
fx, fxname, fxlength = uniform(2, 4)
fy, fyname, fylength = uniform(3, 6)
fz = np.convolve(fx, fy)
print("fx = %s" % fx + "/%s" % fxlength)
print("fy = %s" % fy + "/%s" % fylength)
print("conv(fx,fy) = %s" % fz + "/(%s" % fxlength + "*%s)" % fylength)
fig, ax = plt.subplots(3, 1)
ax[0].stem(
x,
[i / fxlength for i in fx],
label="%s" % fxname,
linefmt="red",
basefmt=" ",
)
ax[0].set_xticks(x)
ax[0].set_yticks([round(i / fxlength, 2) for i in fx])
ax[1].stem(
y,
[i / fylength for i in fy],
label="%s" % fyname,
linefmt="blue",
basefmt=" ",
)
ax[1].set_xticks(y)
ax[1].set_yticks([round(i / fylength, 2) for i in fy])
ax[2].stem(
z,
[i / (fxlength * fylength) for i in fz],
label="%s" % fxname + "*%s" % fyname + "\n(Convolution)",
linefmt="purple",
basefmt=" ",
)
ax[2].set_xticks(z)
ax[2].set_yticks([round(i / (fxlength * fylength), 2) for i in fz])
for i in range(3):
ax[i].legend(loc="upper right")
ax[i].set_xlim(0, 2 * n + 3)
plt.show()
실행 결과:
fx = [0 1 1 1 0 0]/3
fy = [0 0 1 1 1 1]/4
conv(fx,fy) = [0 0 0 1 2 3 3 2 1 0 0]/(3*4)
'확률론과 수리통계' 카테고리의 다른 글
평균과 기댓값 (0) | 2022.12.27 |
---|---|
Irwin-Hall 분포 (0) | 2022.12.25 |
확률변수의 최대, 최소의 분포 (0) | 2022.12.09 |
확률변수의 사칙연산의 분포 (0) | 2022.12.08 |
합성곱 (0) | 2022.12.01 |