njs03332 / ml_study

3 stars 0 forks source link

2022/09/29 ~ 2022/10/04 #45

Open danbi5228 opened 1 year ago

danbi5228 commented 1 year ago

2022-10-04 pm10:20 1: 9.1.6 2: 9.1.7 3: 9.2.1 전까지

image

njs03332 commented 1 year ago

9.1.7 다른 군집 알고리즘

givitallugot commented 1 year ago

9.1.6 DBSCAN

[작동 방식]

[ex 반달 모양 데이터 셋]

from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN

X, y = make_moons(n_samples=1000, noise=0.05, random_state=42)
dbscan = DBSCAN(eps=0.05, min_samples=5)
dbscan.fit(X)
# DBSCAN(eps=0.05)

dbscan.labels_[:10]
# array([ 0,  2, -1, -1,  1,  0,  0,  0,  2,  5])

dbscan.core_sample_indices_[:10] # 핵심 샘플의 인덱스
# array([ 0,  4,  5,  6,  7,  8, 10, 11, 12, 13])

dbscan.components_[:3]
# array([[-0.02137124,  0.40618608],
#         [-0.84192557,  0.53058695],
#         [ 0.58930337, -0.32137599]])
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=50)
knn.fit(dbscan.components_, dbscan.labels_[dbscan.core_sample_indices_])

X_new = np.array([[-0.5, 0], [0, 0.5], [1, -0.1], [2, 1]])
knn.predict(X_new)
# array([1, 0, 1, 0])



danbi5228 commented 1 year ago

9.2 가우시안 혼합

n_init : k평균처럼 나쁜 솔루션으로 수렴할 수 있으므로 여러번 실행하도록 10으로 설정. 기본값은 1

gm = GaussianMixture(n_components=3, n_init=10) gm.fit(X)

gm.weights # 추정 가중치 --> 실제 데이터 생성할 때 사용한 가중치 값과 매우 유사 gm.means # 평균 gm.covariances_ # 분산 행렬

gm.converged_ # 수렴 여부. True or False 를 리턴 gm.niter # 반복 횟수

- 해당 클래스는 기댓값-최대화 Expectation-maximization (EM) 알고리즘을 사용함
- EM 알고리즘은 클러스터 파라미터를 랜덤하게 초기화하고 수렴할 때까지 두 단계를 반복함
  - 기댓값 단계: 현재 클러스터 파라미터에 기반해서 각 클러스터에 속할 확률을 예측
  - 최대화 단계: 각 클러스터가 데이터셋에 있는 모든 샘플을 사용해 업데이트 됨. 클러스터에 속할 추정 확률로 샘플에 가중치가 적용됨
  - 군집 입장에서 EM을 클러스터 중심 뿐만 아니라 크기, 모양, 방향과 클러스터의 가중치를 찾는 k-평균의 일반화로 생각할 수 있음
  - k 평균은 EM과 같은 소프트 클러스터 할당이 아닌, 하드 클러스터 할당 방식 (확률 예측 대신, 가장 비슷한 클러스터에 바로 할당)

```python
gm.predict(X) # 하드 군집
gm.predict_proba(X) # 소프트 군집

X_new, y_new = gm.sample(6) # 가우시한 혼합 모델은 생성모델이므로 새로운 샘플을 만들 수 있음 (반환된 샘플은 클러스터 인덱스 순 정렬)

gm.score_samples(X) # 모델의 밀도 추정