[개발자를 위한 실전 선형대수학] 6.1 다변량 데이터 공분산 행렬, 6.2 행렬-벡터 곱셈을 통한 기하학적 변환

[chapter6] 행렬 응용 : 데이터 분석에서의 행렬

1. 공분산(covariance)

평균중심화된 변수 사이의 내적

데이터 크기가 반영되므로 +, - 제한이 없다는 점을 제외하고 상관관계와 같은 방식으로 해석할 수 있다.(변수가 함께 이동할 때 양수, 변수가 따로 이동할 때 음수, 선형 관계가 없을 때 0)

공분산의 정규화 인자는 n-1이며 n은 데이터 점의 개수

공분산 정규화를 통해 더 많은 데이터 값을 합할 때마다 공분산이 커지는 것을 방지할 수 있다.

아래는 공분산에 대한 방정식이다.

$$  c_{a,b} = (n-1)^{-1}\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y}) $$

 

공분산 with ChatGPT

잘 이해가 안가서 ChatGPT에게 물어봤다🤔 

공분산은 '두 값이 함께 어떻게 움직이느냐'를 보는 지표로, 두 변수가 평균에서 벗어나는 방향이 비슷한지/반대인지를 말한다.

  • 같이 커지고 같이 작아지면 = 양의 공분산(+)
  • 하나는 커지는데 다른 하나는 작아지면 = 음의 공분산(-)
  • 관계가 없으면 = 0 근처

평균에서 얼마나 벗어났는지가 핵심으로, 위 방정식으로 보면 x에서 x의 평균을, y에서 y의 평균을 빼고 그 두 값을 곱한다.

이 때 곱하는 이유는 두 값이 +/- 이면 곱도 -로 반대임을 알수있고, +/+ 거나 -/- 이면 곱도 +로 같은 방향임을 알 수 있기 때문이다.

즉, 공분산은 두 변수가 평균을 기준으로 같은 방향으로 흔들리는지, 반대 방향으로 흔들리는지를 수치로 표현한 것이다.

여기서 왜 n-1로 나누는지가 궁금했다.

모집단 전체가 아닌 일부 표본만으로 전체 모집단의 분산을 추정할 때, n으로 나누면 실제 모분산보다 작아지는 경향이 있다고 한다.

사실 직관적으로 '아하!'는 못했지만.. 그런가부다 로 넘어가자.😅

 

아무튼, 위 방정식을 잘 보면 평균화된 두 벡터 X, Y의 내적으로 볼 수 있는데, 아래처럼 나타낼 수 있다.

$$ \tilde{x}^T\tilde{y} / (n-1) $$

각 변수를 열에 담은 행렬 X를 만들고, X를 전치하면 $X^T$ 행은 X 행렬의 열이 된다.

따라서 $X^TX$는 모든 열과 열 사이의 공분산이 된다.

다시 말해 공분산 행렬의 (i,j)번째 원소는 데이터 특징 i와 j 사이의 내적이다.

공분산 행렬에 대한 행렬 방정식은 아래가 된다.

$$ C = X^TX\frac{1}{n-1} $$

여기서 행렬 C는 대칭이다.(자신의 전치행렬을 곱하면 정방 대칭이 되므로)

C의 대각 원소는 각 변수의 자기 자신에 대한 공분산이며, 통계에서는 이를 분산이라고 한다.

공분산 행렬은 아래와 같이 파이썬으로 계산할 수 있다.

datamean = np.mean(dataMat,axis=0) # 특징 평균 벡터
dataMatM = dataMat - datamean # 브로드캐스트를 이용한 평균중앙화
covMat = dataMatM.T @ dataMatM # 데이터 행렬의 전치와 데이터 행렬의 곱
covMat /= (dataMatM.shape[0]-1) # N-1로 나누기

Numpy에는 공분산과 상관 행렬을 각각 np.cov(), np.corrcoef()로 계산할 수 있다.

공분산 행렬?

변수가 여러 개 있을 때, 모든 쌍의 공분산을 한 번에 모아둔 표

변수 3개면 아래와 같이 된다.

이 때 대각선 원소는 한 변수 혼자 얼마나 퍼져 있는지를 의미하고, 비대각선은 두 변수가 평균에서 같은 방향으로 벗어나는 경향을 말한다.

2. 행렬-벡터 곱셈을 통한 기하학적 변환

순수회전행렬

길이를 유지하면서 벡터를 회전시킨다. 2차원 회전 행렬은 아래와 같다.

$$  T = \begin{bmatrix}cos(\theta ) & sin(\theta ) \\-sin(\theta ) & cos(\theta ) \\\end{bmatrix} $$

순수회전행렬은 기본적으로 직교 행렬이다. 즉, T의 열들은 직교이다.

이 변환행렬을 사용할 떄는 $\theta$를 특정 시계 방향 회전 각도로 설정한 다음, 행렬 T에 2 x N의 기하학적 점 행렬을 곱하면 된다.

여기서 행렬의 각 열은 N개의 데이터 점에 대한 (x, y) 좌표이다.

이 순수회전행렬을 사용하면 벡터의 점이 일정 각도만큼 회전한다.

https://ko.wikipedia.org/wiki/%ED%9A%8C%EC%A0%84%EB%B3%80%ED%99%98%ED%96%89%EB%A0%AC