직선으로 못 자르면 띄워서 잘라라! 도넛처럼 직선으로 안 나뉘는 데이터를, 고차원으로 띄워 올려 평면으로 자르는 SVM의 비장의 무기예요.
파랑이 가운데, 빨강이 그 둘레를 감싸요. k-NN은 거뜬한데 얕은 트리는 고생하는 모양이에요.
📖 읽는 법: 가로·세로축은 두 가지 특징이에요. 배경색이 모델의 판정 — 파랑 영역이면 +1, 빨강 영역이면 −1로 분류하고, 색이 진할수록 확신이 커요. 학습 전엔 하얗다가(판단 없음), 학습이 진행되면 동그란 경계가 자라나요. 직선이 아니라는 게 핵심이에요!
📖 읽는 법: 각 점을 중심 (5,5)에서의 거리 r(가로)과 r²(세로, "높이로 띄운 값")에 다시 찍은 그림이에요. 🍩 도넛에선 가운데 파랑이 낮게, 둘레 빨강이 높게 떠서 보라 수평 점선 하나로 나뉘어요 — 2차원에서 원이던 경계가, 띄우고 나면 그냥 직선! (다른 꾸러미는 거리만으로 안 나뉠 수도 있어요 — 그땐 다른 "띄우기"가 필요하다는 뜻이에요.)
γ를 바꾸면 α(각 점의 발언권)가 초기화돼요 — 다시 ▶ 학습!
각 학습점 i는 발언권 αᵢ를 가져요. 새 점의 판정은 Σ αᵢ·yᵢ·K(xᵢ, x) — 학습점들과의 비슷함 점수를 발언권만큼 모은 합의 부호예요.
💡 화면의 모델은 SVM을 단순화한 사촌(커널 로지스틱)이에요 — 커널로 경계가 만들어지는 원리는 같아요.
from sklearn import svm
from sklearn.datasets import make_circles
X, y = make_circles(factor=0.4, noise=0.08) # 🍩 도넛 데이터
linear = svm.SVC(kernel='linear') # 직선만 긋는 SVM
linear.fit(X, y)
print(linear.score(X, y)) # 0.5쯤 — 도넛엔 속수무책 😢
rbf = svm.SVC(kernel='rbf', gamma=8) # 커널 트릭 장착!
rbf.fit(X, y) # '비슷함 점수'로 띄워서 자르기
print(rbf.score(X, y)) # 1.0 — 동그란 경계 완성 🎉