[혼공머신] 5주차: 비지도 학습(군집 알고리즘, k-평균, PCA)

Chapter 06 비지도 학습
이번 장은 타깃(정답) 없이 데이터의 구조를 읽는 비지도 학습을 다루었습니다. 군집 알고리즘 에서는 동일 크기 이미지에서 평균 이미지를 기준으로 거리로 비슷함을 확인하며 군집의 직관을 잡았고, k-평균으로 이 직관을 자동화해 클러스터와 클러스터 중심을 확인하고, 이너셔(inertia)와 엘보우(elbow)로 적정 k를 가늠했습니다. 마지막으로 주성분 분석 에서는 PCA로 차원을 줄여 설명된 분산 비율과 재구성(inverse_transform)으로 정보 보존을 확인하고, 축소 특성을 다른 알고리즘과 연계했습니다.
06-1 군집 알고리즘
군집 알고리즘은 타깃(정답) 없이 데이터 안의 패턴을 찾아 비슷한 샘플끼리 모으는 방법입니다. 동일 크기의 과일 이미지를 벡터로 바꾸고 과일별 평균 이미지를 기준으로 각 샘플과의 “절대값 차이의 평균”을 계산해 평균에 가장 가까운 샘플들을 확인했습니다. 이 과정만으로도 ‘비슷함=거리’라는 기준으로 군집의 윤곽을 직관적으로 볼 수 있었고, 다음 절의 k-평균에서 이 “대표(평균 이미지)”를 사람이 정하지 않고 자동으로 찾습니다.
apple = fruits[0:100].reshape(100, -1)
apple_mean = apple.mean(axis=0).reshape(100, 100)
dist = np.abs(fruits - apple_mean).mean(axis=(1, 2)) # 절대값 차이의 평균
nearest_idx = np.argsort(dist)[:100]
# draw_fruits(fruits[nearest_idx])
06-2 k-평균
k-평균은 초기 클러스터 중심에서 시작해 가까운 중심에 할당하고 중심을 재계산하는 과정을 반복해 수렴합니다. 학습 후 labels_로 클러스터를 확인하고, cluster_centers_를 이미지로 보면 각 클러스터의 전형이 드러납니다. 이너셔(inertia, 클러스터 내 거리 제곱합)는 k가 커질수록 감소하며, 엘보우(elbow) 지점에서 적정 k를 고르면 과도한 분할을 피할 수 있습니다.
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=42).fit(fruits_2d)
print(np.unique(km.labels_, return_counts=True)) # (레이블, 개수)
centers = km.cluster_centers_.reshape(-1, 100, 100)
# draw_fruits(centers, ratio=3)
inertia = [KMeans(n_clusters=k, n_init='auto', random_state=42).fit(fruits_2d).inertia_
for k in range(2, 7)]
plt.plot(range(2,7), inertia, marker='o'); plt.xlabel('k'); plt.ylabel('inertia'); plt.show()
06-3 주성분 분석
PCA는 분산이 큰 방향의 주성분을 우선 보존해 차원을 줄입니다. 특성을 50개로 축소해도 누적 설명된 분산 비율이 높았고, 재구성(inverse_transform)으로 주요 구조가 유지됨을 확인했다. 주성분 수는 정수로 직접 지정하거나 목표 누적 설명된 분산 비율(예: 0.9)로 자동 결정할 수 있습니다.
from sklearn.decomposition import PCA
pca = PCA(n_components=50).fit(fruits_2d)
fruits_pca = pca.transform(fruits_2d)
print('누적 설명된 분산 비율:', np.sum(pca.explained_variance_ratio_))
fruits_inv = pca.inverse_transform(fruits_pca).reshape(-1, 100, 100)
# for s in [0,100,200]: draw_fruits(fruits_inv[s:s+100])
pca90 = PCA(n_components=0.9).fit(fruits_2d)
print('누적 90% 충족 주성분 수:', pca90.n_components_)
5주차를 마치며
이번 주에는 평균 이미지와 거리만으로도 클러스터의 윤곽을 확인했고, k-평균으로 이를 자동화해 labels_와 클러스터 중심으로 결과를 해석했으며 엘보우로 k 선택을 점검했습니다. PCA로 차원을 줄인 뒤에도 누적 설명된 분산 비율이 높았고 재구성으로 손실을 확인했으며, 축소 특성으로 작업하니 계산이 가벼워지고 수렴이 안정적이었습니다.
기본 숙제(필수) : k-평균 알고리즘 작동 방식 설명하기
K-평균 알고리즘은 처음에 k개의 클러스터 중심을 무작위로 정하고 각 데이터를 가장 가까운 중심에 배정해 클러스터를 만듭니다. 그런 다음 각 클러스터에 속한 데이터의 평균으로 중심을 다시 계산하고, 새 중심에 맞춰 다시 배정하는 과정을 할당이 더 이상 바뀌지 않거나 변화가 매우 작아질 때까지 반복하여 최종적으로 k개의 클러스터를 구성하는 방법입니다.
추가 숙제(선택) : Ch.06(06-3) 확인 문제(p.354) 풀고, 설명하기
1. 특성이 20개인 대량의 데이터셋이 있습니다. 이 데이터셋에서 찾을 수 있는 주성분 개수는 몇 개일까요?
① 10개
② 20개
③ 50개
④ 100개
정답: 2번 과일 사진의 경우 10,000개의 픽셀이 있기 때문에 10,000개의 특성이 있는 셈이죠. (교재 336p)
2. 샘플 개수가 1,000개이고 특성 개수는 100개인 데이터셋이 있습니다. 즉 이 데이터셋의 크기는 (1000, 100) 입니다. 이 데이터를 사이킷런의 PCA 클래스를 사용해 10개의 주성분을 찾아 변환했습니다. 변환된 데이터셋의 크기는 얼마일까요?
① (1000, 10)
② (10, 1000)
③ (10, 10)
④ (1000, 1000)
정답: 1번. 사이킷런 PCA에서 n_components=10으로 설정해 10개의 주성분으로 변환하면, 샘플 수는 그대로 (1000)이고 특성 수만 100에서 10으로 줄어들어 결과 크기는 (1000, 10)이 됩니다. (교재 340p)
3. 2번 문제에서 설명된 분산이 가장 큰 주성분은 몇 번째인가요?
① 첫 번째 주성분
② 다섯 번째 주성분
③ 열 번째 주성분
④ 알 수 없음
정답: 1번. PCA는 분산(=고유값)이 큰 순서대로주성분을 정렬하기 때문에, 첫 번째 주성분이 가장 큰 분산을 갖고, 그 다음이 두 번째, 세 번째 순서입니다.
4. 사이킷런의 PCA 클래스에 대해 올바르게 설명한 것은 무엇인가요?
① 모델을 훈련한 후 새로운 샘플을 변환할 수 없습니다.
② 모델을 훈련한 후 새로운 샘플의 레이블을 예측할 수 있습니다.
③ PCA로 변환된 데이터를 사용해 원본 데이터를 복원할 수 없습니다.
④ 설명된 분산의 비율은 explained_variance_ratio_ 속성에 저장되어 있습니다.
정답: 4번. 주 성분이 전체 분산에서 차지하는 비유링 이 배열에 들어갑니다.
1. PCA는 비지도 학습 변환기라서 fit 후에 transform으로 새 샘플을 얼마든지 변환할 수 있습니다.
2. PCA는 분류기가 아니라 차원 축소기라 레이블 예측 기능이 없습니다.
3. inverse_transform으로 원본을 “근시적으로” 복원할 수 있습니다.