데이터 과학/확률론

다변량 가우시안 분포(Multivariate Gaussian Distribution)

EastHoon 2021. 2. 12. 17:35

1. Multivariate Gaussian Distribution

2. Multivariate Gaussian Distribution 특징

3. Multivariate Gaussian Distribution의 활용

4. 코드


1. Multivariate Gaussian Distribution

일차원의 정규 분포를 다차원으로 확장 시킨 개념

- 평균값을 중심으로 군집화 되어 있는 '상관 관계있는' 랜덤 변수 집합을 설명하는데 자주 사용된다.

- $N(\mu, \Sigma)$

- $\mu \in R^k$  :  위치

- $\Sigma \in R^{k \times k} $ : 공분산

 

정리하자면,

K차원의 랜덤벡터 $ X = (X_1, ... , X_k)^T $ 의 다변량 정규 분포는 다음과 같이 표현할 수 있다.

 

 

(D는 데이터 차원을 뜻한다) (여기서는 D = k)

혹은 수식을 걷어내고 아래와 같이 표현한다.

그리고, 평균과 공분산. 

 

2. Multivariate Gaussian Distribution 특징

- 공분산 행렬 값으로 분포의 크기를 조정할 수 있다. 다만, 부피의 합은 1이므로, 분포 크기가 커지면 높이는 낮아진다.

- 대각선 값으로 X, Y 분포 혹은 대각 방향으로 분포 정도를 조절할 수 있다. 음수면 반대쪽으로 성향을 가진다.

- (우상향) 대각선은 두 분포간의 상관성(Correlation)을 반영한다.

- $\mu$ 값으로 전체 분포를 이동시킬 수 있다. 

 

2-1. 기존 모델과의 비교

 

3. Multivariate Gaussian Distribution의 활용

(Andrew NG 교수님 강의 교제 참고)

- 기존의 Anomaly Detection Algorithm은 왼쪽의 초록색 x표와 같이 Anomaly data가 들어와도, x1축 혹은 x2 축 기준으로 가우시간 분포를 확인했을 때 큰 이상임을 탐지하지 못한다. 전체적으로 분홍색으로 표현된 가우시안 분포로 데이터 이상을 확인하기 때문이다. 데이터가 타원형(Ellipse)으로 분포되어 있음을 나타내는 새로운 모델이 필요로 해보인다.

여기서 다변량 가우시안 분포를 활용할 수 있다.

 

- 위의 식은 다변량 정규 분포 식을 Log likehood로 만들어 최적화 시킨 결과

  (평균과 공분산을 구하는 과정은 유도가 필요하며, 이미 알려져 있다)

- 평균과 공분산에 대해 다변량 정규 분포 식을 미분한 다음 기울기가 0이되는 최적의 값을 찾은 것.

- 미분의 자세한 과정은 강의 참조

 

4. 코드

def multivariate_normal(x, d, mean, covariance):
    """
    pdf of the multivariate normal distribution.
    d : random vector size
    """
    x_m = x - mean
    return (1. / (np.sqrt((2 * np.pi)**d * np.linalg.det(covariance))) * 
            np.exp(-(np.linalg.solve(covariance, x_m).T.dot(x_m)) / 2))
            
'''
numpy.linalg.solve(a, b)
- 선형 연립 방정식을 푼다.
- a는 Full-rank 즉, 열이 선형 독립이어야 한다.
그렇지 않을 경우, numpy.linalg.lstsq 을 사용하도록 한다.
'''

def generate_surface(mean, covariance, d):
    """Helper function to generate density surface."""
    nb_of_x = 100                             # grid size
    x1s = np.linspace(-5, 5, num=nb_of_x)
    x2s = np.linspace(-5, 5, num=nb_of_x)
    x1, x2 = np.meshgrid(x1s, x2s)            # Generate grid
    pdf = np.zeros((nb_of_x, nb_of_x))
                                              # Fill the cost matrix for each combination of weights
    for i in range(nb_of_x):
        for j in range(nb_of_x):
            pdf[i,j] = multivariate_normal(np.matrix([[x1[i,j]], [x2[i,j]]]), # 2 x 1 행렬
                                           d, mean, covariance)
    return x1, x2, pdf                        # x1, x2, pdf(x1,x2)

bivariate_mean = np.matrix([[0.], [0.]])      # Mean
bivariate_covariance = np.matrix([[1., 0.], 
                                  [0., 1.]])  # Covariance

d = 2  # number of dimensions
# grid (x1, x2) 값과 확률 밀도 함수 반환
x1, x2, p = generate_surface(bivariate_mean, bivariate_covariance, d) 
# Plot bivariate distribution
con = ax1.contourf(x1, x2, p, 100, cmap=cm.YlGnBu)

확률 밀도 함수를 반환한다.

 

4.-1 코드 - scipy

from scipy.stats import multivariate_normal
'''
multivariate_normal(mean=None, cov=1, allow_singular=False, seed=None) 
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html
'''
x = np.linspace(0, 5, 10, endpoint=False)
y = multivariate_normal.pdf(x, mean=2.5, cov=0.5)
'''
y array([ 0.00108914,  0.01033349,  0.05946514,  0.20755375,  0.43939129,
        0.56418958,  0.43939129,  0.20755375,  0.05946514,  0.01033349])
'''
fig1 = plt.figure()
ax = fig1.add_subplot(111)
ax.plot(x, y)

x, y = np.mgrid[-1:1:.01, -1:1:.01]
pos = np.dstack((x, y))
print(pos)
rv = multivariate_normal([0.5, -0.2], [[2.0, 0.3],
                                       [0.3, 0.5]])
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.contourf(x, y, rv.pdf(pos))
plt.show()

 


다변량 정규 분포 - 이론)

www.ktword.co.kr/abbr_view.php?m_temp1=1281

en.wikipedia.org/wiki/Multivariate_normal_distribution

www.coursera.org/learn/machine-learning/lecture/

www.edwith.org/machinelearning2__17/lecture/10857

 

다변량 정규 분포 - 코드)

docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html

peterroelants.github.io/posts/multivariate-normal-primer/

 

반응형