NumPy 기초·연습 문제

그램 행렬 (Gram Matrix)

문제 설명PROBLEM

preview

그램 행렬 (Gram Matrix)

NN 개 벡터 {x1,,xN}\{\mathbf{x}_1, \dots, \mathbf{x}_N\} 사이의 모든 쌍별 내적을 담은 행렬. 커널 방법(SVM with kernels), Style Transfer, attention 의 기본 블록.

Gij=xixjG_{ij} = \mathbf{x}_i \cdot \mathbf{x}_j

G=XXG = X X^\top (X shape (N, D) → G shape (N, N)).

성질

  • 대칭: Gij=GjiG_{ij} = G_{ji}
  • 대각 성분은 각 벡터의 제곱 노름: Gii=xi2G_{ii} = \|x_i\|^2
  • 양의 준정부호 (모든 고유값 ≥ 0)
  • rank ≤ min(N, D)

어디에 쓰이나

  • SVM 커널 트릭 — 선형 내적을 커널 함수로 바꿔 비선형 분리
  • Neural Style Transfer — feature map의 Gram 행렬로 스타일 표현
  • 가우시안 과정 — 공분산 행렬의 기본 형태

과제

함수 gram_matrix(X) 를 완성하세요.

  • X shape (N, D) → 반환 (N, N).
  • X @ X.T 한 줄.

테스트 케이스

#이름검증
1shape (N, N)
2대칭G == G.T
3대각 = squared normG[i, i] == np.sum(x_i**2)
4수동 내적과 일치
5영벡터 행렬 → 0
개념 노트와 실수 포인트

NumPy 기초

  • ⚠️ axis 헷갈림: axis=0 은 행을 가로질러 → 열별 결과, axis=1행별 결과.
  • 브로드캐스팅: shape 를 뒤에서부터 맞춤(1 또는 같은 크기).
  • 반복문 대신 벡터화 연산. @(행렬곱) 와 *(요소곱) 구분.