여러가지공부/머신러닝(Machine Learning)

공분산 행렬이란? 예제로 값 구해보기(Covariance Matrix), 파이썬 코드

끄적끄적아무거나 2023. 5. 19. 08:50
반응형

 

목차

     

     

     

     

    공분산 행렬(Covariance Matrix)이란? 

     

    공분산 행렬이란 아래와 같이 수식(Equation)을 정의합니다.

     

    수식1

     

    행렬로 표기를 하고 시그마(Σ)로 표기합니다. 시그마(Σ)는 이산 적분식과 다르니 확실히 구분해서 생각해야 합니다. 하나의 문자로 사용됩니다.

     

    공분산 행렬은 저의 경우 기계학습의 PCA(Principal Component Analysis) 계산에서 사용되어 공부를 하게 되었습니다. 그 외에도 다양한 분야에서 공분산 수식으로 처리하는 경우들이 있습니다. 

     

     

     

    그림1

     

    그림1과 같이 데이터셋(Dataset)을 통해 공분산을 만드는 방법에 대해 생각해보겠습니다. 데이터셋의 n행은 샘플들의 개수로 볼수 있고 d는 차원 값 또는 Feature라고 부르는 개수 입니다.

     

    예를 들면 학생 4명에 대한 키와 몸무게를 측정해서 데이터셋을 만들면 n은 4이고 d는 2가 됩니다.

     

     

    공분산행렬은 d 값들 간에 공분산(Covariance)를 구하여 행렬로 만든 것입니다. 그러므로 행렬의 크기는 d x d가 됩니다. 그리고 공분산은 Scale에 의해 영향을 크게 받기 때문에 수식1과 같이 n-1로 나눠서 standarization 해줍니다. 

     

     

    예제를 통해 쉽게 알아보겠습니다. 

     

     

     

     

    공분산 행렬(Covariance Matrix) 예제 풀이

     

    • 학생 1: 키 = 170cm, 몸무게 = 65kg, 나이 = 15세
    • 학생 2: 키 = 160cm, 몸무게 = 55kg, 나이 = 16세
    • 학생 3: 키 = 180cm, 몸무게 = 75kg, 나이 = 17세
    • 학생 4: 키 = 175cm, 몸무게 = 70kg, 나이 = 16세

     

    위 학생 4명 데이터에 대한 공분산 행렬을 구하겠습니다. 

     

     

     

    평균 키 = (170+160+180+175) / 4 = 171.25 cm

    평균 몸무게 = (65+55+75+70) / 4 = 66.25 kg

    평균 나이 = (15+16+17+16) / 4 = 16 세

     

     

    평균의 정보는 위와 같습니다.

     

     

     

    cov(X, Y) = Σ (xi - μx) (yi - μy) / (n - 1) 

     

    위 수식으로 공분산의 행렬 값을 채웁니다.

     

    공분산 행렬은 아래와 같이 구성됩니다.

     

     

    같은 차원(d)이 들어간 값은 분산과 같습니다.

     

     

     

    cov(키, 키)를 구하면 아래와 같습니다. 

     

    각 키에서 평균을 빼고 제곱합니다.

     

    (170 - 171.25)^2 = 1.5625

    (160 - 171.25)^2 = 126.5625

    (180 - 171.25)^2 = 76.5625

    (175 - 171.25)^2 = 14.0625

     

    위 값을 모두 더하고 n-1로 나눠 줍니다. 

     

    cov(키, 키) = (1.5625 + 126.5625 + 76.5625 + 14.0625) / (4 - 1) = 218.75 / 3 = 72.9167

     

     

     

     

    cov(키, 몸무게)를 구하면 아래와 같습니다. 

     

    학생 1: (170 - 171.25) * (65 - 66.25) = 1.5625

    학생 2: (160 - 171.25) * (55 - 66.25) = 126.5625

    학생 3: (180 - 171.25) * (75 - 66.25) = 76.5625

    학생 4: (175 - 171.25) * (70 - 66.25) = 14.0625

     

    위 값을 모두 더하고 n-1로 나눠 줍니다.

     

    cov(키, 몸무게) = (1.5625 + 126.5625 + 76.5625 + 14.0625) / (4 - 1) = 218.75 / 3 = 72.9167

     

     

     

    나머지 요소들도 위와 같은 방식으로 채우면 공분산 행렬을 완성할 수 있습니다.

     

     

     

     

     

    공분산 행렬(Covariance Matrix) 예제 파이썬 풀이

     

    이번에는 앞서 계산을 파이썬(Python)으로 쉽게 구하는 방법에 대해 알아보겟습니다.

     

    코드 자체도 단순하니 부연 설명 없이 코드의 결과만을 확인하시길 바랍니다.

     

    예제 코드>>

    import numpy as np
    
    # 키, 몸무게, 나이 데이터
    height = np.array([170, 160, 180, 175])
    weight = np.array([65, 55, 75, 70])
    age = np.array([15, 16, 17, 16])
    
    # 공분산 행렬 계산
    cov_matrix = np.cov([height, weight, age], bias=False)
    
    print(cov_matrix)

     

    결과>>

    [[72.91666667 72.91666667  3.33333333]
     [72.91666667 72.91666667  3.33333333]
     [ 3.33333333  3.33333333  0.66666667]]

     

     

     

    예제 코드 다운로드>>

     

    cov_matrix.py
    0.00MB

     

    반응형