본문 바로가기
Python/머신러닝+딥러닝 Ⅰ

비지도학습 : 군집 알고리즘 기본

by Mr.DonyStark 2024. 3. 26.

□ 비지도학습 : 타깃이 없을때 사용하는 머신러닝 알고리즘임.

 예제

#라이브러리
import numpy as np
import matplotlib.pyplot as plt

#데이터 로드
fruits = np.load("../jupyterNotebook/data/fruits_300.npy")
print(f"차원 : {fruits.ndim}")
print(f"형태 : {fruits.shape}")
print("첫번째 차원은 샘플개수 300, 두번째 차원은 높이 100, 세번째 차원은 너비 100")
print("\n")
print(fruits[:3])

 

해당 데이터는 이미지파일로 0~255픽셀로 3차원 100행 100열 형태로 표현한 것임

#첫번째 행 데이터 출력
print(fruits[0,0,:])

#이미지화 : imshow
plt.imshow(fruits[0], cmap="gray")
plt.show()

#이미지화 : imshow 반전
plt.imshow(fruits[0], cmap="gray_r")
plt.show()

#이미지화 : imshow
fig, axs = plt.subplots(1,3)
axs[0].imshow(fruits[0], cmap="gray_r") #사과
axs[1].imshow(fruits[100], cmap="gray_r") #파인에플
axs[2].imshow(fruits[200], cmap="gray_r") #바나나
plt.show()

당초 0에 가까울수록 어둡지만, 코드와 같이 색상 반전을 통해 0에 가까울수록 하얀함

#픽셀값 분석
#픽셀값 분석을위해 2차원으로 차원축소 및 기존 100행 100열을 100*100으로 한행으로 펼침.
apple=fruits[0:100].reshape(-1,100*100)
pineapple=fruits[100:200].reshape(-1,100*100)
banana=fruits[200:300].reshape(-1,100*100)

print(f"축소 전 : {fruits[0:100][:1].shape}")
print(f"축소 후 : {apple.shape}")
print(apple[0:2])

기존 3차원에서 차원축소 및 행과 열을 한행으로 펼침

 

※ axis = 0 은 과일 자체의 전체 픽셀의 평균을 의미함.
axis = 1 은 과일 개당 픽셀의 평균을 의미함.

plt.hist(apple.mean(axis=1))
plt.hist(pineapple.mean(axis=1))
plt.hist(banana.mean(axis=1))
plt.legend(["apple","pineapple","banana"])

각 과일별 개당 픽셀의 평균을 시각화함

fig,axs = plt.subplots(1,3, figsize=(20,5))
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()

과일자체의 픽셀 평균을 subplot으로 시각화함

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)

fig, axs = plt.subplots(1,3, figsize=(20,5))
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()

과일자체의 픽셀 평균을 imshow를 통해 시각화. 해당 과일 자체의 픽셀평균값이 군집화의 기준으로 사용할 수 있음

abs_diff = np.abs(fruits - apple_mean) # 과일3종 자체의 픽셀 - 사과 자체의 픽셀 평균    [3차원 (300,100,100) - (100,100)]
print(abs_diff.shape)
abs_mean = np.mean(abs_diff, axis=(1,2)) # 위 차이의 개당 픽셀평균
print(abs_mean.shape)

apple_index = np.argsort(abs_mean)[:100]
fig, axs = plt.subplots(10,10, figsize=(10,10))
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()

당초 로우데이터에서 사과자체의 픽셀평균값을 빼고 나서의 수치가 기준이되었고, 해당 기준에 따라 분류한 결과임

 

'Python > 머신러닝+딥러닝 Ⅰ' 카테고리의 다른 글

비지도학습 : K-means(평균) 알고리즘  (0) 2024.04.06
Ensemble Model  (0) 2024.03.25
교차검증  (1) 2024.03.22
Decision Tree(결정트리 알고리즘)  (0) 2024.03.22
확률적경사하강법  (1) 2024.03.22