인지야공/인공 지능 공부 치트 시트 정리/7번째 글
CS229 비지도학습 치트시트를 다시 쓴다 — 정답이 없을 때 무엇을 믿는가
지도학습은 틀리면 알 수 있다. 비지도학습은 틀려도 알 수가 없다. 그래서 이쪽 치트시트의 절반은 “무엇을 믿을 것인가”에 대한 이야기다. 그 기준을 중심으로 다시 썼다.
군집 알고리즘의 실기 코드는 군집·연관 글에, 평가 지표의 정의는 모델 평가 지표 글에 적어 두었다. 여기는 왜 그렇게 되는가 쪽이다.
k-means — 두 줄이 전부다
중심을 아무렇게나 k 개 잡고, 다음 두 단계를 값이 안 바뀔 때까지 되풀이한다.
앞줄은 점을 가장 가까운 중심에 배정, 뒷줄은 배정된 점들의 평균으로 중심을 옮김이다. 수렴 여부는 왜곡 함수로 본다.
는 매 단계 줄거나 그대로다. 그래서 수렴은 보장된다 — 다만 전역 최적이 아니라 지역
최적으로 수렴한다. 초기 중심이 나쁘면 나쁜 데서 멈춘다. sklearn 의 n_init 이 여러 번
다시 시작해 그중 제일 좋은 것을 고르는 이유가 이것이다.
로는 k 를 고를 수 없다
직접 재 보면 분명하다.
| k | 왜곡 | 실루엣 |
|---|---|---|
| 1 | 1632.8 | — |
| 2 | 344.3 | 0.667 |
| 3 | 296.9 | 0.445 |
| 4 | 251.7 | 0.241 |
| 5 | 220.2 | 0.250 |
는 k 가 커지면 반드시 줄어든다. 극단적으로 k = 데이터 개수면 이다. 그러니 ” 가 작은 k 를 고른다”는 언제나 “가장 큰 k 를 고른다”가 된다. 그래서 두 가지를 쓴다.
- 엘보우: 가 꺾이는 지점. 줄어드는 폭이 눈에 띄게 작아지는 곳
- 실루엣: 값 자체가 최대인 지점 — 위 표에서는 k=2 로 분명하다
정답이 2개 덩어리로 만든 데이터였으니 실루엣이 맞혔다.
실루엣 — 식 그대로다
- = 같은 군집 안 다른 점들까지의 평균 거리 (얼마나 뭉쳤나)
- = 가장 가까운 다른 군집의 점들까지의 평균 거리 (얼마나 떨어졌나)
손으로 계산한 값과 sklearn 값이 소수점 여섯 자리까지 같다.
a = 같은군집까지_평균거리 # 자기 자신은 빼고 나눈다 (len-1)
b = 가장가까운_다른군집까지_평균거리
(b - a) / max(a, b) # 0.528307
silhouette_samples(X, labels)[0] # 0.528307
값은 −1 에서 1 사이다. 0 근처면 경계에 걸쳐 있다는 뜻이고, 음수면 다른 군집에 있어야 할 점이다. 평균만 보지 말고 음수인 점이 얼마나 되는지 같이 보면 군집이 실제로 갈렸는지 알 수 있다.
칼린스키-하라바츠 지수는 군집 사이 흩어짐 와 군집 안 흩어짐 의 비다. 클수록 좋다는 방향만 기억하면 된다.
계층 군집 — 무엇을 최소화하느냐의 차이
| 연결 방식 | 합칠 때 줄이려는 것 |
|---|---|
| Ward | 군집 안의 거리(분산 증가량) |
| Average | 두 군집 점쌍들의 평균 거리 |
| Complete | 두 군집 점쌍들의 최대 거리 |
k 를 미리 정하지 않아도 되고 덴드로그램으로 자를 위치를 눈으로 고를 수 있다. 대신 이상이라 데이터가 크면 쓰기 어렵다.
EM — k-means 의 부드러운 판
k-means 는 점을 한 군집에 딱 하나 배정한다. EM 은 “이 점이 1번 군집에서 나왔을 확률 70%” 처럼 나눠서 배정한다. 관측되지 않은 그 소속을 잠재변수 라 한다.
| 설정 | 잠재변수 | |
|---|---|---|
| k개 가우시안 혼합 | ||
| 요인분석 |
두 단계를 번갈아 돈다.
- E-step: 지금 모수로 각 점이 어느 군집에서 왔을지 사후확률을 계산한다 —
- M-step: 그 확률을 가중치 삼아 모수를 다시 추정한다
젠슨 부등식 로 로그가능도의 하한을 만들고, 그 하한을 올리는 것이 M-step 이다. 하한을 올리면 원래 값도 따라 오르므로 로그가능도는 절대 줄지 않는다. 직접 반복 횟수를 늘려 가며 재 보면 그렇다.
반복별 로그가능도: -5.434 → -5.433 → -5.433 → -5.432 → -5.431 → -5.431 → -5.430 → -5.429
줄어든 적이 있는가: 없다
k-means 도 사실 EM 의 특수한 경우다(확률 대신 0/1 로 딱 잘라 배정하는 판). 둘을 따로 외울 것이 아니라 하나가 다른 하나의 극단이라고 보면 된다.
PCA — 네 단계
- 표준화한다. 평균 0, 표준편차 1
- 공분산 행렬 를 만든다 (대칭이라 실수 고윳값을 가진다)
- 고윳값이 큰 순서로 직교 고유벡터 를 구한다
- 그 방향들로 데이터를 투영한다
이 절차가 왜 “분산을 최대로 남기는” 것인지는 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 앞의 표준화는 선택이 아니다.
부호는 뒤집혀 나올 수 있다( 와 는 같은 축이다). 주성분 그림의 방향이 남과 반대라도 틀린 것이 아니다.
ICA 한 줄
PCA 는 분산이 최대인 축을 찾고, ICA 는 서로 독립인 성분을 찾는다. 여러 사람이 동시에 말하는 녹음에서 목소리를 갈라내는 칵테일파티 문제가 ICA 쪽이다. 목적이 다르므로 “차원 축소는 PCA, 신호 분리는 ICA” 로 갈라 기억하면 된다.
출처
Afshine Amidi · Shervine Amidi 의 CS 229 VIP Cheatsheet: Unsupervised Learning (Stanford, 2018)을 보고 다시 쓴 것이다. 원본은 stanford.edu/~shervine에 있다. 표의 숫자와 검증 코드는 내가 돌려 본 결과다.