[chapter 3] 벡터 응용 : 데이터분석에서의 벡터
1. 상관관계
상관관계란
상관계수(correlational coefficient)는 두 변수 사이의 선형 관계를 정량화한 숫자를 말한다.
상관계수의 범위는 -1 ~ +1로, -1은 완벽한 음의 관계, +1은 완벽한 양의 관계, 0은 선형 관계가 없음을 나타낸다.
이 범위로 나타내기 위해서는 정규화가 필요하다.
평균중심화는 각 데이터값에서 평균값을 빼는 것이다.
피어슨 상관계수(Pearson correlation coefficient)
피어슨 상관계수는 두 변수 X와 Y 사이의 선형적 관계를 나타내는 수치이다.
여기서 $X_i - \overline{X}$이 각 데이터에서 평균값을 빼는 평균중심화를 말한다.
$$ rxy = \frac{\sum_{i}^{}(X_i - \overline{X})(Y_i - \overline{Y})}{\sqrt{\sum_{i}^{}(X_i - \overline{X})^2} \sqrt{\sum_{i}^{}(Y_i - \overline{Y})^2}}$$
분자인 $\sum_{i}^{}(X_i - \overline{X})(Y_i - \overline{Y})$는 중앙화된 벡터 X, Y의 내적이고,
분모인 $\sum_{i}^{}$는 각 중앙화된 X, Y 벡터의 노름이다.
따라서 이 수식은 내적을 각 벡터의 노름의 곱으로 나눠 정규화를 하는 수식이다.
선형대수적으로 나타내면 아래와 같다.
$$ \rho = \frac{\overline x^{T}\overline{y}}{\left\|\overline x \right\| \left\|\overline y \right\|} $$
즉, 피어슨 선형계수는 단지 변수의 크기로 정규화된 두 변수 사이의 내적이다.
코사인 유사도
$$ cos(\theta _{x,y}) = \frac{\alpha }{\left\| x\right\| \left\| y\right\|} $$
코사인 유사도의 공식은 단순히 내적의 기하학적 공식으로 코사인항을 구한 것이다. 여기서 $\alpha$는 x와 y의 내적이다.
피어슨 상관계수와 다른 점은, 코사인 유사도에는 정규화가 적용되어 있지 않다는 점이다.
2. 시계열 필터링과 특징 탐지
내적은 시계열 필터링에도 사용된다.
필터링은 본질적으로 필터(커널)가 시계열 신호의 일부와 일치하는 특징을 찾는데, 커널과 시계열 데이터 사이의 내적을 계산하는 것이 필터링 매커니즘이다.
🤔궁금했던 점 with ChatGPT
잘 이해가 안가서 ChatGPT의 힘을 빌렸다.
시계열 데이터는 시간 순서대로 측정된 값들의 나열을 말하는데, $[x_1, x_2, x_3, ...]$ 의 형태로 이 시계열 데이터를 벡터로 볼 수 있다.
필터링은 데이터에서 원하는 신호만 남기고 잡음을 제거하거나 특정 주파수 성분을 강조하는 것을 말한다.
필터(커널)을 $[h_1, h_2, h_3, ...]$ 형태인 벡터로 정의해서, 두 벡터의 내적을 구해 유사도를 파악하는 것이다.
하지만 필터링을 할 때 일반적으로 지역(local) 특징을 탐지해야 하고, 커널은 일반적으로 시계열 데이터보다 훨씬 짧다.
따라서 커널과 동일한 길이의 짧은 데이터 조각과 커널 사이의 내적을 계산한다.
이 과정으로 필터링된 신호 구간에서 한 점이 생성되고, 커널을 오른쪽 구간으로 이동시키면서 다른 신호조각과 내적을 계산한다. 이 과정을 합성곱이라고 한다.
3. k-평균 클러스터링
k-평균 클러스터링(k-means clustering)은 그룹 중심까지의 거리를 최소화하도록 다변량 데이터를 상대적으로 적은 수(k)의 그룹 또는 범주로 분류하는 비지도 기법이다.
아래 과정을 거쳐 구현할 수 있다.
- 데이터 공간에서 N개의 중심점을 초기화한다. 여기서 중심은 클래스 또는 범주이다.
- 각 데이터 관측치와 중심 사이의 유클리드 거리를 계산한다.
- 각 데이터 관측치를 가장 가까운 중심의 그룹에 할당한다.
- 각 중심을 해당 중심에 할당된 모든 데이터 관측치의 평균으로 갱신한다.
- 수렴 기준을 만족할 때까지 또는 N회까지 2~4단계를 반복한다.
파이썬 코드로 나타내면 아래와 같다.
1. 데이터 공간에서 k개의 중심점 초기화
k = 3 # 3개의 그룹으로 데이터셋을 나누겠다
ridx = np.random.choice(range(len(data),k,replace=False)) # 데이터의 인덱스 중에서 무작위로 k개를 뽑음
centroids = data[ridx,:] # 초기 중심을 데이터 포인트 중에서 랜덤하게 3개 뽑아서 설정
2. 각 데이터 관측치와 중심 사이의 유클리드 거리 계산
dists = np.zeros((data.shape[0],k)) # 각 데이터 포인트가 각 클러스터 중심까지의 거리를 저장할 공간
# 각 데이터 포인트와 중심의 좌표 차이를 구함
for ci in range(k):
dists[:, ci] = np.sum((data - centroids[ci, :])** 2, axis=1)
# data는 (N, D), centroids[ci, :]는 (D,)이므로 브로드캐스팅이 일어남
만약 data.shape = (150, 2)이고, centroids.shape(1,2)이면 data - centroids는 shape이 다르기 때문에 성립이 되지 않는다.
이 때 파이썬에서의 브로드캐스팅이 일어나 centroids를 150만큼 반복하게 되므로 자동으로 반복 계산이 된다.
즉, 모든 데이터에 대해 중심을 뺄 수 있게 된다.
3. 각 데이터 관측치를 가장 가까운 거리 그룹에 할당한다.
groupix = np.argmin(dists, axis=1)
# dists[i, j] = i번째 데이터와 j번째 중심까지의 거리²
# 각 행(axis=1)에서 가장 작은 값의 인덱스를 반환
# 각 데이터 포인트가 어떤 중심과 가장 가까운지 알려줌
# 예 )
#[[0, 18], # 데이터 0 → 중심0:0, 중심1:18
# [2, 8], # 데이터 1 → 중심0:2, 중심1:8
# [8, 2], # 데이터 2 → 중심0:8, 중심1:2
# [18, 0], # 데이터 3 → 중심0:18, 중심1:0
# [32, 2]] # 데이터 4 → 중심0:32, 중심1:2 라면
# groupix = [0, 0, 1, 1, 1] - 데이터 0,1은 중심 0, 데이터 2,3,4는 중심 1
# np.argmin은 최솟값의 인덱스를 반환한다.
4. 클래스 내의 모든 데이터 점의 평균을 계산해서 중심을 다시 설정
for ki in range(k):
centroids[ki, :] = [np.mean(data[groupidx==ki, 0]), np.mean(data[groupidx==ki, 1])]
# groupidx → 각 데이터가 어느 중심에 할당됐는지 나타내는 벡터 (0~k-1)
# groupidx==ki → ki번 중심에 할당된 데이터만 선택
# data[groupidx==ki, 0] → 선택된 데이터들의 첫 번째 좌표(x)만 추출
# data[groupidx==ki, 1] → y좌표만 추출
# np.mean → x좌표, y좌표 각각 평균 계산
# x, y 평균값을 ci번째 중심 좌표로 갱신
5. 좋은 답을 얻을 때까지 이전 단계들을 반복한다.
완료되면 아래와 같은 결과를 얻을 수 있다.

'수학 > 선형대수' 카테고리의 다른 글
| [개발자를 위한 실전 선형대수학] 4.1 NumPy에서 행렬 생성과 시각, 4.2 행렬 수학:덧셈, 스칼라 곱셈, 아다마르곱 (0) | 2025.12.02 |
|---|---|
| [개발자를 위한 실전 선형대수학] Chapter 3 연습문제 (0) | 2025.11.27 |
| [개발자를 위한 실전 선형대수학] Chapter 2 연습문제 (0) | 2025.11.21 |
| [개발자를 위한 실전 선형대수학] 2.4 부분공간과 생성, 2.5 기저 (0) | 2025.11.19 |
| [개발자를 위한 실전 선형대수학] 2.1 벡터 집합, 2.2 선형 가중 결합, 2.3 선형 독립성 (0) | 2025.11.17 |