Open danbi5228 opened 1 year ago
[작동 방식]
[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]])
labels에 클러스터 인덱스 존재, -1은 해당 샘플이 이상치로 판단되었다는 의미
eps: epsilon 파라미터
eps를 0.2로 증가해서 이웃의 범위를 넓히면 오른쪽 그래프처럼 완벽한 군집을 얻을 수 있음
predict() 메서드를 제공하지 않고 fit_predict()만 존재, 즉 새로운 샘플에 대해 클러스터를 예측할 수 없음
필요한 예측기를 추가로 선택해야 함, 예를 들어 핵심 샘플만 가지고 다시 예측기를 만들어서 새로운 샘플에 대해 클러스터 레이블을 예측
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])
x(j) ~ N( μ(j), Σ(j) )
)
from sklearn.mixture import GaussianMixture
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) # 모델의 밀도 추정
2022-10-04 pm10:20 1: 9.1.6 2: 9.1.7 3: 9.2.1 전까지