데이터 반출 없는 다기관 연합 인공지능 학습 플랫폼

데이터 분석/군집화

깁스 샘플링 예시: 1) 공의 무게 군집, 2) 손님 키와 몸무게 쌍 군집

FedTensor 2026. 8. 6. 10:30

각 예시를 통해 깁스 샘플링이 실제 데이터를 다룰 때 어떻게 주고받으며 반복 추론을 수행하는지 직관적으로 설명합니다.

예시 1: 공의 무게로 Light / Heavy 군집 나누기

상자 안에 무게만 측정된 여러 개의 공이 섞여 있습니다. 이 공들을 '가벼운 공(Light)' 그룹과 '무거운 공(Heavy)' 그룹으로 나누려고 합니다.

1. 문제 상황과 핵심 아이디어

  • 우리가 원하는 것: 각 공의 그룹 라벨(Light/Heavy)과 각 그룹의 대표 무게(평균)를 찾는 것.
  • 딜레마:
    • 공들의 라벨을 알아야 그룹별 평균 무게를 계산할 수 있습니다.
    • 반대로 그룹별 평균 무게를 알아야 공을 어느 그룹에 넣을지 결정할 수 있습니다.
    • "닭이 먼저냐, 계란이 먼저냐"의 문제입니다.

2. 깁스 샘플링의 작동 방식

깁스 샘플링은 한쪽을 임의로 고정하고 다른 한쪽을 번갈아 가며 갱신(샘플링)하는 방식으로 이 문제를 풀어냅니다.

 

[초기화]

  • 모든 공에 무작위로 Light 또는 Heavy 라벨을 임의 지정합니다.

[반복 과정]

  • 단계 A: 그룹별 특징(프로필) 업데이트
    • 현재 Light로 지정된 공들의 평균 무게를 계산합니다. (Light 그룹 분포 계산)
    • 현재 Heavy로 지정된 공들의 평균 무게를 계산합니다. (Heavy 그룹 분포 계산)
  • 단계 B: 공 그룹 라벨 업데이트
    • 공 한 개를 뽑습니다.
    • 예를 들어 $300\text{g}$짜리 공이 있다고 할 때 단계 A에서 계산된 두 그룹의 평균과 비교하여, 이 공이 Light일 확률과 Heavy일 확률을 계산합니다.
      • Light일 확률: $80\%$
      • Heavy일 확률: $20\%$
    • 확률에 따라 공의 라벨을 다시 할당합니다.
  • 반복: 단계 A와 B를 수백~수천 번 반복합니다.

3. 결과

처음에는 무작위로 엉망이었지만, 반복될수록 Light 그룹은 가벼운 공들 쪽으로, Heavy 그룹은 무거운 공들 쪽으로 정교하게 모이면서 진짜 Light/Heavy 분류 결과로 수렴하게 됩니다.

예시 2: 키와 몸무게 쌍으로 4개 군집(어린이, 성인 남성, 성인 여성, 운동선수) 나누기

이번에는 손님들의 [키, 몸무게] 2차원 데이터를 바탕으로 손님이 어느 그룹(어린이, 성인 남성, 성인 여성, 운동선수)에 속하는지 추론하는 상황입니다.

1. 문제 상황

  • 변수가 2개(키, 몸무게)이고 그룹이 4개로 늘어났지만 기본 원리는 동일합니다.
  • 각 그룹은 저마다의 대표 키/몸무게의 중심점과 분산(2차원 분포)을 가집니다.

2. 깁스 샘플링의 작동 방식

[초기화]

  • 카페 방문 손님 $100$명에게 임의로 4개 그룹 중 하나를 무작위 할당합니다.

[반복 과정]

  • 단계 A: 그룹별 특징(프로필) 업데이트
    • 현재 '어린이'로 분류되어 있는 손님들의 [키, 몸무게] 평균과 퍼짐 정도를 계산합니다.
    • 마찬가지로 '성인 남성', '성인 여성', '운동선수' 그룹 각각의 [키, 몸무게] 대표 프로필을 갱신합니다.
  • 단계 B: 손님별 그룹 라벨 업데이트
    • 한 손님을 뽑습니다.
    • 예를 들어 (키 $185\text{cm}$, 몸무게 $100\text{k}\text{g}$)인 손님이 있다고 할 때 단계 A에서 정리된 4개 그룹의 프로필과 비교하여 이 손님이 각 그룹에 속할 확률을 계산합니다.
      • 어린이일 확률: $0\%$
      • 성인 여성일 확률: $1\%$
      • 성인 남성일 확률: $20\%$
      • 운동선수일 확률: $79\%$
    • 확률에 따라 손님의 라벨을 새로 할당합니다.
  • 반복:  단계 A와 B를 수백~수천 번 반복합니다.

라벨 할당 시 '확률에 따라'

깁스 샘플링은 가장 확률이 높은 라벨을 하나 고르는 '최대 확률 선택' 방식이 아니라, 계산된 확률 분포 자체를 이용해 '확률적으로 무작위 추출'하는 알고리즘입니다.

 

한 손님(키 $185\text{cm}$, 몸무게 $100\text{k}\text{g}$)에 대해 계산된 확률이 다음과 같다고 할 때:

  • 어린이: $0\%$
  • 성인 여성: $1\%$
  • 성인 남성: $20\%$
  • 운동선수: $79\%$
  1. 실제 샘플링 동작:
    • 주사위의 $79\%$ 면에는 '운동선수', $20\%$ 면에는 '성인 남성', $1\%$ 면에는 '성인 여성'을 적어두고 주사위를 던지는 것과 같습니다.
    • 따라서 운동선수로 뽑힐 확률이 $79%$로 가장 높지만, 약 $20%$의 확률로 '성인 남성' 라벨이 지정될 수도 있고, 지극히 낮은 확률($1\%$)로 '성인 여성'이 될 수도 있습니다.
  2. 왜 결정론적으로(가장 높은 것만) 뽑지 않고 확률적으로 뽑을까요?
    • 마르코프 체인의 탐색: 항상 가장 확률이 높은 라벨만 고르면(Deterministic) 국소 최적해(Local Optima)에 갇히게 됩니다.
    • 분포 자체를 복원: 깁스 샘플링의 목적은 '단 하나의 정답'을 찾는 것이 아니라, 경계선에 있는 데이터들의 불확실성(확률 분포)을 있는 그대로 표현하는 것이기 때문입니다.

단계 B에서 라벨 업데이트: 한 손님 vs 모든 손님

위 방식은 이론적 정의에 가장 충실한 단계를 밟고 있습니다.


손님 한 명의 라벨이 변하는 순간 $X_i$라는 상태 변수가 바뀐 것이므로, 그 즉시 다음 손님 $X_{i+1}$을 추론할 때는 변경된 상태 값을 조건으로 쓰는 것이 마르코프 체인의 조건부 추출 정의에 완전하게 부합합니다.


실무에서는 병렬 연산 구현이 쉬운 아래 방식을 자주 사용합니다.

  • 단계 A: 그룹별 특징(프로필) 업데이트
  • 단계 B: 모든 손님에 대하여 손님별 그룹 라벨 업데이트
  • 반복: 단계 A와 B를 수백~수천 번 반복합니다.

3. 직관적인 수렴 과정

[초기 상태] -> [반복 10회] -> [반복 100회] -> [수렴 상태]
 무작위 할당     대략의 윤곽      그룹 경계 명확    실제 결합분포 도달
  • 어린이: 키가 작고 몸무게가 적은 영역으로 그룹 프로필과 멤버가 함께 수렴.
  • 성인 여성/남성: 중간 키와 몸무게 영역에서 두 그룹의 겹치는 구간을 확률적으로 유연하게 나누며 수렴.
  • 운동선수: 키와 몸무게가 모두 큰 영역으로 수렴.

요약

구분 예시 1 (공 무게) 예시 2 (카페 손님)
관측 데이터 $1$차원 (무게) $2$차원 (키, 몸무게)
군집 수 $2$개 (Light, Heavy) $4$개 (어린이, 성인 남성, 성인 여성, 운동선수)
조건부 갱신 1 현재 라벨로 각 그룹의 대표 무게 계산 현재 라벨로 각 그룹의 [키, 몸무게] 대표 분포 계산
조건부 갱신 2 대표 무게 기반으로 각 공의 라벨 재할당 대표 분포 기반으로 각 손님의 라벨 재할당

 

깁스 샘플링은 복잡한 전체 추론 문제를 "그룹 프로필 갱신"과 "개별 데이터 라벨 갱신"이라는 쉬운 조건부 문제 2개로 나누어, 이를 번갈아 반복함으로써 최종 정답(결합분포)에 도달하는 기법입니다.