각 예시를 통해 깁스 샘플링이 실제 데이터를 다룰 때 어떻게 주고받으며 반복 추론을 수행하는지 직관적으로 설명합니다.
예시 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\%$
- 실제 샘플링 동작:
- 주사위의 $79\%$ 면에는 '운동선수', $20\%$ 면에는 '성인 남성', $1\%$ 면에는 '성인 여성'을 적어두고 주사위를 던지는 것과 같습니다.
- 따라서 운동선수로 뽑힐 확률이 $79%$로 가장 높지만, 약 $20%$의 확률로 '성인 남성' 라벨이 지정될 수도 있고, 지극히 낮은 확률($1\%$)로 '성인 여성'이 될 수도 있습니다.
- 왜 결정론적으로(가장 높은 것만) 뽑지 않고 확률적으로 뽑을까요?
- 마르코프 체인의 탐색: 항상 가장 확률이 높은 라벨만 고르면(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개로 나누어, 이를 번갈아 반복함으로써 최종 정답(결합분포)에 도달하는 기법입니다.
'데이터 분석 > 군집화' 카테고리의 다른 글
| 마르코프 체인 -> 깁스 샘플링 -> 결합 분포 (수식 포함) (0) | 2026.08.05 |
|---|---|
| 마르코프 체인 -> 깁스 샘플링 -> 결합분포 (직관적인 설명) (0) | 2026.08.05 |