인지야공

인지야공/인공 지능 공부 치트 시트 정리/7번째 글

CS229 비지도학습 치트시트를 다시 쓴다 — 정답이 없을 때 무엇을 믿는가

지도학습은 틀리면 알 수 있다. 비지도학습은 틀려도 알 수가 없다. 그래서 이쪽 치트시트의 절반은 “무엇을 믿을 것인가”에 대한 이야기다. 그 기준을 중심으로 다시 썼다.

군집 알고리즘의 실기 코드는 군집·연관 글에, 평가 지표의 정의는 모델 평가 지표 글에 적어 두었다. 여기는 왜 그렇게 되는가 쪽이다.

k-means — 두 줄이 전부다

중심을 아무렇게나 k 개 잡고, 다음 두 단계를 값이 안 바뀔 때까지 되풀이한다.

c(i)=arg⁡min⁡j∥x(i)−μj∥2μj=∑i1{c(i)=j} x(i)∑i1{c(i)=j}c^{(i)} = \arg\min_j \lVert x^{(i)} - \mu_j \rVert^2 \qquad \mu_j = \frac{\sum_i \mathbb{1}\{c^{(i)}=j\}\, x^{(i)}}{\sum_i \mathbb{1}\{c^{(i)}=j\}}

앞줄은 점을 가장 가까운 중심에 배정, 뒷줄은 배정된 점들의 평균으로 중심을 옮김이다. 수렴 여부는 왜곡 함수로 본다.

J(c,μ)=∑i=1m∥x(i)−μc(i)∥2J(c,\mu) = \sum_{i=1}^{m} \lVert x^{(i)} - \mu_{c^{(i)}} \rVert^2

JJ 는 매 단계 줄거나 그대로다. 그래서 수렴은 보장된다 — 다만 전역 최적이 아니라 지역 최적으로 수렴한다. 초기 중심이 나쁘면 나쁜 데서 멈춘다. sklearn 의 n_init 이 여러 번 다시 시작해 그중 제일 좋은 것을 고르는 이유가 이것이다.

JJ 로는 k 를 고를 수 없다

직접 재 보면 분명하다.

k왜곡 JJ실루엣
11632.8—
2344.30.667
3296.90.445
4251.70.241
5220.20.250

JJ 는 k 가 커지면 반드시 줄어든다. 극단적으로 k = 데이터 개수면 J=0J=0 이다. 그러니 ”JJ 가 작은 k 를 고른다”는 언제나 “가장 큰 k 를 고른다”가 된다. 그래서 두 가지를 쓴다.

  • 엘보우: JJ 가 꺾이는 지점. 줄어드는 폭이 눈에 띄게 작아지는 곳
  • 실루엣: 값 자체가 최대인 지점 — 위 표에서는 k=2 로 분명하다

정답이 2개 덩어리로 만든 데이터였으니 실루엣이 맞혔다.

실루엣 — 식 그대로다

s=b−amax⁡(a,b)s = \frac{b-a}{\max(a,b)}

  • aa = 같은 군집 안 다른 점들까지의 평균 거리 (얼마나 뭉쳤나)
  • bb = 가장 가까운 다른 군집의 점들까지의 평균 거리 (얼마나 떨어졌나)

손으로 계산한 값과 sklearn 값이 소수점 여섯 자리까지 같다.

a = 같은군집까지_평균거리          # 자기 자신은 빼고 나눈다 (len-1)
b = 가장가까운_다른군집까지_평균거리
(b - a) / max(a, b)               # 0.528307
silhouette_samples(X, labels)[0]  # 0.528307

값은 −1 에서 1 사이다. 0 근처면 경계에 걸쳐 있다는 뜻이고, 음수면 다른 군집에 있어야 할 점이다. 평균만 보지 말고 음수인 점이 얼마나 되는지 같이 보면 군집이 실제로 갈렸는지 알 수 있다.

칼린스키-하라바츠 지수는 군집 사이 흩어짐 BkB_k 와 군집 안 흩어짐 WkW_k 의 비다. 클수록 좋다는 방향만 기억하면 된다.

s(k)=tr⁡(Bk)tr⁡(Wk)×m−kk−1s(k) = \frac{\operatorname{tr}(B_k)}{\operatorname{tr}(W_k)} \times \frac{m-k}{k-1}

계층 군집 — 무엇을 최소화하느냐의 차이

연결 방식합칠 때 줄이려는 것
Ward군집 안의 거리(분산 증가량)
Average두 군집 점쌍들의 평균 거리
Complete두 군집 점쌍들의 최대 거리

k 를 미리 정하지 않아도 되고 덴드로그램으로 자를 위치를 눈으로 고를 수 있다. 대신 O(m2)O(m^2) 이상이라 데이터가 크면 쓰기 어렵다.

EM — k-means 의 부드러운 판

k-means 는 점을 한 군집에 딱 하나 배정한다. EM 은 “이 점이 1번 군집에서 나왔을 확률 70%” 처럼 나눠서 배정한다. 관측되지 않은 그 소속을 잠재변수 zz 라 한다.

설정잠재변수 zzx∣zx \mid z
k개 가우시안 혼합Multinomial(ϕ)\text{Multinomial}(\phi)N(μj,Σj)\mathcal{N}(\mu_j, \Sigma_j)
요인분석N(0,I)\mathcal{N}(0, I)N(μ+Λz,ψ)\mathcal{N}(\mu + \Lambda z, \psi)

두 단계를 번갈아 돈다.

  • E-step: 지금 모수로 각 점이 어느 군집에서 왔을지 사후확률을 계산한다 — Qi(z(i))=P(z(i)∣x(i);θ)Q_i(z^{(i)}) = P(z^{(i)} \mid x^{(i)};\theta)
  • M-step: 그 확률을 가중치 삼아 모수를 다시 추정한다

젠슨 부등식 E[f(X)]≥f(E[X])E[f(X)] \ge f(E[X]) 로 로그가능도의 하한을 만들고, 그 하한을 올리는 것이 M-step 이다. 하한을 올리면 원래 값도 따라 오르므로 로그가능도는 절대 줄지 않는다. 직접 반복 횟수를 늘려 가며 재 보면 그렇다.

반복별 로그가능도: -5.434 → -5.433 → -5.433 → -5.432 → -5.431 → -5.431 → -5.430 → -5.429
줄어든 적이 있는가: 없다

k-means 도 사실 EM 의 특수한 경우다(확률 대신 0/1 로 딱 잘라 배정하는 판). 둘을 따로 외울 것이 아니라 하나가 다른 하나의 극단이라고 보면 된다.

PCA — 네 단계

  1. 표준화한다. 평균 0, 표준편차 1
  2. 공분산 행렬 Σ=1m∑x(i)x(i)T\Sigma = \frac{1}{m}\sum x^{(i)} x^{(i)T} 를 만든다 (대칭이라 실수 고윳값을 가진다)
  3. 고윳값이 큰 순서로 직교 고유벡터 u1,…,uku_1,\dots,u_k 를 구한다
  4. 그 방향들로 데이터를 투영한다

이 절차가 왜 “분산을 최대로 남기는” 것인지는 3단계에 다 들어 있다. 고윳값이 곧 그 방향의 분산이라, 큰 것부터 고르면 남는 분산이 최대가 된다. 직접 고유분해해 보면 sklearn 과 같다.

C = np.cov(Xs.T, bias=True)
vals, vecs = np.linalg.eigh(C)          # 고윳값 비율: [0.8575, 0.084, 0.0586]
PCA().fit(Xs).explained_variance_ratio_ # [0.8575, 0.084, 0.0586]

1단계를 빼먹으면 단위가 큰 변수가 주성분을 독차지한다. 키(cm)와 몸무게(kg)를 그냥 넣으면 키 방향이 1주성분이 되는 식이다. PCA 앞의 표준화는 선택이 아니다.

부호는 뒤집혀 나올 수 있다(uu 와 −u-u 는 같은 축이다). 주성분 그림의 방향이 남과 반대라도 틀린 것이 아니다.

ICA 한 줄

PCA 는 분산이 최대인 축을 찾고, ICA 는 서로 독립인 성분을 찾는다. 여러 사람이 동시에 말하는 녹음에서 목소리를 갈라내는 칵테일파티 문제가 ICA 쪽이다. 목적이 다르므로 “차원 축소는 PCA, 신호 분리는 ICA” 로 갈라 기억하면 된다.

출처

Afshine Amidi · Shervine Amidi 의 CS 229 VIP Cheatsheet: Unsupervised Learning (Stanford, 2018)을 보고 다시 쓴 것이다. 원본은 stanford.edu/~shervine에 있다. 표의 숫자와 검증 코드는 내가 돌려 본 결과다.

표시는 이 브라우저에만 남는다. 서버로 가는 것은 없다.