내 이야기를 들어주고 공감해 준다는 것이 큰 힘이 된다는 당연한 사실을 느끼는 한주였네요.. 누군가 나에게 이야기를 한다면 공감을 해주는 그런 사람이 되었으면 좋겠습니다..

 

2차원 데이타를 1차원으로 가공하여 데이타를 이용하는 것이 낯설었네요... 쉬운 데이타를 이용해서  책에 나온 비지도 학습의 k-means를 따라해봤어요.. 소스와 데이타 파일은 첨부해요..

 

numpy에서도 axis가 있네요.. pandas와 동일하네요... 정리하면서 왜 이리 깔끔하지 못해 투덜거렸는데... 원죄는 numpy일까???

apple_mean = np.mean(apple, axis=0).reshape(100, 100)

군집화(Clustering)

답/라벨없는 데이터 내에서 거리가 가까운 것들끼리 각 군집들로 분류하는 것이다 (분류라고 표현했지만, 지도학습인 classification과는 다르다). 즉 데이터 내에 숨어있는 패턴, 그룹을 파악하여 서로 묶는 것이라고 할 수 있다. 만약 라벨값이 존재하는 데이터라고 하더라도, 같은 라벨 내에서도 얼마든지 다른 군집으로 묶일 가능성이 있다.

 

Clustering(군집화) : 비슷한 샘플끼리 그룹으로 모으는 작업

Cluster(클러스터)  : 군집 알고리즘에 의해 만든 그룹

 

1 K-Means / K-평균

K-Means 클러스터링은 클러스터링에서 가장 일반적으로 사용되는 알고리즘으로, 군집 중심점(centroid)이라는 특정한 임의의 지점을 선택해 해당 중심에 가장 가까운 포인트들을 선택하는 군집화 기법이다. K-Means이므로 K개의 centroid를 지정한다. 이때 가장 가까운 포인트를 선택한다는 점에서 K-Means는 거리 기반 군집화 방법임을 알 수 있다

 

  1. 무작위로 k개의 클러스터 중심을 정한다.
  2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정한다
  3. 클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경한다.
  4. 클러스터 중심에 변화가 없을 때까지 2번으로 돌아가 반복한다.

 

2 K-평균 실습

모델이 얼마나 잘 학습하고 있나 확인을 위해 정답을 갖고 있는 데이타를 활용하여 결과를 비교하자. 질량, 크기(가로,세로), 색상으로 구성된 4개의 속성으로 ['apple' 'mandarin' 'orange' 'lemon'] 4 종류의 데이타 있다.

모델 학습 방법과, k개의 어떻게 찾는지 확인해 보자..

 

사용된 데이타. .mass, width, height, color만 featur로 사용한다.

 

1) 모델 학습과 예측

지도학습과 동일하게,, 전처리.모델학습, 예측을 진행한다.

그러나 정답이 없으므로 학습할때 학습데이타만 전달하고, 평가가 없다.

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

from sklearn.preprocessing import MinMaxScaler


X_fruits = fruits[['mass','width','height', 'color_score']].values
y_fruits = fruits[['fruit_label']] - 1

X_fruits_normalized = MinMaxScaler().fit(X_fruits).transform(X_fruits)  

kmeans = KMeans(n_clusters = 4, random_state = 0)
kmeans.fit(X_fruits_normalized)
print(f" 0번째 데이타의 예측 확인 : { kmeans.predict(X_fruits_normalized[0:1])}")

plot_labelled_scatter(X_fruits_normalized, kmeans.labels_, 
                      ['Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4'])

 

그래프는 첫번째, 두번째 feature를 이용하여 클러스터 결과를 보여준다. 가운데 부분에서 논란이 예상이 된다.

 

우리가 갖고 있는 정답과 모델이 예측한 값을 비교하니 다른 부분이 존재한다.

정답 label           : [[0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2
  2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]]
k-means model label : [0 0 0 1 1 1 1 1 3 3 3 3 3 0 0 0 0 0 3 3 3 3 3 3 2 2 2 0 1 3 3 3 3 0 0 0 3
 3 3 1 3 3 3 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1]

 

2) 최적의 k 값 찾기

4개로 분류된다는 지식으로 k=4를 사용하였다. 지식이 없다면, 적당한 k를 찾아야 한다.  엘보우 방법은 대표적인 갯수를 찾는 방식이다.

이너셔(inertia)는 클러스터 샘플이 얼마나 가까운지를 나타낸다. 클러스터의 중심과 샘플사이의 거리의 제곱 합이다.

클러스터 개수가 늘어나면 클러스터 개개의 크기는 줄어들기 때문에 이너셔도 줄어든다.  엘보우 방법은 클러스터 개수를 늘려가면서 이너셔의 변화를 관찰한다.

즉, 클러스터 개수를 증가시키면서 이너지를 그래프로 그리면 감소하는 속도가 꺽이는 지점을 선택한다. 아래 그림 처럼 꺽이는 부분이 4이고, 이를 선택한다.

 

 

inertia = []
for k in range(2, 7):
    km = KMeans(n_clusters=k, random_state=42)
    km.fit(X_fruits_normalized)
    inertia.append(km.inertia_)

plt.plot(range(2, 7), inertia)
plt.xlabel('k')
plt.ylabel('inertia')
plt.show()

 

 

3) 실습파일

k-means.ipynb
0.07MB

 

fruit_data_with_colors.txt
0.00MB

 

 

PCA 

PCA는  고차원의 데이터를 낮은 차원의 데이터로 바꿔줄 수 있다는 것인데, 중요한 것은 "어떻게 차원을 잘 낮추느냐" 이다. 즉, 10개의 컬럼의 데이타를 4개 또는 5개만 이용 할 수 있다.

 

(PCA는 선형대수를 좀 공부한 후에 정리를 해야겠네요...라이브러리만 쓰면 뭐 별게 아닌데... 왜 그럴까까지 따져 들어가려니..... 결국에 수학...... 고등수학에 머신러닝때문에 선형대수가 교과에 들어갔다고 하는데.. 긍정적이면서 불쌍해 보이기도하고...)

 

가령 우리에게는 아래와 같은 2차원 공간에 데이터들이 있다.
우리의 목표는 이 2차원 공간의 데이터를 1차원 공간의 데이터로 만들어 주는 것이다.
 차원 축소의 기본적인 컨셉. 여기에서 우리가 할수 있는 방법은 2가지 인데,

 

 

방법1 에서는 차원 x1, x2 에 냅다 데이터를 내려버렸다. 이렇게 할 경우 문제점은 내린 후에 값이 겹치는 데이터들이 많고, 아예 한 차원의 정보는 유실되게 된다.
반면 방법2 에서는 새로운 차원 (화살표) 에 데이터들을 내려줬다. 이렇게 한 결과 데이터들은 방법1에서의 문제를 어느정도 해결하게 된다.
여기서 중요한 것은 데이터들이 겹치지 않게 끔하는 화살표를 찾는 것!!!!

 

좌측에 사진처럼 2차원 상에서 무수히 다양한 화살표를 그릴 수 있다.
하지만 우리는 그 중 파란색 화살표 처럼 데이터를 해당 화살표에 1차원 으로 내렸을 때 겹치지 않게 하는 화살표를 찾아야 한다. (longest distance)
 정리하자면,

  1. 수많은 화살표 들 중, 데이터 들을 화살표에 내렸을 때, 데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴 화살표 찾기
  2. 거기에 데이터들을 투영
  3. (2차원 이상의 경우 2차원으로 만들고자 한다면)
    만약 또 하나의 화살표 만들 때 축 끼리는 직각이 되어야 함, 최대한 데이터가 겹치지 않도록

이를 선형대수학의 관점에서 해석하자면,

  1. 공분산 행렬에서 고유 벡터/고유값을 구하고
  2. 가장 분산이 큰 방향을 가진 고유벡터(e1) 에 입력데이터를 선형변환
  3. 고유벡터(e1) 과 직교하며, e1 다음으로 분산이 큰 e2 고유벡터에 또 선형변환.

1에서 행렬 A의 공분산 행렬의 고유벡터가 데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴 축의 벡터가 된다.(나중에 증명)
2에서 고유값이 가장 큰 것에 매핑되는 고유 벡터(e1)가 1의 고유 벡터 중 데이터의 분산이 가장 큰(데이터가 최대한 안 겹치게, 멀리 퍼지게 하는 길이가 긴) 축의 벡터가 된다.
3에서 2의 벡터와 직교하며 다음으로 고유값이 큰(다음으로 분산이 큰) 벡터(e2)를 찾는다.

 

 

PCA에 대해 깔끔하게 정리된 글... 필요성.. 원리는 어떠한지.. (결국 선형대수 T.T)

 

iris를 구분하기 위해서 4개의 컬럼을 2개의 컬럼을 이용해서 분석한다.   분산량이 작은 2개 컬럼을 제거하는 예제가 좋군

 

머신러닝 - PCA (Principal Component Analysis)

1. PCA(Principal Component Analysis) - 주성분 분석이란? 주성분이란 전체 데이터(독립변수들)의 분산을 가장 잘 설명하는 성분을 말한다. 변수의 개수 = 차원의 개수 e.g.) iris 데이터에서, 4개의 독립변인

velog.io

 

수학적 해석(?)이 있는 자료.. 투영, 편차, covariance

 

PCA (Principle Component Analysis) : 주성분 분석 이란?

1. PCA (주성분 분석) PCA는 대표적인 dimensionality reduction (차원 축소)에 쓰이는 기법으로, 머신러닝, 데이터마이닝, 통계 분석, 노이즈 제거 등 다양한 분야에서 널리 쓰이는 녀석이다. 쉽게 말해 PCA

ddongwon.tistory.com

 

'머신러닝 > 혼공 머신러닝' 카테고리의 다른 글

[혼공머신] 11기 6주가 끝이 났다.  (2) 2024.02.08
[혼공머신] 6주차 딥러닝  (0) 2024.02.06
[혼공머신] 4주차 트리 알고리즘  (2) 2024.01.31
[번외] Encoding의 필요성  (0) 2024.01.31
Resources  (0) 2024.01.31

+ Recent posts