본문 바로가기

데이터 과학/확률론

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

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/

 

반응형