본문 바로가기

머신러닝/혼자 공부하는 머신러닝

14강 흑백 이미지 분류 방법과 비지도 학습, 군집 알고리즘 이해하기

이 글은 https://www.youtube.com/watch?v=u-G_sV7P_aA&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=14 보고 공부한 글입니다.

 

지난 시간에 

앙상블 알고리즘을 배웠다.

여러개의 알고리즘을 모아서 예측값을 합쳐서 더 나은 모델을 만드는 것이다.

 

 

비지도 학습 

과일사진을 종류별로 모으고 싶다.

 

과일을 분류할 수 있는 것을 해보자.

타겟이 없고 특성데이터만 사용한다.

 

비지도 학습의 2가지 방법은 군집, 차원축소가 있다. 

 

과일 데이터 준비하기 

.npy는 numpy확장자이다.

 

!가 맨 앞에있다면 shell 명령어이다.

 

배열의 크기는 .shape으로 알 수 있다. = (300, 100, 100)

 

300개 샘플, 각 샘플은 100x100 이미지 이다.

 

 

샘플 확인 

첫번째 샘플의 첫번째 행만 출력해본다.

첫번째 행의 100개의 원소가 나올 것이다.

 

imshow()로 numpy의 값을 이미지를 출력할 수 있다.

cmap이라는 매개변수로 사용할 색깔의 정도를 정할 수 있다.

 

하얀색이 높은 값이고 검은 부분은 낮은 값이다. 

0~255값으로 컬러를 정의하는데

0이 어두운색, 255가 흰색을 뜻한다. 

 

gray_r로 하면 반전해서 그려준다.

이렇게하면 흰색과 검은색이 반전된다.

 

 

샘플 차원 변경하기 

샘플 차원을 그대로 두고 100x100을 하나로 묶어서 10000으로 바꿨다. 

 

1열로 쭉펼쳤다. 

100개의 사과가 있고 100000개의 픽셀이 있는 형태이다. 

 

 

 

샘플 평균의 히스토그램 

 

2차원 배열로 바꿨으니 과일들은

 

100개의 행이 있고 10000개의 특색을 가진 열이 있다.

 

axis=0으로 하면 행을 따라가서 10000개의 값이 나올 것이다. 

 

axis=1으로 하면 열을 따라가서 행의갯수인 100개의 값이 나올 것이다.

 

 

x축 구간은 픽셀의 평균값이다.

y축은 빈도값이다. 

 

100x100에서 차지하는 부분을 픽셀로 나타낸 평균이 바나나가 제일 작다.

바나나가 길쭉하고 작기 때문이다.

 

 

픽셀의 평균의 히스토그램 

axix=0은 10000개의 픽셀 평균값이 나온다.

 

x축은 픽셀이고, y축은 평균값이다. 

 

subplots은 여러 그래프를 하나의 그래프로 합쳐서 보여줄 수 있다.

subplots(행,열) 

subplots(1,3) 

1개의 행에 3개의 열을 놓는 그래프를 정의한 것이다. 

 

 

평균 이미지 그리기 

다시 10000개의 픽셀을 100*100 행렬로 다시 바꾼다.

 

왼쪽은 사과 100개 평균 이미지라고 할 수 있다.

중간은 파인애플 100개 평균 이미지라고 할 수 있다.

오른쪽은 바나나 100개 평균 이미지라고 할 수 있다.

 

 

평균과 가까운 사진 고르기 

abs = 절대값을 구하기

fruits = 300개의 과일

apple_mean = 사과의 평균

 

abs_diff는 300*100*100 픽셀에서 사과를 뺀값이다. 

그러면 각 픽셀의 최소값을 구해야 한다.

 

왜냐하면 사과를 뺏는데 사과 평균과 비슷한 값이기 때문

 

axis=(1,2) 는 100*100을 뜻한다. 

 

abs_mean은 300개의 1차원 배열이 될 것이다. 

 

abs_mean이 가장 작은 것이 사과이미지와 가장 비슷한 것이다. 즉 사과가 될 것이다. 

 

 

300개 배열중에서 가장 작은 값이 어느 위치에 있는지 알아야 한다.

argsort()메서드를 사용하면 

sort해주고 가장 작은 값의 인덱스를 반환한다.

 

10*10 이미지를 그린다.

imshow()를 이용해서 fruits에 있는 것중에 apple_index를 넣어서 사과값을 찾아본다.

 

2중 for문으로 apple_index는 0~99까지 늘어날 것이다.

 

이렇게 하는 작업이 군집(clustering)이라고 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90