본문 바로가기
Study/혼자 공부하는 머신러닝 + 딥러닝

[혼자 공부하는 머신러닝 + 딥러닝] 군집 알고리즘

by kimdapadata 2024. 11. 13.

 

 

만약 타깃을 모르는 사진을 종류별로 분류하려 한다면 어떤 머신러닝 알고리즘을 써야 할까요?

바로 비지도 학습(Unsupervised learning)입니다.

 

 

한번 실습해보면서 알아보겠습니다.

 

 

데이터 준비


 

전과는 다르게 이번에는 과일 데이터를 사용해보겠습니다.

과일 데이터는 사과, 바나나, 파인애플을 담고 있는 흑백 사진입니다.

 

데이터 가져오기

 

 

이 배열의 첫 번째 차원(300)은 샘플의 개수, 두 번째 차원(100)은 이미지 높이, 세 번째 차원(100)은 이미지 너비입니다.

즉, 이미지 크기는 100 x 100이고 각 픽셀은 넘파이 배열의 원소 하나에 대응합니다.

이는 곧, 배열의 크기가 100 x 100이라는 걸 알 수 있습니다.

 

 

한번 첫 번째 이미지의 첫 번째 행을 출력해보겠습니다.

 

 

이 넘파이 배열은 흑백 사진을 담고 있으므로 0~255까지의 정숫값을 가집니다.

이를 좀 더 이해하기 쉽게 첫 번째 이미지를 그림으로 그려서 이 숫자와 비교해보겠습니다.

 

사과인 듯 하다.

 

 

위에 출력한 첫 번째 행은 이 사과의 이미지의 첫 번째 출력한 배열 값이 됩니다.

0에 가까울수록 검게 나타나고, 높아질수록 점점 밝게 표시됩니다.

더보기

여기서 잠깐!

왜 0에 가까울수록 검게 나타나고, 높아질수록 밝게 표시될까?

이는 다음과 같습니다.

알고리즘이 어떤 출력을 만들기 위해 덧셈, 곱셈을 합니다.

만약, 픽셀값이 0이면 출력도 0이 되어 의미가 없어집니다.

그럼 우리는 바탕보다 물체에 집중해야 하기 때문에 바탕을 검게 만들고 물체를 밝게 만드는게 낫겠죠?

또한 픽셀값이 높으면 출력값도 커지기 때문에 의미를 부여하기 좋기 때문도 있습니다.

 

그럼 이를 우리 눈에 보기 좋게 출력을 해보겠습니다.

camp 매개변수를 'gray_r'로 지정하면 색이 반전이 된다.

 

 

지금은 색이 반전되었기 때문에 밝은 부분은 0에 가깝고 어두운 부분은 255에 가깝습니다.

사과말고 바나나와 파인애플도 출력해보겠습니다.

 

 

잘 나오는 것을 확인할 수 있습니다.

참고로 이 데이터에는 사과가 100개, 파인애플 100개, 바나나 100개가 순서대로 존재합니다.

그럼 각 과일 사진의 평균을 내어 차이를 확인 해보도록 하겠습니다.

 

 

 

픽셀값 분석하기


 

시작 전, fruits 데이터를 사용하기 편하게 바꾸겠습니다.

reshape를 -1로 지정하면 자동으로 남은 차원을 할당시켜준다.

 

 

우선 과일 별로 데이터를 나눈 후 100 x 100 사진을 길이가 10000인 1차원 배열로 만들었습니다.

이렇게 바꾸는 이유는 배열을 계산하기 편하게 하기 위함입니다.

 

 

이제 각 과일의 배열에 들어 있는 샘플의 평균 픽셀값을 계산해보겠습니다.

현재 샘플은 모두 가로로 값을 나열했으니 열 방향으로 계산하겠습니다.

 

axis = 0 : 행 방향, axis = 1 : 열 방향

 

 

좀 더 보기 편하게 히스토그램으로 나타내보겠습니다.

alpha : 투명도를 조절해주는 파라미터, 1보다 작게 하면 투명해짐.

 

 

히스토그램을 보면 바나나의 평균값은 40 아래에 집중되어 있습니다.

사과와 파인애플은 90~100 사이에 집중되어 있습니다.

즉, 픽셀 평균값만으로 바나나는 다른 과일과 확실하게 구분이 됩니다.

왜냐면 바나나는 사진에서 차지하는 영역이 작기 때문입니다.

 

 

반면 사과와 파인애플은 픽셀 평균값만으로는 구분이 쉽지 않은 걸 확인할 수 있습니다.

둘 다 동그랗고 사진에서 차지하는 크기도 비슷하기 때문입니다.

 

 

이를 분리하기 위해 이번에는 샘플의 평균값이 아닌 픽셀별 평균값을 비교해보도록 하겠습니다.

이를 위해서는 아까와 반대로 행 방향으로 계산을 해보겠습니다.

순서대로 사과, 파인애플, 바나나이다.

 

 

3개의 그래프를 보면 과일마다 값이 높은 구간이 다릅니다.

 

 

픽셀 평균값을 100 x 100 크기로 바꿔서 이미지처럼 출력 후에 비교해보겠습니다.

픽셀을 평균 낸 이미지는 모든 사진을 합쳐 놓은 대표 이미지로 생각할 수 있습니다.

 

 

세 과일은 픽셀 위치에 따라 값의 크기가 차이 납니다.

만약, 대표 과일 이미지가 있다면 사과, 파인애플, 바나나를 구분할 수 있지 않을까요?

 

 

 

평균값과 가까운 사진 고르기


 

사과 사진의 평균값인 apple_mean과 가장 가까운 사진을 골라보겠습니다.

절댓값 오차를 사용할 것이고, fruits 배열에 있는 모든 샘플에서 apple_mean을 뺀 절댓값의 평균을 계산하겠습니다.

abs() : 절댓값 함수

 

 

abs_diff는 (300, 100, 100) 크기의 배열입니다.

따라서 각 샘플에 대한 평균을 구하기 위해 axis를 (1, 2)로 지정한 것입니다.

이렇게 계산한 abs_mean은 각 샘플의 오차 평균이므로 크기가 (300, )인 1차원 배열입니다.

 

 

그다음, 이 값이 가장 작은 순서대로 100개를 골라 보겠습니다.

즉, apple_mean과 오차가 가장 작은 샘플 100개를 골라 보겠습니다.

그 후 10 x 10 격자로 이루어진 그래프로 나타내보겠습니다.

결과

 

 

apple_mean과 가장 가까운 사진 100개를 골랐더니 모두 사과가 나온 것을 확인할 수 있었습니다.

 

 

 

이렇게 비슷한 샘플끼리 그룹으로 모으는 작업을 군집(Clustering)이라고 합니다.

군집은 대표적인 비지도 학습 작업 중 하나이고, 군집 알고리즘에서 만든 그룹을 클러스터(Cluster)라고 합니다.

 

 

 

출처 : 혼자 공부하는 머신러닝 + 딥러닝

https://product.kyobobook.co.kr/detail/S000001810330

 

다음 장에서는 k-평균에 대해서 알아보겠습니다.