일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- pytorch
- 취업
- BoostCamp
- FSML
- 백준
- Dialogue System
- Chatbot
- BLEU Score
- multi-head attention
- Transformers
- BELU
- ai-tech
- layer normalization
- GPT-1
- bert
- scaled dot-product attention
- huggingface
- NLP
- KLUE-RE
- Relation Extraction
- boj
- Transformer
- Conversation System
- MT-DNN
- Eliza
- Prompt Tuning with Rules for Text Classification
- KLUE
- beam search
- fine-tuning
- text classification
- Today
- Total
dukim's blog
Probability Density Function and Transformation of Random Variable 본문
Probability Density Function and Transformation of Random Variable
eliza.dukim 2021. 3. 17. 18:37Probability Density Function and Transformation of Random Variable
Contents
- Probability Density Function
- Transformation of Random Variable
- Discrete Random Variable
- Continuous Random Variable
- Example of Transformation
- Non-linear Transformation
- Linear Transformation
- Reference
Probability Density Function(PDF)
실수(real-vaued) 확률변수 $X$가 $(x, x + \delta x)$ 구간의 값을 가지고,
해당 구간의 확률이 $f_X(x)\delta x(\delta x → 0일 경우)$로 주어진다면,
$f_X(x)$를 $X$의 확률밀도함수(PDF)라고 한다. 이때 $x$가 구간 (a, b) 사이의
값을 가질 확률은 다음과 같이 주어진다.
$$
f_X(x \in (a, b)) = \int_{a}^{b}f_X(x)dx
$$
확률밀도함수는 다음 두 조건을 만족한다.
- 모든 $x \in R$에 대하여 $f_X(x) >= 0$
- $\int_{-\infty}^{\infty}f_X(x)dx = 1$
Transformation of Random Variable
- 확률변수의 변환(Transformation)이란 기존의 확률변수 X로부터 새로운 확률변수 Y를 만드는 것
- 확률밀도함수는 야코비안 인자(jacobian factor)로 인해서 비선형 변수 변환시 일반적인 단순 함수와는 다른 방식으로 변환됨.
- 여기서 변수변환은 다음 다음 조건을 만족한다.*
- 변환 함수 $g : Y → X$는 $X$와 $Y$사이에 일대일 대응(또는 전단사(bijective)) 관계가 성립해야한다. 즉 함수 $g$는 역함수가 존재한다. $g^{-1} : X → Y$
어떤 확률변수 $X$와 $Y$의 확률밀도함수가 각각 $f_X(x)$, $f_Y(y)$라 하자. 두 확률변수는 $X = g(Y)$의 비선형 변환을 갖는다고 할 때 두 확률변수는 동일한 확률 분포를 갖는가?
다시 말해, $f_Y$에서 밀도의 최댓값을 주는 $\hat{y}$가 $f_X$에서 밀도의 최댓값을 주는 $\hat{x}$와 $\hat{x} = g(\hat{y})$의 관계로 연관되어 있는가? 아니면 변화하였는가?
(연관되어있다면, 확률밀도가 변수의 선택에 독립적임을 나타내며 동일한 확률밀도를 갖는다, 그렇지 않다면, 확률밀도가 변수의 선택에 종속되어 있음을 나타내며, 서로 다른 확률 밀도를 갖는다)
Discrete random variable & Continuous random variable
사건 $A$가 $x$에 의해 정의되고, 사건 $B$가 $y$에 의해 정의된다고 하자. 변환 함수 $g : Y → X$가 역함수가 존재하는 전단사 함수라 할 때, $x \in A$ 이면 $y = g^{-1}(x) \in B$이고 반대의 경우도 동일하다고 하자. 그러면 $P(A) = P(B)$이고, 일반적인 조건하에서 확률변수 $Y$의 확률밀도함수 $f_Y(y)$를 찾을 수 있다. 이때 확률변수가 이산확률변수인지, 연속확률변수인지에 따라 확률밀도함수가 다르게 변환된다.
Case 1) Discrete random variable
이산확률변수 $x \sim f_X(x)$인 경우를 살펴보자. 이때, $y \sim f_Y(y)$라면, 이 경우는 반드시 아래와 같은 수식으로 표현된다.
$$
\sum_{y \in B}f_Y(y)=\sum_{x \in A}f_X(x).
$$
여기서 $x$를 $y$의 함수로써 $x=g(y)$로 나타내면,
$$
\sum_{y \in B}f_Y(y)=\sum_{y \in B}f_X{g(y)}, \
$$
따라서, $f_Y(y)=f_X{g(y)}.$
Case 2) Continuous random variable
확률변수 $X$의 확률밀도함수 $f_X(x)$로부터 변환 함수 $x=g(y)$를 통해 $Y$의 확률밀도함수 $f_Y(y)$를 얻고자 한다. 아직 변환된 확률밀도함수 $f_Y(y)$를 알 수 없으나, 확률변수 $X$의 확률밀도함수 $f_X(x)$로 표현한 사건 $A$의 확률은 확률변수 $Y$의 확률밀도함수 $f_Y(y)$로 표현한 사건 $B$의 확률과 동일하므로 아래와 같이 표현할 수 있다.
$$
\int_{y \in B}f_Y(y)dy=\int_{x\in A}f_X(x)dx.
$$
여기서 변수 변환법을 사용하여, 위 수식의 우변에서 $x$를 $y$에 대한 함수로써 아래와 같이 표현할 수 있다.
$$
\begin{align}
\int_{y\in B}f_Y(y)dy &= \int_{y \in B}f_X{g(y)}\left|\frac{dx}{dy}\right|dy \
&=\int_{y \in B}f_X{g(y)}\left|g'(y)\right|dy \
\end{align}
$$
따라서, $f_Y(y)$는 다음과 같다.
$$
f_Y(y)=f_X{g(y)}|g'(y)|
$$
연속확률변수에서 변환을 통해 얻어진 확률밀도함수 $f_Y(y)$는 합성함수 $f_X { g(y) }$와 같지 않다. 여기서 추가로 곱해진 $|g'(y)|$를 야코비안 인자(Jacobian Factor) 라 한다. 야코비안 인자는 확률밀도함수의 변환 전과 후의 적분 구간의 넓이가 같도록 scaling 해주는 역할을 한다. 야코비안 인자로 인해서 비선형 변환 시에 확률밀도함수$f_Y(y)$의 값이 $f_X{g(y)}$와는 다르게 변화한다.
Note 1 만약 $y = g^{-1}(x)$가 단조 감소하는 변환이면, $dx/dy < 0$이고, $f_X{g(y)} > 0$ 이므로, $f_X{g(y)}dx/dy < 0$이 되어 확률밀도함수일 조건($f_X(x) >= 0$)을 만족하지 못 한다. 따라서 이 경우에 y축 부호를 양의 방향으로 바꾸기 위해 절대값을 씌운 $|dx/dy| > 0$로 대체한다.
Note 2 변환 $x = g(y)$를 $y$에 대해 미분하면 $dx/dy = g'(y)$
Example of Transformation
- 확률변수 $X$의 확률분포 $X \sim N(6, 1^{2})$로부터 5천개의 샘플을 추출한 후,
변수 변환을 이용해 샘플링된 확률변수 $Y$의 값을 구한다. - $\hat{x} = g(\hat{y})$ 관계($y$의 최댓값 위치가 변환된 최댓값을 결정)를 유지하고 있는지 살펴본다.
1. Non-linear Transformation
- 비선형 변환 함수: $ x = g(y) = ln(y) - ln(1 - y) + 5$
- $g(y)$의 역함수 $y=g^{-1}(x) = \frac{1}{1+exp(-x+5)}$인 sigmoid 함수
- 정의역 $Y = { y \in \mathbb{R} | 0 \le y \le 1 }$
- 치역 $X = { x \in \mathbb{R}| -\infty \lt x \lt \infty}$
- $g'(y) = \frac{dx}{dy} = \frac{1}{y-y^{2}}$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate
from scipy.stats import rv_continuous
from matplotlib.patches import Polygon
def g(y):
'''x = g(y)'''
return np.log(y) - np.log(1. - y) + 5
def g_inv(x):
'''y = g^(-1)(x)'''
return 1 / (1 + np.exp(- x + 5))
class f_X_gen(rv_continuous):
'''f_X(x) dist for R.V. X'''
mu = 6.
sig = 1.
def gaussian(self, x):
return (1 / np.sqrt(2*np.pi*(self.sig**2)))*np.exp( -(1/2*(self.sig**2))*(x-self.mu)**2 )
def _pdf(self, x):
return self.gaussian(x)
class f_Y_gen(rv_continuous):
'''f_Y(y) dist for R.V. Y'''
mu = 6.
sig = 1.
def __init__(self):
rv_continuous.__init__(self, a=0.0, b=1.0)
def gaussian(self, x):
return (1 / np.sqrt(2*np.pi*(self.sig**2)))*np.exp( -(1/2*(self.sig**2))*(x-self.mu)**2 )
def g(self, y):
'''x = g(y)'''
return np.log(y) - np.log(1. - y) + 5
def g_prime(self, y):
return 1 / (y - y ** 2)
def g_inv(self, x):
'''y = g^(-1)(x)'''
return 1 / (1 + np.exp(- x + 5))
def g_inv_prime(self, x):
return self.g_inv(x)*(1 - self.g_inv(x))
def _pdf(self, y):
return np.multiply(self.gaussian(self.g(y)),
np.abs(self.g_prime(y)))
# Setting up the figure & font size
fig_size = plt.rcParams["figure.figsize"]
fig_size = (15, 10)
plt.rcParams["figure.figsize"] = fig_size
font = {'size' : 20,}
# Setting up X, Y
N = 5000
mu, sig = 6., 1.
X = f_X_gen()
Y = f_Y_gen()
x = np.linspace(0, 10, 100)
y = g_inv(x)
x_hat = 6.
y_hat = g_inv(x_hat)
X_sample = X.rvs(size=N)
Y_sample = Y.rvs(size=N)
fig, ax2 = plt.subplots(1, 1)
ax2.plot(x, X._pdf(x), 'r')
ax2.plot(x, y)
ax2.plot(Y._pdf(y), y, 'm')
ax2.text(7.5, 0.85, r'$y=g^{-1}(x)$', color='orange', fontdict=font)
ax2.text(1.8, 0.65, r'$f_Y(y)$', color='m', fontdict=font)
ax2.text(2.0, 0.4, r'$f_X(g(y))$', color='green', fontdict=font)
ax2.text(7.3, 0.2, r'$f_X(x)$', color='r', fontdict=font)
# 극점 있는 점선 그리기
ax2.plot((x_hat, x_hat), (X.gaussian(x_hat), g_inv(x_hat)), 'y--')
ax2.plot((g_inv(X.gaussian(x_hat)), x_hat), (y_hat, y_hat), 'y--')
# # 극점 그리기
ax2.plot(x_hat, X.gaussian(x_hat), 'ro')
ax2.plot(x_hat, y_hat, 'ro')
ax2.hist(X_sample, 40, density=1, facecolor='r', alpha=0.5, edgecolor='r')
ax2.hist(Y_sample, 40, density=1, facecolor='m', alpha=0.5, edgecolor='m',
orientation='horizontal')
ax2.set_xlim(0, 10)
ax2.set_xlabel('x', fontsize=20)
# # 적분 구간 음영 f_X(x)
ix = np.linspace(5.5, 6.5)
iy = X._pdf(ix)
verts = [(5.5, 0)] + list(zip(ix, iy)) + [(6.5, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.6', alpha=0.5)
ax2.add_patch(poly)
# # 적분 구간 음영 f_Y(y)
ix = np.linspace(g_inv(5.5), g_inv(6.5))
iy = Y._pdf(ix)
verts = [(0, g_inv(5.5))] + list(zip(iy, ix)) + [(0, g_inv(6.5))]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.6', alpha=0.5)
ax2.add_patch(poly)
ax3 = ax2.twiny()
ax3.plot(X.gaussian(g(y)), y, 'g')
ax3.plot(Y.gaussian(g(y_hat)), y_hat, 'ro')
ax3.set_ylim(0, 1)
ax3.set_xlim(0, 1)
ax2.set_ylabel('Y', fontsize=20)
plt.show()
|
cs |
위 그래프는 가로축이 $x$, 세로축이 $y$인 좌표평면에 $f_X(x)$와 $f_Y(y)$의 확률밀도함수, 그리고 변환 $g$의 역함수 $y=g^{-1}(Z)$와 합성함수 $f_X{g(y)}$를 그린 것이다. $X$의 확률밀도함수 $f_X(x)$의 극점 $\hat{x}$는 $Y$의 실제 확률밀도함수 $f_Y(y)$의 극점 $\hat{y}$와 $\hat{x} = g(\hat{y})$의 관계를 갖지 않는다.
또한 음영처리된 부분은 X에서의 사건 A와 이에 대응되는 Y에서의 사건 B의 확률인데, 두 부분의 면적은 동일하다. 야코비안 인자는 변환된 두 확률밀도함수의 적분 구간의 면적이 동일하도록 scaling하는 역할을 한다.
2. Linear Transformation
- 선형 변환 함수: $ x = g(y) = 5y - 5$
- $g(y)$의 역함수 $y = g^{-1} = \frac{1}{5} x + 1$
- 정의역 $Y = { y \in \mathbb{R}| -\infty \le x \le \infty}$
- 치역 $X = { x \in \mathbb{R} | -\infty \lt x \lt \infty }$
- $g'(y)$: $\frac{dx}{dy} = \frac{1}{5}$
- $g(y)$의 역함수 $y = g^{-1} = \frac{1}{5} x + 1$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
def g(y):
'''x = g(y)'''
return 5*y - 5
def g_inv(x):
'''y = g^(-1)(x)'''
return (1 / 5)*x + 1
class f_X_gen(rv_continuous):
'''f_X(x) dist for R.V. X'''
mu = 6.
sig = 1.
def gaussian(self, x):
return (1 / np.sqrt(2*np.pi*(self.sig**2)))*np.exp( -(1/2*(self.sig**2))*(x-self.mu)**2 )
def _pdf(self, x):
return self.gaussian(x)
class f_Y_gen(rv_continuous):
'''f_Y(y) dist for R.V. Y'''
mu = 6.
sig = 1.
def __init__(self):
rv_continuous.__init__(self)
def gaussian(self, y):
return (1 / np.sqrt(2*np.pi*(self.sig**2)))*np.exp( -(1/2*(self.sig**2))*(y-self.mu)**2 )
def g(self, y):
'''x = g(y)'''
return 5*y - 5
def g_prime(self, y):
return 5
def g_inv(self, x):
'''y = g^(-1)(x)'''
return 0.2*x + 1
def g_inv_prime(self, x):
return 0.2
def _pdf(self, y):
return np.multiply(self.gaussian(self.g(y)),
np.abs(self.g_prime(y)))
# Setting up the figure & font size
fig_size = plt.rcParams["figure.figsize"]
fig_size = (15, 10)
plt.rcParams["figure.figsize"] = fig_size
font = {'size' : 20,}
# Setting up X, Y
N = 5000
mu, sig = 6., 1.
X = f_X_gen()
Y = f_Y_gen()
x = np.linspace(0, 10, 100)
y = g_inv(x)
x_hat = 6.
y_hat = g_inv(x_hat)
X_sample = X.rvs(size=N)
Y_sample = Y.rvs(size=N)
fig, ax2 = plt.subplots(1, 1)
ax2.plot(x, X._pdf(x), 'r')
ax2.plot(x, y)
ax2.plot(Y._pdf(y), y, 'm')
ax2.text(7.5, 2.4, r'$y=g^{-1}(x)$', color='orange', fontdict=font)
ax2.text(1.8, 2.3, r'$f_Y(y)$', color='m', fontdict=font)
ax2.text(2.2, 2.5, r'$f_X(g(y))$', color='green', fontdict=font)
ax2.text(7.3, 0.2, r'$f_X(x)$', color='r', fontdict=font)
# 극점 있는 점선 그리기
ax2.plot((x_hat, x_hat), (X.gaussian(x_hat), g_inv(x_hat)), 'y--')
ax2.plot((g_inv(X.gaussian(x_hat)), x_hat), (y_hat, y_hat), 'y--')
# # # 극점 그리기
ax2.plot(x_hat, X.gaussian(x_hat), 'ro')
ax2.plot(x_hat, y_hat, 'ro')
ax2.hist(X_sample, 40, density=1, facecolor='r', alpha=0.5, edgecolor='r')
ax2.hist(Y_sample, 200, density=1, facecolor='m', alpha=0.5, edgecolor='m',
orientation='horizontal')
ax2.set_xlim(0, 10)
ax2.set_ylim(0, 3)
ax2.set_xlabel('x', fontsize=20)
# # # 적분 구간 음영 f_X(x)
ix = np.linspace(5.5, 6.5)
iy = X._pdf(ix)
verts = [(5.5, 0)] + list(zip(ix, iy)) + [(6.5, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.6', alpha=0.5)
ax2.add_patch(poly)
# # # 적분 구간 음영 f_Y(y)
ix = np.linspace(g_inv(5.5), g_inv(6.5))
iy = Y._pdf(ix)
verts = [(0, g_inv(5.5))] + list(zip(iy, ix)) + [(0, g_inv(6.5))]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.6', alpha=0.5)
ax2.add_patch(poly)
ax3 = ax2.twiny()
ax3.plot(X.gaussian(g(y)), y, 'g')
ax3.plot(Y.gaussian(g(y_hat)), y_hat, 'ro')
ax3.set_ylim(0, 3)
ax3.set_xlim(0, 1)
ax2.set_ylabel('Y', fontsize=20)
plt.show()
|
cs |
선형 변환의 경우에는 $f_X(x)$의 극점과 $f_Y(y)$의 두 극점이 동일함을 알 수 있다. $X$의 확률밀도함수 $f_X(x)$의 극점 $\hat{x}$는 $Y$의 실제 확률밀도함수 $f_Y(y)$의 극점 $\hat{y}$와 $\hat{x} = g(\hat{y})$의 관계를 갖지 않는다 ($f_X{g(y)}$가 $f_Y(y)$의 값보다 2배 더 크다). 그러나 변환 전과 후의 각 분포에서 극점의 위치는 변수 변환과 동일하게 변경된다. 즉 $f_X(x)$에서의 최댓값 $\hat{x}$를 알면 $f_Y(y)$에서의 최댓값을 갖게하는 $\hat{y}$를 $g^{-1}(\hat{x})$을 통해 구할 수 있다.