핵심 키워드
- #비지도 학습 #히스토그램 #군집
- 흑백 사진을 분류하기 위해 여러 가지 아이디어를 내면서 비지도 학습과 군집 알고리즘을 이해하자
타깃을 모르는 비지도 학습
- 비지도 학습
타깃을 모르는 사진을 종류별로 분류하는 것과 같이
타깃이 없을 때 사용하는 머신러닝 알고리즘을 비지도 학습이라고 하며, 비지도 학습에는 군집과 차원 축소가 존재
즉, 타깃은 없고 특성 데이터만 존재
과일 사진 데이터 준비하기
- 과일 데이터 준비하기
사과, 바나나, 파인애플을 담고 있는 흑백 사진 과일 데이터는 넘파이 배열의 기본 저장 포맷인 npy 파일로 저장되어 있으며
이 파일에서 데이터를 로드하기 위해 load() 메소드를 사용
첫 번째 차원(300)은 샘플의 개수를 나타내고, 두 번째 차원(100)은 이미지 높이, 세 번째 차원(100)은 이미지 너비를 나타냄
그러므로 이미지 크기는 100 x 100이며 각 픽셀은 넘파이 배열의 원소 하나에 대응하므로 배열의 크기도 100 x 100
- 샘플 확인
첫 번째 이미지의 첫 번째 행을 출력하기 위해서는 3차원 배열이기 때문에 처음 2개의 인덱스를 0으로 지정하고
마지막 인덱스는 지정하지 않거나 슬라이싱 연산자를 사용해 첫 번째 이미지의 첫 번째 행을 모두 선택할 수 있음
첫 번째 행에 있는 픽셀 100개에 들어 있는 값을 출력하면 이 넘파이 배열은 흑백 사진을 담고 있으므로 0 ~ 255 정숫값을 가짐
이후 맷플롯립의 imshow() 메소드를 사용해 위의 넘파일 배열로 저장된 이미지를 그리게 되면
첫 번째 행인 꼭지 부분이 위에서 출력한 배열 값에 해당하며 0에 가까울수록 검게 나타나고 255인 높은 값은 밝게 표시됨
위와 반전되어 눈에 보기 좋게 출력하기 위해서는 cmap 매개변수에 gray가 아닌 gray_r을 지정하며
밝은 부분은 0에 가깝고 짙은 부분이 255에 가까운 값이 됨
픽셀값 분석하기
- 샘플 차원 변경하기
사용하기 쉽게 fruits 데이터를 사과, 파인애플, 바나나로 각각 나누며
이 때 100 x 100 이미지를 펼쳐서 길이가 10000인 1차원 배열로 만들어 배열을 계산할 때 편리하도록 함
이를 위해 fruits 배열에서 순서대로 100개씩 선택하기 위해 슬라이싱 연산자를 사용한 후
reshape() 메소드를 사용해 두 번째 차원(100)과 세 번째 차원(100)을 10000으로 합치고
첫 번째 차원인 샘플 개수 차원을 -1로 지정하여 자동으로 남은 차원인 첫 번째 차원을 할당하도록 함
이로 인해 크기가 (300, 100, 100)인 fruits 배열은 각 apple, pineapple, banana 배열에 크기가 (100, 10000)로 바뀜
(샘플의 개수, 이미지 높이, 이미지 너비) → (샘플의 개수, 픽셀의 개수)
- 샘플 평균의 히스토그램 (샘플의 평균값 = 각 샘플이 차지하는 픽셀의 평균값)
apple, pineapple, banana 배열을 각각 나누었으므로 각 배열에 들어있는 샘플의 픽셀 평균값을 계산하도록 함
axios=0으로 하면 첫 번째 축인 행을 따라 계산하고, axis=1로 지정하면 두 번째 축인 열을 따라 계산하게 되므로
우리는 샘플의 평균값이 필요하며 샘플은 모두 가로로 값을 나열했으므로 axis=1로 지정하여 평균을 계산
이후 각 샘플에 대한 평균값을 히스토그램으로 그려 모두 겹쳐보아 평균값이 어떻게 분포되어 있는지 보도록 함
바나나 사진의 평균값은 40 아래에 집중되어 있고, 사과와 파인애플은 90~100 사이에 많이 모여 있음
바나나는 사진에서 차지하는 영역이 작기 때문에 평균값이 작아, 픽셀 평균값만으로 사과나 파인애플과 확실히 구분됨
반면 사과와 파인애플은 많이 겹쳐있어서 픽셀값만으로는 구분하기 쉽지 않음
- 픽셀 평균의 히스토그램 (픽셀별 평균값 = 전체 샘플이 차지하는 각 필셀의 평균값)
샘플의 평균값이 아니라 픽셀별 평균값을 비교하도록 함
픽셀의 평균을 계산하기 위해서는 axis=0으로 지정하면 됨
그리고 픽셀 10000개에 대한 평균값을 subplots() 함수로 3개의 서브 그래프에 막대 그래프를 그리도록 함
살펴보면 과일마다 값이 높은 구간이 다른 것을 볼 수 있음
사과는 사진 아래쪽으로 갈수록 값이 높아지고, 파인애플 그래프는 비교적 고르면서 높으며, 바나나는 중앙의 픽셀값이 높음
- 평균 이미지 그리기
픽셀 평균값을 100 x 100 크기로 바꿔서 이미지처럼 출력하도록 함 (10000개의 일차원 배열 → 이차원 배열)
이를 보면 세 과일은 픽셀 위치에 따라 값의 크기가 차이가 나므로 이 대표 이미지와 가까운 사진을 고르면 과일을 구분할 수 있음
평균값과 가까운 사진 고르기
- 평균과 가까운 사진 고르기
사과 사진의 평균값인 apple_mean과 가장 가까운 사진을 고르기 위해서
fruits 배열에 있는 모든 300개의 샘플에서 apple_mean을 뺀 절댓값의 평균을 계산하며
3차원 배열(300, 100, 100)에 대한 각 샘플에 대한 평균을 구하기 위해서는 axis에 두 번째, 세 번째 차원을 모두 지정하도록 함
이 계산 결과로는 각 샘플의 오차 평균이므로 크기가 (300,)인 1차원 배열이 나타나게 됨
그리고 이 값이 가장 작은 순서대로 100개를 고르도록 하여 apple_mena과 오차가 가장 작은 샘플 100개를 고르도록 함
그리고 np.argsort() 함수를 이용해 작은 것에서 큰 순서대로 배열의 인덱스를 반환하고 처음 100개를 선택함
그러면 이들은 apple 평균 이미지와 가까운 100개이므로 사과 이미지를 예상할 수 있으며
subplots() 함수로 10 x 10, 총 100개의 서브 그래프를 만들면 100개 모두 사과인 것을 볼 수 있음
이렇게 흑백 사진에 있는 픽셀값을 사용해 과일 사진을 모으는 작업처럼 비슷한 샘플끼리 그룹으로 모으는 작업은 군집
하지만 우리는 이미 사과, 파인애플, 바나나가 있다는 것을 알고 있으므로 타깃값을 알고 있던 것
하지만 실제 비지도 학습에서는 타깃값을 모르기 때문에 타깃값을 모르면서 과일의 평균값을 찾는 방법이 필요함
+) 확인 문제
- 바나나 사진의 평균 banana_mean과 비슷한 사진 100장을 찾아 출력
- 2개를 제외하고 모두 바나나가 찾아짐
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 06. 비지도 학습 - 주성분 분석 (0) | 2022.06.30 |
---|---|
[혼공머신] 06. 비지도 학습 - k-평균 (0) | 2022.06.29 |
[혼공머신] 05. 트리 알고리즘 - 트리의 앙상블 (0) | 2022.06.01 |
[혼공머신] 05. 트리 알고리즘 - 교차 검증과 그리드 서치 (0) | 2022.06.01 |
[혼공머신] 05. 트리 알고리즘 - 결정 트리 (0) | 2022.05.30 |