혼자공부하는 머신러닝 딥러닝 개정판 5주차

[혼공머신] 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으로 원본을 “근시적으로” 복원할 수 있습니다.



Posts created 242

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top

원활한 서비스 이용을 위한 안내

현재 광고 차단 프로그램이 켜져 있습니다. 이로 인해 사이트의 일부 기능이 제한될 수 있으니, 쾌적한 이용을 위해 광고 차단 해제 후 새로고침 부탁드립니다.