dukim's blog

Probability Density Function and Transformation of Random Variable 본문

ML&DL

Probability Density Function and Transformation of Random Variable

eliza.dukim 2021. 3. 17. 18:37

Probability 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
$$
확률밀도함수는 다음 두 조건을 만족한다.

  1. 모든 $x \in R$에 대하여 $f_X(x) >= 0$
  2. $\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 = (1510)
plt.rcParams["figure.figsize"= fig_size
font = {'size' : 20,}
 
# Setting up X, Y
= 5000
mu, sig = 6.1.
 
= f_X_gen()
= f_Y_gen()
 
= np.linspace(010100)
= 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(11)
 
ax2.plot(x, X._pdf(x), 'r')
ax2.plot(x, y)
ax2.plot(Y._pdf(y), y, 'm')
ax2.text(7.50.85, r'$y=g^{-1}(x)$', color='orange', fontdict=font)
ax2.text(1.80.65, r'$f_Y(y)$', color='m', fontdict=font)
ax2.text(2.00.4,  r'$f_X(g(y))$', color='green', fontdict=font)
ax2.text(7.30.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(010)
ax2.set_xlabel('x', fontsize=20)
 
# # 적분 구간 음영 f_X(x)
ix = np.linspace(5.56.5)
iy = X._pdf(ix)
verts = [(5.50)] + list(zip(ix, iy)) + [(6.50)]
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(01)
ax3.set_xlim(01)
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}$
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*- 5
 
def g_inv(x):
    '''y = g^(-1)(x)'''
    return (1 / 5)*+ 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*- 5
    
    def g_prime(self, y):
        return 5
    
    def g_inv(self, x):
        '''y = g^(-1)(x)'''
        return 0.2*+ 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 = (1510)
plt.rcParams["figure.figsize"= fig_size
font = {'size' : 20,}
 
# Setting up X, Y
= 5000
mu, sig = 6.1.
 
= f_X_gen()
= f_Y_gen()
 
= np.linspace(010100)
= 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(11)
 
ax2.plot(x, X._pdf(x), 'r')
ax2.plot(x, y)
ax2.plot(Y._pdf(y), y, 'm')
ax2.text(7.52.4, r'$y=g^{-1}(x)$', color='orange', fontdict=font)
ax2.text(1.82.3, r'$f_Y(y)$', color='m', fontdict=font)
ax2.text(2.22.5,  r'$f_X(g(y))$', color='green', fontdict=font)
ax2.text(7.30.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(010)
ax2.set_ylim(03)
ax2.set_xlabel('x', fontsize=20)
 
# # # 적분 구간 음영 f_X(x)
ix = np.linspace(5.56.5)
iy = X._pdf(ix)
verts = [(5.50)] + list(zip(ix, iy)) + [(6.50)]
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(03)
ax3.set_xlim(01)
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})$을 통해 구할 수 있다.


Reference

Comments