머신러닝+딥러닝

머신러닝 6일차 <군집 알고리즘> .2024.10.18

trustworthyhand 2024. 10. 18. 01:33

비지도 학습

타깃을 모르는 비지고학습 . 타깃 X . 특성데이터만 --있는경우

# 군집 알고리즘!
# 과일을 같은 과일별로 모으는 작업을 하고 싶다.
# 정답을 알지 못하는데 어떻게 사진을 종류대로 모을수 있을가요? (비슷하게 생긴거 끼리 모으면된다!)
   닮은애들끼리 모아둔다 = 군집화
 
"""
타깃을 모르는 사진을 종류별로 분석 비지도 학습
사과, 바나나 파인애플을 담고 있는 흑백사진 . 칼라와 흑백사진 구별 관련 데이터
 
코랩 코드 셀의 기능 [웹상의 가상 컴퓨터]
1. 파이썬 코드 치고 실행 !
2. 리눅스 시스템 명령어 치고 실행!   mkdir 폴더만들기
    시스템 명령어 => 앞에 느낌표 치고 해야함 !ls
!ls 리스트를 보여줌
!wget 웹상에 데이터를 다운로드 하겠다 / fruits_300.npy 이름으로 저장하겠다
"""
# - O 대문자 O임
!wget https://bit.ly/fruits_300_data -O fruits_300.npy
import numpy as np
import matplotlib.pyplot as plt
fruits = np.load("fruits_300.npy")

print(fruits.shape) # 과일데이터 는 (300, 100, 100) 300개의 샘플 개수와 100의 높이 100의 이미지 너비
                               (데이터 수, 이미지높이, 이미지너비)
 

 

print(fruits[0,0,:] 

print(fruits.shape)
# (300, 100, 100) 300개의 샘플 개수와 100의 높이 100의 이미지 너비 (이미지장수, 이미지높이, 이미지너비)

print(fruits[0,0,:])  
# 첫번째 샘플이며 100 *100 = 10,000개의 데이터는 번거로워서 100개의 행말고 첫번째 행 의 모든 열 출력한다
# 2차원 배열을 받으면 이미지 형태로 보여주는 함수
# cmap: 보여줄 이미지의 색상 코드를 키워드로 넣는 매개변수 . / 'gray_r' 백색으로 바꿀수도 있음.
plt.imshow(fruits[0], cmap= 'gray')
plt.show()
 

300개 데이터 100*100픽셀   흑백사진 데이터에서  0은 가장 어두운 블랙        255은 가장 밝은 흰색 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
plt.imshow(fruits[0], cmap= 'gray_r')
plt.show()

 

 

fruits[0]  

과일데이터의 첫번째 데이터를 이미지로 보여줌

 

맷플릇립의 imshow()함수를 사용하면 넘파이

배열로 저장된 이미지를 나타낼수있음.

 

왼쪽 사과 이미지에서 밝은부분은 0에 가깝고

짙은 부분은 255에 가까운 값이라는것을 

기억 하자

 

이미지 분석시 머신러닝은 0보다
높은 수치 위주로 분석한다.
 
피사체가 밝을수록 분석이 용이하다.

 

 

# subplot 여러개 그래프 한번에 그리기 (행,열)  한줄에 2개를 그리겠다 (1,2)

fig는 matplotlib에서 생성되는 전체 그림(figure) 영역을 나타내는 객체

fig, axs = plt.subplots(1,2)                     # 1행 2열 서브플롯

axs[0].imshow(fruits[100], cmap = 'gray_r')       # 100번째  파인애플

axs[1].imshow(fruits[200], cmap = 'gray_r')       # 200번째  바나나

plt.show()

 

 

# 각 과일 이미지 배열을 1차원 형태로 변경합니다.

# reshape(-1)의 의미    -1이 사용된 위치의 차원 크기를 자동으로 계산하여 배열의 총 크기가 유지

                                                                                            #  즉 100개의 이미지

apple = fruits[0:100].reshape(-1, 100*100)               # 0부터 99번 까지 사과   (1열 , 만개의 데이터 샘플)

pineapple = fruits[100:200].reshape(-1, 100*100)    # 100부터  199번 까지 파인애플 

banana = fruits[200:300].reshape(-1, 100*100)        #  200에서부터 299번 까지 바나나


# 배열의크기는 (100,10000) 1차원배열로 만들기

print(apple.shape)                                           # (100, 10000) 

print(pineapple.shape)                                    # (100, 10000)   

print(banana.shape)                                        # (100, 10000) 

 

# 픽셀의 평균값 :

# axis 는 배열의 축을 말합니다.
# axis=0 행 방향(세로)  / axis=1 열 방향(가로)

 

print(apple.mean(axis=1))
# 사과샘플 100개에 대한 픽셀 평균값을 계산
# 88.3346 사과의 첫번째 이미지의 평균 픽셀 값

#히스토그램(통계기반 사과가 몇개있다 ) : 값이 발생한 빈도를 그래프로 표시한것.

# import numpy as np

# import matplotlib.pyplot as plt

 

히스토그램(histogram) : 

데이터를 구간별로 나누어 각 구간에 해당하는  데이터의 빈도를 나타내는 그래프

가로축 (X축): 데이터의 구간 ,

세로축 (Y축): 각 구간에 속하는 데이터의 개수 특정 구간에 몇 개의 데이터가 속하는지 빈도

# 히스토그램 그리기

# 사과 평균 히스토그램

plt.hist(np.mean(apple, axis=1), alpha = 0.8)       

plt.hist(np.mean(pineapple, axis=1), alpha = 0.8)

plt.hist(np.mean(banana, axis=1), alpha = 0.8)

# 범례추가

plt.legend(['apple','pineapple','banana'])              

# 그래프 출력

plt.show()                                                               

# 픽셀의 평균값을 구해보자 

# import numpy as np

# import matplotlib.pyplot as plt

 

fig, axs = plt.subplots(1,3, figsize = (20,5))

# 1, 3은 1행 3열의 서브플롯을 생성합니다. 즉, 한 줄에 3개의 그래프를 배치합니다.

# figsize=(20, 5)는 전체 그래프의 크기를 20x5인치로 설정합니다.

# axis=0을 사용하여 각 픽셀 위치에 대한 평균값

# range(10000)은 0부터 9999까지의 범위를 생성합니다.

axs[0].bar(range(10000), np.mean(apple, axis = 0))

axs[1].bar(range(10000), np.mean(pineapple, axis = 0))

axs[2].bar(range(10000), np.mean(banana, axis = 0))

plt.show()

x축은 각 픽셀의 위치(0부터 9999까지)를 나타내고, y축은 해당 위치의 픽셀 평균값을 나타냅니다.

# 각 파일 데이터의 평균을 계산하고 100x100형태로 변환한다

# np.mean(apple, axis=0): 사과 데이터의 평균을 계산합니다. # axis=0은 각 열의 평균을 의미

 # 사과의 평균 이미지

apple_mean = np.mean(apple, axis=0). reshape(100,100)         
# 파인애플 평균 이미지
pineapple_mean = np.mean(pineapple, axis=0). reshape(100,100)  
# 바나나의 평균 이미지
banana_mean = np.mean(banana, axis=0). reshape(100,100)        

 

#서브플릇을 생성
# imshow(): 이미지를 표시하는 함수입니다.
# cmap='gray_r': 그레이스케일 색상 맵을 사용합니다. /_r 흑백반전

 

#(여러개 그래프를 그리기 위한 그림판이라 생각하자!)  figsize=(20, 5): 전체 그림의 크기를 설정
fig, axs = plt.subplots(1, 3, figsize = (20,5))           # 1행 3열의 서브플릇을 만든다.
axs[0].imshow(apple_mean, cmap= 'gray_r')          # 첫 번째 서브플릇 : 사과
axs[1].imshow(pineapple_mean, cmap= 'gray_r')     # 두 번째 서브플릇 : 파인애플
axs[2].imshow(banana_mean, cmap= 'gray_r')        # 세 번째 서브플릇 : 바나나

 

# 그래프 표시

plt.show()

사과100개 평균이미지 , 파인애플 100개 평균 이미지 바나나 100개 평균 이미지

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

'''

사과의 평균 이미지와 다른 과일들의 이미지 간의 절대 차이를 계산한 후,

그 차이의 평균을 구하는 작업을 수행
np.abs(): 이 차이의 절대값을 구합니다/차이가 양수로 변환
'''
# 각 과일과 사과 평균 이미지 간의 절대 차이 계산
abs_diff = np.abs(fruits- apple_mean)         # fruits와 apple_mean 간의 절대 차이

 

# 차이의 평균을 계산 (각 과일마다)
abs_mean = np.mean(abs_diff, axis=(1,2))    # (1, 2) 축에 대해 평균 계산

 

# 결과의 형태 출력
print(abs_mean.shape)

 

 

# abs_mean 배열을 기준으로 인덱스를 정렬하여 가장 유사한 100개의 과일 인덱스를 선택

# [:100]: 가장 작은 100개의 인덱스를 선택하여 사과의 평균 이미지와 가장 유사한 100개의 과일 이미지를 선택합니다
apple_index = np.argsort(abs_mean)[:100]

 

# 10x10 서브플롯 생성
fig, axs = plt.subplots(10, 10, figsize = (10,10)) #10행10열 그래프 픽셀 사이즈 10*10

 

# 행에 반복접근하는 반복자 I
# 열에 반복접근하는  반복자 j
for i in range(10) :
  for j in range(10) :
    # 선택한 과일 이미지를 표시
    axs[i,j].imshow(fruits[apple_index[i*10 +j]], cmap = 'gray_r')
    axs[i,j].axis('off') # 축에 눈금 및 레이블을 끄기
plt.show

 

apple.shape =>
(100, 10000)