아이소맵(Isomap)이란? AI에서 이웃을 따라 잰 거리로 데이터의 차원을 줄이는 방법
TL;DR
아이소맵(Isomap)은 가까운 이웃을 연결한 그래프의 최단 경로 거리로 데이터의 낮은 차원 좌표를 만드는 방법입니다. 접히거나 휘어진 자료에서는 직선으로 가까워 보이는 점도 구조를 따라가면 멀 수 있습니다. 아이소맵은 이런 경로 거리를 반영하려고 하지만 이웃을 잘못 연결하면 지름길이 생기거나 그래프가 끊깁니다. 결과는 좌표이며 정답 라벨이나 의미 검색의 정확도를 보장하지 않습니다.
핵심 3줄 요약
- 핵심 1
이웃을 따라 거리를 잽니다. 연결된 선의 길이를 더한 최단 경로로 측지 거리를 근사합니다. - 핵심 2
경로 거리를 좌표에 담습니다. 원본 열을 몇 개 남기는 대신 각 사례에 새 좌표를 붙입니다. - 핵심 3
연결과 왜곡을 함께 봅니다. 이웃 수·반경·거리 기준이 바뀌면 보존하려는 구조도 달라집니다.
이 글에서 다룰 내용
- 아이소맵의 한 문장 정의
- U자 점 배열로 이해하는 직선 거리와 경로 거리
- 이웃 그래프·최단 경로·좌표 투영의 작동 순서
- 이웃 수·반경·출력 차원·거리 기준의 역할
- PCA·UMAP·t-SNE·스펙트럴 군집화와의 차이
- 새 입력 변환과 실전 확인 순서
- 지름길·그래프 단절·메모리·해석의 주의점
아이소맵을 한 문장으로 정의하면 무엇인가요?
아이소맵은 가까운 이웃 사이의 거리로 만든 그래프에서 모든 표본 쌍의 최단 경로를 계산하고, 그 거리를 반영한 낮은 차원의 표현을 찾는 비선형 차원 축소 방법입니다.
Isomap은 Isometric Mapping을 줄인 이름이며 한국어로 아이소맵 또는 등거리 매핑이라고 부릅니다. 여기서 등거리는 어떤 데이터에서도 거리가 완벽히 같아진다는 보증이 아니라, 데이터 구조를 따라 잰 거리를 유지하려는 목표를 가리킵니다.
측지 거리는 휘어진 구조 위를 따라 이동할 때의 거리입니다. 구조 자체를 정확히 알기 어려우므로 가까운 점을 잇고 그래프 최단 경로로 근사합니다. 점이 충분히 있고 연결이 실제 구조를 잘 따라야 이 근사가 유용합니다. 이 글의 구현 설명은 scikit-learn 1.9.1 공식 문서와 소스를 기준으로 합니다.
한 줄 정리: 두 점을 곧장 잇는 거리 대신, 이웃을 거쳐 이동하는 거리를 작은 좌표 공간에 옮깁니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 U자 모양의 통로 위에 놓인 점들을 펼쳐 본다고 가정해 보겠습니다. 통로 양 끝은 공간에서는 가깝지만 통로를 따라 걸으면 멉니다. 다음은 이 차이를 설명하려고 직접 만든 작은 합성 그래프입니다. 실제 고객 자료나 아이소맵 라이브러리의 성능 측정 결과는 아닙니다.
- 점 일곱 개를 순서대로
(0,2), (0,1), (0,0), (1,0), (2,0), (2,1), (2,2)에 놓습니다. 처음과 마지막 점의 직선 거리는 2입니다. - 직선 거리가 1.1 이하인 점끼리만 선을 그리면 길이가 1인 선 여섯 개가 U자를 따라 이어집니다. 양 끝 사이의 그래프 최단 경로 길이는 6입니다.
- 연결 반경을 2.1로 키우면 두 끝을 직접 잇는 길이 2의 선이 생깁니다. 같은 점들이어도 그래프 최단 경로는 6에서 2로 바뀝니다.
이 숫자는 Python 표준 라이브러리로 직선 거리와 그래프 최단 경로를 실제 계산해 확인했습니다. 낮은 차원의 임베딩 좌표를 계산한 시험은 아닙니다. 아이소맵은 다음 단계에서 이런 경로 거리들을 함께 반영할 좌표를 찾습니다.
이 예시에서 끝을 직접 잇는 선은 통로의 구조를 가로지르는 지름길입니다. 거리 계산 자체가 틀린 것은 아닙니다. 무엇을 가까운 이웃으로 인정했는지가 달라진 것입니다. 좋은 결과를 얻으려면 그 연결이 분석하려는 구조와 맞는지부터 살펴야 합니다.
쉬운 예시: 말린 종이 위 두 점의 공중 직선 거리와 종이를 따라 잰 거리를 구분하는 것과 비슷합니다. 아이소맵은 이웃 연결로 후자를 근사합니다.
왜 AI에서 아이소맵이 중요한가요?
직선 투영이 놓치는 휘어진 구조를 살핍니다
이미지나 센서의 특징은 열이 많아도 실제 변화가 적은 방향을 따라 일어날 수 있습니다. 아이소맵은 이웃을 따라 이어지는 구조를 낮은 차원에서 살펴보는 후보입니다. 모든 고차원 데이터에 이런 구조가 있다는 가정부터 확정해서는 안 됩니다.
멀리 떨어진 사례의 경로 관계를 함께 봅니다
출발점은 가까운 이웃이지만 최종 거리 행렬에는 멀리 떨어진 표본 쌍도 포함됩니다. 국소 연결을 모아 더 넓은 관계를 근사하려는 방식입니다. 전역적인 관계를 겨냥한다고 해서 실제 의미 거리나 모든 원본 거리가 그대로 보존되는 것은 아닙니다.
자료 표현과 연결 설정을 점검할 단서를 줍니다
어떤 이웃 수에서 구조가 유지되고 어디서 지름길이 생기는지 비교하면 입력 특징을 검토할 수 있습니다. 점에 기존 라벨이나 측정 조건을 색으로 덧붙이고 원본을 열어 봅니다. 색칠한 라벨을 알고리즘이 학습했다는 뜻으로 설명하지 않습니다.
핵심 인사이트: 작은 좌표를 만드는 계산보다 어떤 경로 거리를 그 좌표에 담았는지가 중요합니다.
아이소맵은 어떤 순서로 작동하나요?
1. 가까운 이웃의 거리 그래프를 만듭니다
각 사례의 특징을 비교해 정한 수의 이웃 또는 정한 반경 안의 이웃을 연결합니다. 선의 가중치는 거리입니다. 비슷할수록 큰 값을 주는 유사도 그래프와 구별합니다. 확인한 구현은 무방향 경로를 계산하므로 한쪽 방향에만 있는 이웃 연결도 이동에 사용됩니다.
2. 그래프에서 모든 쌍의 최단 경로를 구합니다
직접 연결되지 않은 두 점도 여러 이웃을 거쳐 이어질 수 있습니다. 선의 길이 합이 가장 작은 경로를 골라 거리 행렬을 만듭니다. 단순히 거쳐 간 점의 개수를 세거나 모든 경로의 길이를 평균 내는 계산은 아닙니다.
최단 경로의 정확한 계산과 실제 구조의 정확한 근사는 별개입니다. 잡음 때문에 엉뚱한 선 하나가 추가돼도 여러 표본 쌍의 경로가 짧아질 수 있습니다. 계산이 끝났다는 사실만으로 그래프가 옳다고 판단하지 않습니다.
3. 거리 행렬을 낮은 차원의 좌표로 옮깁니다
경로 거리의 제곱을 이용해 행렬을 만들고 중심화한 뒤 고유값과 고유벡터로 좌표를 구성합니다. 고전적 다차원 척도법과 연결되는 단계입니다. scikit-learn은 사전 계산 커널을 받는 KernelPCA로 이 투영을 구현합니다.
최종 출력의 한 행은 한 사례의 좌표입니다. 축의 부호나 회전보다 사례 사이의 관계와 거리 왜곡을 읽습니다. 가로축을 센서의 원래 단위나 문서의 품질 점수로 이름 붙이지 않습니다.
주요 설정과 결과는 어떻게 읽나요?
이웃 수와 반경은 연결을 정하는 대안입니다
n_neighbors
는 각 점에서 찾을 이웃 수이며
radius
는 이웃으로 인정할 거리 범위입니다. 이 구현에서는 두 방식을 동시에 지정하지 않습니다. 반경 방식을 쓰려면
n_neighbors=None
으로 설정합니다. 군집 수를 지정하는 값은 아닙니다.
적은 이웃이나 작은 반경은 연결을 끊을 수 있고 넓은 연결은 휘어진 구조를 가로지르는 지름길을 만들 수 있습니다. 기본값 하나를 정답으로 쓰기보다 같은 입력에서 연결 상태와 원자료를 비교합니다.
출력 차원과 거리 기준을 따로 봅니다
n_components
는 남길 좌표 수입니다. 기본은 2이지만 그림 이외의 전처리에 쓰면 목적에 맞춰 비교합니다.
metric
과
p
는 원본 이웃의 거리에 관여합니다. 기본 Minkowski 거리에서
p=2
는 유클리드 거리이고
p=1
은 맨해튼 거리입니다.
공식 S자 곡선 비교 예제의 아이소맵은
p=1
을 명시합니다. 기본값의 실행 결과라고 소개하면 안 됩니다. 단위와 거리 기준이 달라지면 이웃부터 달라지므로 다른 예제의 모양만 복사해 성능을 기대하지 않습니다.
경로 계산·좌표·재구성 오차를 구분합니다
path_method="D"
는 Dijkstra,
path_method="FW"
는 Floyd-Warshall 최단 경로 계산을 선택합니다.
eigen_solver
는 뒤의 고유값 풀이 선택입니다. 경로 알고리즘을 바꾸는 일과 이웃을 바꾸는 일은 서로 다릅니다.
embedding_
는 학습 사례의 좌표이고
dist_matrix_
는 학습 사례끼리의 경로 거리 행렬입니다.
reconstruction_error()
는 중심화한 거리 커널이 좌표에 얼마나 담겼는지를 평가하는 값입니다. 원본 특징을 복원한 평균제곱오차나 분류 정확도가 아닙니다.
아이소맵과 헷갈리는 용어는 무엇이 다른가요?
PCA·일반 다차원 척도법과의 차이
주성분 분석(PCA)는 입력 분산이 큰 직교 방향으로 선형 투영합니다. 아이소맵은 먼저 이웃 그래프의 경로 거리를 만듭니다. 일반 다차원 척도법에 원본 직선 거리를 넣는 것과 아이소맵의 경로 거리를 넣는 것도 같은 문제는 아닙니다.
UMAP·t-SNE와의 차이
기존 UMAP 글은 가중 이웃 그래프의 관계를 저차원에 맞추는 방법을 다룹니다. t-SNE 글은 이웃 유사도 확률을 맞추는 시각화입니다. 아이소맵의 핵심은 모든 쌍의 최단 경로 거리와 그 거리의 투영입니다. 이웃을 이용한다는 공통점만으로 목적함수와 출력 해석을 같게 보면 안 됩니다.
스펙트럴 군집화·최단 경로 계산과의 차이
스펙트럴 클러스터링은 라플라시안의 좌표를 만든 뒤 군집 라벨을 정합니다. 아이소맵은 경로 거리 기반 좌표를 직접 출력하며 라벨 배정까지 하지 않습니다. Dijkstra나 Floyd-Warshall은 그 안의 거리 계산을 맡는 알고리즘으로 전체 차원 축소 방법과 구별합니다.
비교 정리: 같은 이웃 그래프를 출발점으로 삼더라도 경로 거리, 유사도 관계, 라플라시안, 최종 라벨 가운데 무엇을 계산하는지가 다릅니다.
실전에서는 어디에 쓰이나요?
합성 곡면에서 거리와 펼침을 비교합니다
공식 비교 예제는 S자 곡선 자료에서 여러 차원 축소 방법의 결과를 나란히 보여 줍니다. 구조를 알고 만든 자료는 직선 거리와 경로 거리의 차이를 설명하기 좋습니다. 예제에서 펼쳐진 모양이 나왔다고 일반 문서나 이미지에서도 같은 성공을 보장하지 않습니다.
이미지·측정 특징의 탐색 표현을 만듭니다
비슷한 관측이 연속해서 이어진다고 볼 근거가 있는 자료에서 이웃과 이동 관계를 살펴봅니다. 서로 다른 대상이 단지 특징값 때문에 연결됐는지 검토하고 대표 사례를 확인합니다. 사람의 성격·능력·위험도를 그림 좌표 하나로 판정하는 용도로 바꾸지 않습니다.
후속 모델의 입력 후보로 비교합니다
학습한 아이소맵은
transform(X_new)
으로 새 입력을 기존 공간에 배치합니다. 새 점의 훈련 이웃과 저장한 경로 거리로 커널을 만든 뒤 투영합니다. 전체 자료를 다시 학습하는 것과 다르며 변환 성공만으로 분포가 다른 입력의 품질까지 입증되지는 않습니다.
아이소맵을 적용할 때 어떤 순서로 확인하나요?
1. 사례의 단위와 거리 의미를 고정합니다
한 행이 무엇이고 어떤 특징이 거리를 결정하는지 적습니다. 결측값, 중복, 단위 차이와 불필요한 식별자를 점검합니다. 이미 계산한 거리를 넣는
metric="precomputed"
에서는 훈련 입력이 같은 사례 순서의 정사각 거리 행렬이어야 합니다. 유사도 값을 그대로 넣지 않습니다.
2. 연결 상태와 지름길 후보를 살핍니다
이웃 수나 반경별로 연결 성분과 고립 사례를 확인합니다. 구조의 다른 부분을 가로지르는 긴 선이나 이상치가 만든 연결을 원본에서 살펴봅니다. 경고를 없애려고 이웃을 무작정 늘리지 말고 바뀐 경로가 무엇인지 기록합니다.
3. 같은 입력으로 차원과 왜곡을 비교합니다
출력 차원을 바꾸면서 거리 왜곡과 이웃 유지 정도를 보고 원본 특징을 쓰는 기준 결과와 비교합니다. 그래프까지 바꾼 재구성 오차는 맞추려는 거리 자체가 달라진 값입니다. 가장 작은 숫자만 골라 좋은 의미 표현이라고 결론 내리지 않습니다.
4. 학습 범위와 변환 계약을 보관합니다
후속 예측을 평가한다면 자료를 먼저 나누고 각 훈련 폴드에서 전처리와 아이소맵을 맞춥니다. 검증 자료에는 저장한 변환만 적용합니다. 열 순서·거리 설정·이웃 정책·라이브러리 버전과 모델을 보관하고 새 입력의 실행 시간과 이상한 이웃을 확인합니다.
실전 팁: 전체 자료의 탐색 그림과 보지 않은 자료의 예측 평가는 따로 기록하세요. 비지도 변환도 평가 자료를 먼저 포함하면 검증 경계가 달라집니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 끊긴 그래프의 자동 보완을 성공 판정으로 쓰지 않습니다. 확인한 구현은 일반 입력에서 연결 성분이 여러 개면 경고를 내고 선을 추가해 연결을 보완합니다. 반면 사전 계산한 희소 거리 그래프는 같은 상황에서 오류가 납니다. 자동으로 추가된 연결이 업무 의미에도 맞는지는 별도 확인합니다.
둘째, 희소 그래프와 전체 거리 행렬의 저장량을 구분합니다. 이웃 연결이 적어도 학습 뒤에는 모든 쌍의 경로 거리를 담은 행렬이 필요합니다. 사례 수의 제곱에 비례하는 저장 부담을 고려하고 작은 표본에서 시간과 메모리를 확인합니다. 이웃 검색만 빠르게 바꾼다고 전체 비용이 사라지지 않습니다.
셋째, 잡음·빈 구간·분포 변화를 함께 봅니다. 표본이 드문 부분은 경로를 끊거나 돌아가게 만들고 엉뚱한 연결은 지름길을 만듭니다. 새 입력이 기존 훈련 이웃과 맞지 않으면 저장한 공간에 넣은 좌표를 그대로 믿지 않습니다.
넷째, 좋은 그림을 정확한 분류나 원인 설명으로 바꾸지 않습니다. 출력 좌표는 선택한 표본과 거리 계약의 결과입니다. 시각화의 분리, 후속 예측 성능, 의미 검색 품질은 다른 점검 항목입니다. 입력을 바꿔 다시 학습한 좌표축도 이전 그림과 공통 축이라고 가정하지 않습니다.
주의: 그래프에서 가장 짧은 길을 정확히 찾았어도 그 길이 실제 데이터 구조를 따라간다는 보장은 없습니다. 연결의 의미와 독립 평가가 남아야 합니다.
자주 묻는 질문
Q1. 아이소맵은 정답 라벨이 필요한가요?
기본 scikit-learn Isomap은 정답 라벨 없이 입력의 거리 구조를 학습합니다. fit의 y는 사용하지 않습니다. 점에 라벨 색상을 붙이는 해석 단계와 좌표 학습을 구분합니다.
Q2. 측지 거리는 원본 두 점의 직선 거리인가요?
아닙니다. 이 글에서는 이웃 그래프를 따라가는 최단 경로로 근사합니다. U자 예시처럼 직선으로 가까운 점도 그래프에서 멀 수 있고, 잘못된 연결이 생기면 경로가 지나치게 짧아질 수 있습니다.
Q3. 이웃 수와 반경을 둘 다 설정하면 더 좋나요?
이 구현에서는 두 방식을 동시에 지정하면 오류가 납니다. 이웃 수를 쓸지 반경을 쓸지 먼저 정하고 반경 방식에서는 n_neighbors=None으로 둡니다. 둘 중 어느 쪽이 유용한지는 자료의 연결 상태로 비교합니다.
Q4. 새 데이터는 기존 공간에 바로 넣을 수 있나요?
학습된 Isomap의 transform을 사용할 수 있습니다. 새 점에서 훈련 이웃으로 이어지는 거리와 저장된 경로 행렬을 이용합니다. 전체 재학습과 같은 계산이 아니며 훈련 범위 밖 자료에도 올바른 표현을 보장하지 않습니다.
Q5. 재구성 오차가 작으면 분류도 잘되나요?
그 값은 경로 거리 커널의 좌표 표현 오차입니다. 분류 정확도나 원본 특징의 복원 오차가 아닙니다. 후속 모델의 결과는 별도 검증 자료와 해당 업무 지표로 평가합니다.
Q6. 아이소맵은 UMAP이나 PCA보다 항상 좋은가요?
아닙니다. 거리 구조가 적절한지, 표본이 충분한지, 전역 경로와 국소 이웃 중 무엇을 읽으려는지에 따라 달라집니다. 계산 부담과 새 입력 처리까지 같은 조건에서 비교하고 그림만 보고 우열을 정하지 않습니다.
출처
마무리
아이소맵은 이웃 그래프의 최단 경로 거리로 데이터 구조를 근사하고 이를 적은 수의 좌표에 담는 방법입니다. 직선 거리와 경로 거리, 이웃 연결과 좌표 투영, 그림과 라벨의 역할을 구분하면 결과를 읽기 쉬워집니다.
처음에는 작은 자료에서 연결 성분과 지름길부터 확인하세요. 같은 입력으로 이웃 정책과 출력 차원을 비교하고 원본 사례로 돌아갑니다. 후속 모델을 평가할 때는 변환 학습도 분할 안에서 수행하고 새 입력의 계약과 계산 비용까지 남기는 것이 마지막 점검입니다.
