https://gist.github.com/dsaint31x/f7f59e6b99f6ef3dc46e4e7da8826cd9
dip_kmeans_tree.ipynb
dip_kmeans_tree.ipynb. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
0. 소개
K-Means Tree는
- 대규모 데이터에서
- 효율적으로 Nearest Neighbor Search (최근접 이웃 검색)을 수행하기 위해
- 계층적으로 데이터를 K개의 cluster로 clustering하여
- 일종의 Binary Tree 자료구조 를 만드는 알고리즘.
OpenCV에서는 K-Means Tree를
- 주로 FLANN(또는 다른 유사한 데이터 검색 알고리즘)에서
- k-d Tree 와 함께 기본 알고리즘으로 제공되어,
- Approximate Nearest Neighbor Search를 구현함.
- Matching Task 수행에서 자주 사용됨.
1. 목적:
각 depth별로 데이터 세트를 K개의 Clusters로 나누어( Clustering 또는 Partitioning이라고도 불림),
검색 범위를 좁히는 계층적 데이터 구조(tree)를 생성.
2. 동작 원리:
- 데이터 입력
- 고차원 데이터나 특징 벡터 집합을 입력으로 받음.
- 트리 생성
- 입력 데이터를 기반으로 K-Means 알고리즘을 반복적으로 수행하여 트리 형태로 클러스터링.
- 첫 번째 레벨에서 데이터를 K개의 클러스터로 나눔.
- 각 클러스터에 대해 다시 K-Means를 수행하여 하위 클러스터 생성: Tree에서 Depth증가
- 이 과정을 데이터가 충분히 작은 크기로 나뉠 때까지 반복.
- 검색(Query)
- 검색 시, 입력된 query vector는 root 노드에서부터 시작하여 가장 가까운 centroid(중심)을 따라 이동.
- leaf 노드에 도달하면 해당 클러스터에서 가장 가까운 이웃(Nearest Neighbor)을 찾음.
3. K-Means Tree의 장점
- 효율적인 검색:
- K-Means Tree는 검색 공간을 계층적으로 줄이므로
- 대규모 데이터에서도 빠른 검색 가능.
- 근사 검색:
- 정확도를 약간 희생하여 속도를 높이는 근사 알고리즘.
- 계층적 구조:
- 트리 구조는 메모리 사용량이 적고, 높은 차원에서도 유리함.
4. K-Means Tree와 다른 알고리즘 비교
k-d Tree:
- K-Means Tree는 k-d Tree보다 고차원 데이터에서 더 효율적.
- k-d Tree는 데이터 분포에 따라 성능 저하가 발생할 수 있음.
Linear Search:
- 모든 데이터를 하나씩 확인하는 Linear Search보다 일반적으로 훨씬 빠름.
5. OpenCV에서 K-Means Tree 사용 예시
다음은 OpenCV의 FLANN을 사용하여 K-Means Tree 기반 근사 최근접 이웃 검색을 수행하는 예시 코드임:
import cv2
import numpy as np
# 샘플 데이터 생성
features = np.random.rand(1000, 128).astype(np.float32) # 1000개의 128차원 특징 벡터
query = np.random.rand(1, 128).astype(np.float32) # 검색할 query vector
# FLANN 파라미터 설정
index_params = dict(
algorithm=1, # cv2.FLANN_INDEX_KMEANS 가 정의 안된 경우가 많음.1
branching=32, # 각 노드의 자식 수 = 한 노드가 나눠지는 클러스터의 숫자!
iterations=11, # k-means 클러스터링에서 centroid 찾기 위한 반복횟수
centers_init=cv2.KMEANS_RANDOM_CENTERS,
)
search_params = dict(checks=50) # 트리 탐색 횟수
# FLANN matcher 객체 생성
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 인덱스 구축 및 검색
matches = flann.knnMatch(query, features, k=2) # 각 쿼리에 대해 2개의 최근접 이웃 찾기
# 결과 출력
for m, n in matches:
print(f"최근접 거리: {m.distance :.2f}, 두 번째 근접 거리: {n.distance:.2f}")
print(f"ratio: {m.distance/n.distance :.2f}")
이 코드는 FLANN을 사용하여 K-Means Tree 기반의 고속 근사 검색을 수행하는 방법을 보여줌.
관련된 Hyperparameters 의 상세 설명은 다음을 참고:
2024.11.25 - [Programming/DIP] - [OpenCV] K-Means Tree Hyper-parameters: FLANN based Matcher
[OpenCV] K-Means Tree Hyper-parameters: FLANN based Matcher
이 글은 OpenCV에서 K-Means Tree 를 중심으로FLANN based Matcher의 하이퍼파라미터를 정리한 글임.1. K-Means Tree란K-Means Tree는OpenCV의 FLANN (Fast Library for Approximate Nearest Neighbors)에서사용 가능한 고속 근사 검
dsaint31.tistory.com
관련자료들
2023.02.20 - [Computer/CE] - [CE] Tree vs. Graph
[CE] Tree vs. Graph
Graph vs. Tree Graph node와 node를 연결하는 edge로 구성된 data structure(자료구조). object들의 network를 모델링하는데 주로 사용됨. Deep Learning을 가능하게 한 Back-propagation은 Reverse-mode Auto Differentiation에 기반
dsaint31.tistory.com
2024.11.16 - [Computer/CE] - [CE] Linear Search, Naive Search, Brute Force Search
[CE] Linear Search, Naive Search, Brute Force Search
Linear Search (Naive Search)The simplest solution to the Nearest Neighbor Search problem is to compute the distance from the query point to every other point in the database, keeping track of the "best so far".이 방식에서는 모든 가능한 데이터
dsaint31.tistory.com
'Programming > DIP' 카테고리의 다른 글
[Math] Maximum Likelihood Estimator: M-Estimator (0) | 2024.11.25 |
---|---|
[OpenCV] K-Means Tree Hyper-parameters: FLANN based Matcher (1) | 2024.11.25 |
[CV] Optical Flow: Lucas Kanade Method (LK method, 1981) (2) | 2024.11.17 |
[CV] Optical Flow: Horn-Schunck Method (1981) (0) | 2024.11.17 |
[CV] Least-Median of Squares Estimation (LMedS) (0) | 2024.11.16 |