디리클레 프로세스는 군집갯수를 구하기 위해 사용할 수 있습니다.

디리클레 프로세스는 군집갯수를 구하기 위해 사용할 수 있습니다.
Photo by Divyanshi Verma / Unsplash

Dirichlet Process (디리클레 과정)

  • **Dirichlet Process (DP)**는 무한 차원의 확률분포로, 클러스터링 문제에서 군집의 개수가 미리 정해지지 않은 경우에 유용하게 사용됩니다.
  • DP는 기존의 Dirichlet Distribution를 확장한 것으로, 데이터 포인트들이 서로 다른 군집에 속할 확률을 정의합니다.
    • Dirichlet Distribution은 확률벡터(즉, 모든 원소가 0과 1 사이의 값을 가지며, 전체 합이 1이 되는 벡터)를 생성하는 다변량 확률 분포입니다.
      • 이 분포는 다항분포(Multinomial Distribution)의 사전 분포(Prior Distribution)로 자주 사용됩니다. $$\text{Dir}(\mathbf{x} | \alpha) = \frac{1}{B(\alpha)} \prod_{i=1}^K x_i^{\alpha_i - 1}$$

        • $\mathbf{x} = (x_1, x_2, \dots, x_K)$는 확률벡터로, $x_i \geq 0$이고, $\sum_{i=1}^K x_i = 1$입니다.
        • $\alpha = (\alpha_1, \alpha_2, \dots, \alpha_K)$는 양수 파라미터 벡터로, 이 값을 통해 각 차원의 분포 모양이 결정됩니다.
        • $B(α)$는 정규화 상수로, 각 $\alpha_i$ 값에 따라 Dirichlet 분포의 확률 밀도를 정상화하는 역할을 합니다.
  • Dirichlet Process는 다음과 같이 정의됩니다$$G∼DP(α,H)$$
    • $\alpha$는 농도 매개변수로, 새로운 군집이 생성될 빈도를 조절합니다.
    • $H$는 기본 분포로, DP에서 샘플링된 분포들이 따르게 될 기준이 되는 분포입니다.
  • Dirichlet Process는 다음과 같이 작동합니다:
    • 첫 번째 데이터 포인트는 기본 분포 $H$에서 샘플링된 값을 따릅니다.
    • 이후 데이터 포인트는 기존 군집에 속할 확률과 새로운 군집을 형성할 확률을 가지며, 이 확률은 농도 매개변수 $\alpha$에 따라 조절됩니다.
  • Dirichlet Process는 확률 과정의 한 유형으로, 특히 비매개변수 베이지안 통계에서 사용됩니다. 이 과정은 데이터를 군집화할 때 각 데이터가 특정 군집에 속할 확률을 모델링하는 데 사용됩니다.
    • 확률 과정(Probabilistic Process 또는 Stochastic Process)은 시간이나 공간과 같은 어떤 지표에 따라 변하는 확률적 현상을 수학적으로 모델링하는 것을 말합니다. 쉽게 말해, 시간의 흐름에 따라 확률적으로 변화하는 무작위 변수를 다루는 과정입니다.
      • 확률 과정은 무작위 변수의 연속적인 집합이라고 할 수 있습니다. 이 무작위 변수는 시간이나 공간에 따라 변하며, 각 시간 점에서 무작위적인 값을 가집니다.
        • 예를 들어, 주가의 변화, 날씨의 변화, 라디오 신호의 강도 변화 등이 확률 과정의 예입니다.
      • 확률 과정은 일반적으로 시간 ttt에 따라 정의됩니다. 즉, 어떤 무작위 현상이 시간이 지남에 따라 어떻게 변하는지를 설명합니다.
        • 예를 들어,$X(t)$가 시간 $t$에서의 주가를 나타낸다고 하면, $X(t)$는 특정 시간 $t$에서 주가가 가질 수 있는 여러 가지 가능성을 표현합니다.
  • 장점
    • 유연성: 군집의 개수를 미리 알 필요 없이, 데이터를 기반으로 군집이 동적으로 결정됩니다.
    • 무한한 가능성: 이론적으로 무한한 개수의 군집을 허용하므로, 데이터가 증가해도 새로운 군집을 생성할 수 있습니다.
    • 베이지안 접근: 베이지안 통계학의 기초 위에 세워져 있어, 사전 확률 분포와 사후 확률 분포의 개념을 사용합니다.
  • 단점
    • 복잡성: 개념적으로 이해하기 어렵고, 구현이 복잡할 수 있습니다.
    • 계산 비용: 데이터가 커질수록 계산 비용이 크게 증가할 수 있습니다.
    • 파라미터 민감도: 하이퍼파라미터에 따라 결과가 크게 달라질 수 있습니다.
  • 대안
    • Gaussian Mixture Model (GMM): 고정된 군집 개수를 사용하지만, 가우시안 분포를 기반으로 군집화하는 방법입니다.
    • k-means: 가장 기본적인 군집화 방법으로, 고정된 개수의 군집을 생성합니다.
    • Hierarchical Clustering: 군집의 계층적 구조를 형성하는 군집화 방법입니다.

Chinese Restaurant Process (중국집 과정)

  • **Chinese Restaurant Process (CRP)**는 Dirichlet Process의 직관적인 해석을 제공하는 비유적인 모델입니다.
  • 이 모델에서는 무한히 큰 좌석을 가진 중국집에 손님들이 들어오는 상황을 가정합니다. 새로운 손님은 이미 앉아 있는 사람들과 같은 테이블에 앉거나 새로운 테이블을 선택할 확률을 가집니다.

CRP의 규칙

  1. 기존 테이블에 앉는 확률: 이미 $k$명의 손님이 앉아 있는 테이블에 새로운 손님이 앉을 확률은 $\frac{k}{n + \alpha}$​입니다.
  2. 새로운 테이블을 선택할 확률: 새로운 테이블에 앉을 확률은 $\frac{\alpha}{n + \alpha}$입니다. 여기서 $\alpha$는 집중도(concentration parameter)로, 새로운 군집이 생성되는 빈도를 조절합니다.

CRP의 장점

  1. 직관적 이해: CRP는 DP를 직관적으로 이해하는 데 도움을 줍니다.
  2. 군집화의 자연스러운 생성: 데이터를 분석할 때 자연스럽게 군집이 형성되므로, 실제 데이터에서 유용하게 사용될 수 있습니다.

단점

  1. 비유적 모델: CRP는 비유적인 모델이므로, 실제 구현에서 다소 추상적일 수 있습니다.
  2. 매개변수 설정의 어려움: 집중도 α\alphaα의 값을 적절히 설정하는 것이 어려울 수 있습니다.

Sample

import numpy as np  
import matplotlib.pyplot as plt  
from scipy.stats import gamma  
  
def bayesian_chinese_restaurant_process(alpha_prior_shape, alpha_prior_rate, n_customers):  
    # alpha 값을 감마 분포로부터 샘플링 (사전분포 반영)  
     # 감마 분포에서 α 값을 샘플링합니다. 이 값이 CRP에서 새로운 테이블을 선택할 확률을 결정하는 데 사용됩니다  
    alpha = np.random.gamma(alpha_prior_shape, 1 / alpha_prior_rate)  
      
    tables = []  
    for i in range(n_customers):  
        if len(tables) == 0:  
            tables.append(1)  
        else:  
            probs = np.array(tables) / (i + alpha)  
            probs = np.append(probs, alpha / (i + alpha))  
            table_choice = np.random.choice(len(tables) + 1, p=probs)  
            if table_choice == len(tables):  
                tables.append(1)  
            else:  
                tables[table_choice] += 1  
    return tables, alpha  
  
#감마 분포의 파라미터로, 사전분포를 정의합니다.  
alpha_prior_shape = 2.0  # 감마 분포의 형태 매개변수 (사전분포)  
alpha_prior_rate = 1.0   # 감마 분포의 척도 매개변수 (사전분포)  
n_customers = 100  
  
# 베이지안 CRP 실행  
tables, sampled_alpha = bayesian_chinese_restaurant_process(alpha_prior_shape, alpha_prior_rate, n_customers)  
  
# 결과 시각화  
plt.bar(range(len(tables)), tables)  
plt.xlabel('Table Index')  
plt.ylabel('Number of Customers')  
plt.title(f'Bayesian Chinese Restaurant Process (Sampled alpha={sampled_alpha:.2f})')  
plt.show()