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/
'데이터 과학 > 확률론' 카테고리의 다른 글
Scipy 함수 정리 (0) | 2021.05.25 |
---|---|
결합 확률 분포, 주변 확률 분포 (Joint / Marginal Probability Distribution) (0) | 2021.02.13 |
Likelihood(가능도) (0) | 2021.01.07 |
최대 우도 추정법(MLE) (0) | 2021.01.06 |
Gaussian Mixture Model(GMM) (0) | 2021.01.02 |