이번 글에서는 유전 알고리즘에 대해 다뤄보도록 하겠습니다.

유전 알고리즘

유전 알고리즘(Genetic Algorithm)은 주로 복잡한 문제에서 최적의 해를 찾는 데 사용되며, 선택(Selection), 교차(Crossover), 변이(Mutation) 등의 개념을 활용하여 문제를 해결합니다. 각 단계에서의 개념을 설명하고 어떻게 최적의 해를 찾는지 설명드리겠습니다. 아래는 Genetic Algorithm을 도식화 한 그림입니다.

초기 집단 생성 (Initialization)

유전 알고리즘은 여러 해(solution)를 한 번에 다루며, 이 해들은 염색체(Chromosomes) 또는 유전자(Genes)라고 불립니다. 처음에는 무작위로 여러 개의 해(개체) 집단을 생성하는데, 이를 **초기 집단(Population)**이라고 합니다. 각 개체는 문제의 잠재적인 해를 나타내며, 보통 이진수(0과 1) 또는 실수로 표현됩니다.

(만약 4개의 염색체가 존재한다고 했을 때 각 개체들은 아래와 같은 방식으로 표현이 될 수 있습니다.)

  • 개체 1: 101011
  • 개체 2: 110110
  • 개체 3: 011001
  • 개체 4: 100101

 

적합도 평가 (Fitness Evaluation)

각 염색체의 성능을 평가하기 위해 **적합도 함수(Fitness Function)**를 사용합니다. 이 함수는 염색체 문제의 최적 해에 얼마나 가까운지를 평가합니다. 적합도가 높은 개체는 더 나은 해를 나타내며, 다음 세대로 선택될 확률이 높아집니다.

 

선택 (Selection)

다음 세대를 만들기 위해 부모 개체를 선택하는 과정입니다. 적합도가 높은 개체들이 더 많이 선택될 가능성이 큽니다. 룰렛 휠 선택(Roulette Wheel Selection) 방법이 자주 사용됩니다.

 

 

 

적합도 함수를 통해 각 염색체 마다 적합도가 나오게 되는데 적합도가 높은 개체일수록 선택될 확률이 큽니다. (즉, 적합도에 비례하게 염색체가 선택됨)

  • 1번 염색체 선택확률 : 60%
  • 2번 염색체 선택확률 : 20%
  • 3번 염색체 선택확률 : 15%
  • 4번 염색체 선택확률 : 5%

 

교차 (Crossover)

두 부모 개체로부터 자손을 생성하는 과정입니다. 교차는 부모 개체의 유전자를 섞어 새로운 자손을 만드는 방식으로 이루어집니다. 대표적인 방법으로는 단일 교차(single-point crossover), 다중 교차(multi-point crossover), 균등 교차(uniform crossover) 등이 있습니다. 저는 단일 교차에 대해서 설명드리도록 하겠습니다.

Simple crossover은 2개 부모 염색체를 합쳐서 자손을 생성합니다. 이때 Division point를 기준으로 왼쪽은 Parent1, 오른쪽은 Parent2의 정보를 가진 자손이 생성됩니다.

부모 1 : 1 0 1 0 0

부모 2 : 0 0 0 1 1

새로운 자손 : 1 0(부모 1 data) | 0 1 1(부모2 data)

 

 

변이 (Mutation)

변이는 자손의 유전자 일부를 무작위로 변경하는 과정입니다. 이를 통해 다양성을 유지하고 새로운 해를 탐색할 수 있습니다. 변이는 보통 매우 낮은 확률(5%)로 발생합니다. 예를 들어, 이진수로 표현된 유전자의 일부를 반대로 바꿔줍니다

생성된 자손 염색체에서 일정 확률(e.g. 0.01)에 포함되는 유전자에 [1인 경우 -> 0으로], [0인 경우 -> 1로] 바꿔주는 reverse 과정이 진행됩니다.

  • 자손1: 10100 → 10110 (변이 발생)

 

Create Offspring

최종적으로 선택, 교차, 변이를 통하여 자손이 생성되게 됩니다.

 

종료 조건 (Termination Condition)

알고리즘은 일반적으로 다음과 같은 조건 중 하나를 만족할 때 종료됩니다.

  • 최대 세대 수에 도달했을 때(위 그림에서는 iteration이 100번으로 설정되었습니다.)
    • 여기서 세대(Generation)란, 유전 알고리즘에서는 한 세대는 선택, 교차, 변이의 과정이 한 번 끝날 때까지의 단계를 의미합니다. 각 세대에서 새로운 자손들이 생성되고, 그 자손들이 새로운 집단을 형성합니다.
    • Iteration(반복)은 유전 알고리즘에서 한 번의 세대가 끝나고 다음 세대로 넘어가는 과정을 반복하게 됩니다. 이 반복되는 횟수를 iteration이라고 부릅니다.
  • 적합도가 특정 값 이상으로 높아졌을 때
  • 적합도 변화가 거의 없을 때 (수렴)

종료조건 후에 생성된 자손이 최종적으로 선택된 변수라고 볼 수 있습니다.

유전 알고리즘은 다양한 최적화 문제를 해결할 수 있지만, 최적해를 보장하지는 않으며, 해의 품질과 속도는 파라미터 설정(교차율, 변이율 등)에 크게 영향을 받습니다.

 

Example

아래는 baseball data를 통해 AIC가 가장 낮게 나오는 변수를 선택하는 유전알고리즘을 만들었습니다.

이때 iteration은 100번, 염색체의 길이는 27개(01001….10 이런 방식(총 길이가 27)), 27개의 길이를 가지는 20개의 랜덤한 개체를 생성하였고, mutate는 1%로 설정하여 최적해를 구했습니다. 이때 적합도 함수는 $\frac{2r_i}{P(P+1)}$로 설정했습니다.

 

baseball.dat
0.04MB

 

주석을 달아놨으니 확인하실 수 있습니다.

# Import
import numpy as np
import pandas as pd
import statsmodels.api as sm
from scipy.stats import rankdata

# Load Data
data = pd.read_csv('/content/baseball.dat', sep=' ')
X = data.drop('salary', axis=1)  # predictors
y = np.log(data['salary'])  # response variable

# 초기값 설정
# 100(G)세대를 사용하고, 각 세대마다 개체의 수를 20(P)으로 설정
P = 20
G = 100
C = 27  # chromosomes of length C = 27
Mutation_rate = 0.01 # Apply 1% mutation

# 랜덤 시드 설정
np.random.seed(1)
# The starting generation consisted of purely random individuals.
Binary_generator = np.random.randint(2, size=(P, C))

# AIC 계산 함수(Minimize 하는 것이 목적)
def function_aic(X, y):
    if np.sum(X)==0:
        print("☆☆ 변수가 한개도 선택이 되지 않았기 때문에 다시 선택하시길 바랍니다. ☆☆")
        return np.inf
    model = sm.OLS(y, sm.add_constant(X)).fit()
    return model.aic

# 적합도 계산 함수
def fitness(Binary_generator, data):
    y = np.log(data['salary']).values
    X = data.drop(columns=['salary']).values
    # Binary_generator에서 1이라고 입력된 변수들을 독립변수로 사용하고 0으로 입력된 변수들은 제거하고 나서 AIC 측정
    aics = np.array([function_aic(X[:, x == 1], y)  for x in Binary_generator])

    rank=rankdata(-aics)  # 낮은 AIC가 높은 순위 이므로 -AIC에서 순위 측정
    fitness_rank = 2 * rank / (P * (P + 1))
    return fitness_rank

# 선택 연산자 : 적합도 함수에 기반하여 부모 염색체 생성
# Roulette Wheel Selection
def selection(fitness_scores):
    numbers=np.arange(P)
    probabilities=fitness_scores
    choice=np.random.choice(numbers,p=probabilities/probabilities.sum())
    return choice

# 두 부모의 염색체들로부터 하나의 자손염색체 생성하는 함수. Use Simple crossover!
def crossover(parent1, parent2):
    point = np.random.randint(1, C) # Division point
    child = np.concatenate([parent1[:point], parent2[point:]])
    return child

# 돌연변이 적용 : 0.01보다 작은 index가 존재하면 [0 -> 1], [1 -> 0] 으로 reverse 수행
def mutate(child):
    mutation_mask = np.random.rand(C) < Mutation_rate
    child[mutation_mask] = 1 - child[mutation_mask]
    return child

# 선택, 교차, 돌연변이 과정을 통해 새로운 자손 생성하는 함수
def create_generation(Binary_generator, fitness_scores):
    new_Binary_generator = []
    while len(new_Binary_generator) < P:
        # 적합도 가중치 비율 이용해 부모 2개 select
        parent1 = Binary_generator[selection(fitness_scores)]
        parent2 = Binary_generator[selection(fitness_scores)]
        # 부모를 섞어서 자손 생성
        child = crossover(parent1, parent2)
        # 자손 돌연변이
        child = mutate(child)
        new_Binary_generator.append(child)
    return np.array(new_Binary_generator)

for generation in range(G):
    # Rank-based fitness function을 사용해 적합도 계산
    fitness_scores = fitness(Binary_generator, data)
    # 선택, 교차, 돌연변이 연산자를 통해 새로운 자손 생성 -> 자손들이 다음에는 부모가 됨
    Binary_generator = create_generation(Binary_generator, fitness_scores)

# 최종 결과
final_fitness = fitness(Binary_generator, data)
best_solution_index = np.argmax(final_fitness)
best_solution = Binary_generator[best_solution_index]

# 마지막 세대 각 개체의 적합도
print(f"마지막 세대의 각 개체 적합도는 다음과 같습니다. :{final_fitness}")

# 변수 이름 추출 하기 위함
column_names = X.columns
selected_variable_names = column_names[best_solution == 1]
# AIC가 가장 낮은 개체
print(f"선택된 변수는 다음과 같습니다. : {list(selected_variable_names)}")

# AIC가 가장 낮은 개체의 Index
print(f"선택된 개체의 인덱스는 다음과 같습니다. :{best_solution_index}")

 

감사합니다.

 

 

이번 글에서는 SMOTE기법에 대해서 다뤄보겠습니다.

SMOTE

이번 게시글에서는 Imbalanced data 상황에서 Oversampling 응용기법인 SMOTE 기법에 대해 다뤄보겠습니다.

기존의 Oversampling 기법은 minority class의 데이터를 단순히 복제시켜서 데이터의 균형을 맞추었지만, 단순히 복제하기 보단, minority class와 정보가 유사한 데이터를 생성하면 조금 더 모델이 학습을 잘 하지 않을까? 라는 생각에서 만들어 진 기법이 SMOTE입니다.

그러면 어떻게 데이터를 생성하냐? 이 기법에서는 단순히 minority class의 데이터를 복제하는 것이 아니라 기존 minority class의 데이터 포인트들 사이에서 새로운 데이터를 생성합니다. 이를 통해 모델이 더 일반화된 패턴을 학습할 수 있게 도와줍니다.

아래 사진을 보시면 불량과 정상 데이터에서 SMOTE 기법을 통해서 데이터를 복제하는 것이 아닌 minority class의 데이터 포인트들 사이에서 새로운 데이터를 생성한 것을 볼

수 있습니다.

 

SMOTE의 작동 방식은 다음과 같습니다:

  1. 소수 클래스의 각 데이터 포인트에 대해: 이웃한 데이터 포인트를 찾습니다(예: k-NN 기법으로 k개의 이웃을 선택).
  2. 이웃한 포인트와의 차이를 계산하여, 그 차이를 무작위로 일정 비율만큼 더하여 새로운 데이터를 생성합니다.

위 내용을 조금 더 자세하게 설명드리도록 하겠습니다.

 

 

불량 데이터 중에서 하나를 무작위로 선택하는데 저 초록색이 선택되었다고 하겠습니다. 그 후 nearest neighbors를 선택해야 하는데 이때 k=3이 선택되었다고 하겠습니다. 그러면 우측 사진처럼 초록색 데이터와 가장 가까운 데이터 3개가 선택됩니다. 그 후 3개 중 한개를 랜덤으로 선택하고 그 직선 사이에서 데이터를 생성하게 됩니다. New data= X+u*(X(nn) - X). 이때 X : 기존의 데이터 포인트(초록색), X(nn) : 선택된 데이터 포인트 , u : 0과 1사이의 범위를 가지는 uniform distribution 입니다.

 

[New data 생성하는 법]

 

New data= X+u*(X(nn) - X)

               = (5,1) + 0.3((2,4)-(5,1))

               = (4.1,1.9) 

 

이렇게 두 점 사이의 직선에서 새롭게 데이터를 생성할 수 있습니다.

SMOTE 기법을 사용하여 기존의 Oversampling방식과 다르게 단순히 복제하지 않고, minority class의 데이터의 직선사이에서 새로운 데이터를 생성하여 정보가 유사한 데이터들을 다양하게 생성할 수 있습니다. 그로 인해 과적합(overfitting)을 방지할 수 있고, 모델의 성능을 향상 또한 기대해볼 수 있습니다.

 

 

감사합니다.

 

참고문헌

  1. https://www.youtube.com/watch?v=Vhwz228VrIk&t=1927s

이번 글에서는 Oversampling기법과 Undersampling기법에 대해 다뤄보겠습니다.

    Imbalanced data

    이 게시글에선 Imbalaced data 상황에서 해결할 수 있는 Oversampling과 Undersampling의 개념에 대해서 다뤄보겠습니다.

    우선, Oversampling과 Undersampling 기법이 왜 필요한지부터 생각해 볼 필요가 있습니다.

    Classfication문제에서 majority class(다수 클래스) data가 minority class(소수 클래스) data의 수보다 훨씬 많은 경우, 모델은 new data(minority class data)에 대해서 주로 majority로 분류하게 되는 경향이 있습니다. 이렇게 되는 경우는 모델이 정확도를 최대화하려고 할 때 발생하게 됩니다.

     

    아래 예시를 들어보겠습니다. 아래와 같이 불량 정상을 예측하는 모델이 있다고 가정하겠습니다.

                                             예측

    실제
    불량 정상
    불량 1 9
    정상 11 979

     

    위 표를 보면 이 모델의 정확도는 $\frac{1+979}{1+11+9+979}=\frac{980}{1000}$=0.98입니다. 이 모델은 좋은 모델이라고 할 수 있을까요? 사실 이 모델은 정확도는 되게 높지만, 좋은 모델이 아니라고 볼 수 있습니다. 만약 minority class의 예측을 중요시하게 되는(예를 들어 암과 정상 데이터) 데이터의 경우에는 전혀 도움이 되지 않는 모델입니다. 그래서 이런 Imbalacend data 문제를 해결하기 위해서 Oversampling과 Undersampling이 필요하게 됩니다. 이제 Oversampling과 Undersampling에 대해서 다뤄보겠습니다.

     

    Oversampling

    Oversampling은 minority class(소수 클래스)의 data를 복제하거나 증가시켜 majority class(다수 클래스)와의 균형을 맞추는 방법입니다. 이를 통해 모델이 minority class에 대해 더 나은 성능을 나타낼 수 있도록 합니다. Oversampling 기법은 Minority class의 data의 수가 현저히 적을 때 유용하게 사용될 수 있습니다. (위 방법의 경우에는 Minority class의 data를 무작위로 복제하여 샘플 수를 늘리는 방법)

     

    장점(Pros)

    1. 소수 클래스 데이터를 효과적으로 늘려 모델이 소수 클래스에 더 민감하게 반응할 수 있도록 함(모두 다수 클래스로 예측하는 문제를 해결할 수 있음)
    2. 구현이 간단하고 빠름

    단점(Cons)

    1. 데이터를 단순하게 복제하기 때문에 과적합(Overfitting)이 될 수 있음

     

    Undersampling

    Undersampling은 majority class(다수 클래스)의 data를 줄여 minority class(소수 클래스)와의 균형을 맞추는 방법입니다. 다수 클래스의 데이터가 많을 때 학습 데이터에서 다수 클래스의 샘플을 무작위로 선택해서 그 수를 줄이는 방법입니다.

    장점(Pros)

    1. 간단하고 빠르며 데이터 셋의 크기가 줄어들어 학습 시간이 단축됩니다.

    단점(Cons)

    1. 다수 클래스의 데이터를 랜덤으로 선택하여 개수를 줄였기 때문에 다수 클래스의 정보가 손실될 수 있습니다. 그로 인해 모델 성능도 저하가 될 수 있습니다.(모델이 다수 클래스의 중요한 패턴을 학습하지 못할 수 있음)

    데이터가 불균형한 상황에서 데이터를 증강시키거나 줄여서 모델의 성능을 향상시킬 수 있도록 하는 Sampling 기법을 다뤄보았습니다. 이 기법들로 인해 불균형한 상황에서 조금 더 중요한 클래스에 대해서 초점을 맞출 수 있습니다.

     

     

    Oversampling과 Undersampling에는 다양한 기법이 존재하기 때문에 다른 게시글에서 응용기법을 포스팅하도록 하겠습니다.

     

     

    이 글은 Graphical Model에 대해서 정리한 내용입니다.

    Graphical Models

    Graphical Model이란 확률 변수(Random Variables)들의 조건부 식을 시각적으로 표현한 모델이며 복잡한 확률 분포를 표현하고 분석하는데 사용됩니다. 또한 확률 변수들 간의 관계를 이해할 수 있는 것이 장점입니다.

    베이지안 네트워크

    베이지안 네트워크는 방향성 비순환 그래프(DAG)를 사용하여 확률변수 간의 관계를 표현합니다.

    방향성 비순환 그래프 : 모든 Edges가 방향을 가지며 한쪽 방향으로만 이동할 수 있습니다. 그리고 그래프 내에 순환(Cycle)이 존재하지 않습니다. 즉, 어느 노드에서 출발하여 방향을 따라 이동하다 다시 원래 노드로 돌아오는 경로가 없습니다.

    노드(Node)는 확률 변수를 나타내고, 엣지(Edges)는 변수들 간의 관계를 나타냅니다.

    위 그림은 X와 Y의 확률변수가 있을 때 Y변수는 X로부터 정보를 받는다고 볼 수 있습니다. X에 의해 Y의 확률분포가 달라진다고 볼 수 있으며 $P(Y|X)$형태의 조건부 확률로 나타낼 수 있습니다.

    The Bayes ball algorithm

    다음은 Bayes ball algorithm에 대해 다뤄볼 건데, 그 전에 독립과 조건부 독립의 정의를 보고 가겠습니다.

    Definition of independence

    X와 Y가 독립인 경우 $X\perp Y$ 로 표현이 되며 아래와 같이 사용할 수 있습니다.

    $P(X,Y)=P(X)P(Y)$

    $P(X|Y)=\frac{P(X,Y)}{P(Y)}=\frac{P(X)P(Y)}{P(Y)}=P(X)$

    $P(Y|X)=P(Y)$

     

    Definition of conditional independence

    Z가 주어(Given)졌을 때 X와 Y가 독립인 경우 $X\perp Y|Z$ 로 표현이 되며 아래와 같이 사용할 수 있습니다.

    $P(X,Y|Z)=P(X|Z)P(Y|Z)$

    $P(X|Y,Z)=P(X,Y|Z)*\frac{P(Z)}{P(Y,Z)}=P(X|Z)P(Y|Z)\frac{1}{P(Y|Z)}=P(X|Z)$

    $P(Y|X,Z)=P(X,Y|Z)*\frac{P(Z)}{P(X,Z)}=P(X|Z)P(Y|Z)\frac{1}{P(X|Z)}=P(Y|Z)$

    Bayes ball algorithm에 필요한 개념을 다뤄보았고 이제는 Bayes ball algorithm에서 3가지 유형에 대해 다뤄보겠습니다. (Chain Structure, Fork structure, inverse Fork structure)

    Chain Structure(head-to-tail)

    위 그림은 Chain Structure라고 부르며 joint probability distribution은 다음과 같습니다.

    $p(x,y,z)=p(x)p(y|x)p(z|y)$

    원래의 joint pdf는 $p(x,y,z)=p(x)p(y|x)p(z|x,y)$이지만, 위 그림에서는 사실 Y는 X에 대한 정보를 받고 있기 때문에 $p(z|y)=p(z|x,y)$가 됩니다.

    Q : X와 Z가 독립인가?

    A : NO!

    Why?

    $p(x,z)=p(z|x)p(x)=p(z|x,y)p(x)=p(z|y)p(x)\neq p(z)p(x)$

    (아까 위에서 Definition of independence에서 3가지 중 한개라도 성립하거나 성립하지 않는다는 것을 보여 증명할 수 있습니다.)

    Q : Y가 주어졌을 때 X와 Z가 조건부 독립인가?

    A : Yes!

    Why?

    $p(x|y,z)=\frac{p(x,y,z)}{p(y,z)}=\frac{p(x)p(y|x)p(z|y)}{p(z|y)p(y)}=\frac{p(x,y)}{p(y)}=p(x|y)$

    (마찬가지로 위에서 Definition of conditional independence에서 3가지 중 한개라도 성립하거나 성립하지 않는다는 것을 보여 증명할 수 있습니다.)

     

    Fork Structure(tail-to-tail)

    $p(x,y,z)=p(y)p(x|y)p(z|y)$

    Q : X와 Z가 독립인가?

    A : NO!

    Why?

    $p(x,z)=\Sigma_yp(x,z,y)=\Sigma_yp(y)p(x|y)p(z|y)$

    $p(x)=\Sigma_yp(x,y)=\Sigma_yp(y)p(x|y)$

    $p(z)=\Sigma_yp(z,y)=\Sigma_yp(y)p(z|y)$

    $p(x,z)\neq p(x)p(z)$

    Q : Y가 주어졌을 때 X와 Z가 조건부 독립인가?

    A : Yes!

    Why? $p(x,y,z)=p(y)p(x|y)p(z|y)$

    $\frac{p(x,y,z)}{p(y)}=p(x|y)p(z|y) \rightarrow p(x,z|y)=p(x|y)p(z|y)$

    inverse Fork Structure(v-structure, collider, head-to-head, immoralities)

    $p(x,y,z)=p(x)p(z)p(y|x,z)$

    Q : X와 Z가 독립인가?

    A : Yes!

    Why?

    $p(x,y,z)=p(x)p(z)p(y|x,z)$

    $\frac{p(x,y,z)}{p(y|x,z)}=p(x)p(z) \rightarrow p(x,z)=p(x)p(z)$

    Q : Y가 주어졌을 때 X와 Z가 조건부 독립인가?

    A : NO!

    Why?

    $p(x,z|y)=\frac{p(x,z,y)}{p(y)}=\frac{p(x)p(z)p(y|x,z)}{p(y)}$

    베이즈 정리에 의해

    $p(x|y)=\frac{p(x)p(y|x)}{p(y)}$

    $p(z|y)=\frac{p(z)p(y|z)}{p(y)}$

    처럼 나타낼 수 있다.

    $p(x,z|y)=p(x|y)p(z|y)$가 되면 조건부 독립임을 알 수 있다.

    $p(x|y)p(z|y)=\frac{p(z)p(y|z)}{p(y)}\frac{p(x)p(y|x)}{p(y)}=\frac{p(x)p(z)p(y|z)p(y|x)}{p(y)p(y)}$

    조건부 독립이 되려면 $p(y|x,z)=\frac{p(y|z)p(y|x)}{p(y)}$가 되어야 하지만, 두 식은 같지 않기 때문에 조건부 독립이 아니다!

     

    정리하자면 다음 표와 같다.

    Chain Structure Fork inverse Fork

    $X\perp Z$ NO NO Yes
    $X\perp Z|Y$ Yes Yes Yes

     

    그럼 다음과 같은 예제를 풀어보자

    Q : $W\perp X|Y?$

    A : No!

    Why?

    표를 보면 위 그림은inverse Fork 형태에서 $X\perp Z|Y$형태와 같음

     

    Q : $W\perp X|Z?$

    A : NO!

    Why?

    표에서처럼 W와 X는 독립인 것 같지만, 사실 이 형태는 $X\perp Z|Y$형태와 같음. 왜냐하면 Z는 Y에 대한 정보를 받고 있기 때문에! 따라서 W와 X는 조건부 독립이 아니다!

    이해가 잘 안된다면 아래 그림을 참고하자

    Bayes ball이 굴러가는 경로라고 보면 된다. 경로가 끊이지 않는다면 독립이 아니라고 생각하면 된다.

    왼쪽 그림은 독립 , 오른쪽 그림은 Z가 주어졌을 때 독립이 아님! Bayes ball이 W에서 X로 잘 굴러가기 때문!

     

    Q : 이 그림에서 A가 주어졌을 때 C와 E는 독립인가?

    A : NO!

    Why?

    우선 이 그림에서 Chain structure 형태가 보인다.( E → A → C) 이 형태를 보고 바로 독립이라고 생각할 수 있다.(경로가 끊겨있기 때문에)

    하지만 이 그림에서 E → C로가는 경로가 한 가지 더 있다. 바로 C ← D → B →E 이렇게 말이다.

    이 형태를 보면 Fork의 형태와 같다. Fork는 경로가 끊이지 않았기 때문에 C에서 E까지 굴러갈 수 있다. Bayes ball이 굴러간다는건 독립이 아닌 것이라는 것과 같음!! 그렇기 때문에 NO!

    마지막으로 PC algorithm에 대해서 정리하고 마치겠습니다.

    PC Algorithm

    PC 알고리즘은 베이지안 네트워크의 구조를 학습하는데 사용됩니다. 이 알고리즘을 통해 변수 간 조건부 독립성을 추론하고, 이를 통해 인과관계를 유추합니다. PC 알고리즘의 Step은 다음과 같습니다.

    아래 그래프의 관계를 추론하고 싶다고 하겠습니다.(True causal Graph)

    1. 모든 변수들 사이 존재하는 Edge(선)를 그려줍니다.

    2. 관계가 없는 즉, 독립 관계인 노드의 Edge를 제거해 줍니다.( True graph에서 보면 A와 B는 v-structure 구조를 가지기 때문에 독립인 것을 알 수 있습니다.)

    위 그림에선 A와 B가 독립이 되어 두 개의 노드 사이의 Edge를 제거합니다. 또한 조건부 독립이라면 그때 또한 역시 Edges를 제거합니다. 이를 반복하여 Edges를 제거하게되면 아래 그림과 같이 됩니다. (예시 : Chain structure인 A→C→E에서 C가 주어지면 A와 E는 독립이므로 A와 E를 직접적으로 연결짓는 선은 제거)

    3. A와 B가 독립이므로 A,B,C에서는 v-structure 구조를 가지고 있다고 생각할 수 있습니다.

     

     

    4. 마지막으로 D와 E에도 방향을 그려줘야 하는데, 나머지 방향에서는 v-sturcture가 되지 않도록 방향을 설정해주어야 합니다. 결과는 다음과 같습니다.

     

     

    감사합니다.

    + Recent posts