랜덤 투영(Random Projection)이란? AI에서 무작위 행렬로 데이터의 차원을 줄이는 방법
TL;DR
랜덤 투영은 적절한 분포로 무작위 행렬을 만들고 원본 수치 특징에 곱해 더 작은 좌표 공간으로 옮기는 방법입니다. 데이터가 가장 넓게 퍼진 방향을 학습하지 않고도 많은 특징을 줄일 후보가 됩니다. 충분한 출력 차원에서 표본 쌍의 유클리드 거리를 대략 유지한다는 이론을 활용하지만 실제 왜곡과 후속 모델의 성능은 따로 확인합니다. 같은 행렬을 새 입력에도 사용하고, 차원 축소를 정확 복원이나 개인정보 보호로 오해하지 않습니다.
핵심 3줄 요약
- 핵심 1
새 축을 무작위로 정합니다. 여러 원본 특징을 행렬의 계수로 섞어 적은 좌표를 만듭니다. - 핵심 2
거리에는 왜곡이 생깁니다. 출력 차원과 난수 행렬을 바꾸며 표본 쌍의 제곱 거리를 점검합니다. - 핵심 3
변환 행렬을 함께 저장합니다. 같은 좌표를 쓰려면 새 입력과 기존 입력에 같은 전처리와 행렬을 적용합니다.
이 글에서 다룰 내용
- 랜덤 투영의 한 문장 정의
- 세 숫자를 두 좌표로 바꾸는 쉬운 예시
- 행렬 생성·특징 혼합·새 입력 변환의 작동 순서
- 가우시안·희소 투영과 출력 차원·eps의 역할
- 존슨-린덴스트라우스 보조정리와 거리 왜곡의 의미
- PCA·특징 해싱·양자화와의 차이
- 행렬 저장·근사 복원·품질과 메모리 점검법
랜덤 투영을 한 문장으로 정의하면 무엇인가요?
랜덤 투영은 무작위로 생성한 투영 행렬을 수치 데이터에 곱해 더 적은 좌표로 표현하면서 표본 사이의 거리를 대략 유지하려는 선형 차원 축소 방법입니다.
영문명은 Random Projection입니다. 무작위 투영이나 임의 투영이라는 번역도 같은 개념을 가리킵니다. 이 글은 scikit-learn의 가우시안 투영과 희소 투영을 중심으로 설명합니다. 원본의 각 행은 한 표본이고 각 열은 수치 특징이며, 변환 뒤에는 같은 표본을 더 적은 열로 나타냅니다.
무작위라는 말은 아무 숫자나 넣어도 된다는 뜻이 아닙니다. 계수의 분포와 크기를 출력 차원에 맞춰 정합니다. scikit-learn의 fit은 입력 모양과 난수 설정으로 행렬을 생성하며 정답 라벨을 사용하지 않습니다. 데이터의 공분산이나 분산이 큰 축을 학습하는 단계도 없습니다.
한 줄 정리: 이미 숫자로 표현한 특징을 정해진 무작위 행렬로 섞어 작은 벡터로 만드는 방법입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 세 개의 수치 특징을 두 좌표로 옮긴다고 가정해 보겠습니다. 계산을 보기 쉽게 첫 좌표는 첫째 값과 셋째 값을 더하고, 둘째 좌표는 둘째 값에서 셋째 값을 빼도록 계수를 고정합니다. 다음 숫자는 직접 정한 설명용 행렬의 결과이며 라이브러리가 난수로 뽑은 행렬이나 실제 고객 성능이 아닙니다.
- 입력 A가
(1, 2, 3)이면 출력은(4, -1)입니다. 여러 원본 열이 한 출력 좌표에 함께 들어갑니다. - 입력 B가
(2, 2, 3)이면 출력은(5, -1)입니다. A와 B의 제곱 거리는 원본과 출력에서 모두 1입니다. - 입력 C가
(1, 2, 4)이면 출력은(5, -2)입니다. A와 C의 제곱 거리는 원본에서 1이지만 출력에서는 2입니다.
Python의 정수 행렬 곱과 제곱 거리 계산으로 위 결과를 확인했습니다. 작은 고정 행렬은 어떤 표본 쌍의 거리가 유지되고 다른 쌍은 왜곡될 수 있음을 보여 줍니다. 세 특징을 두 좌표로 줄였다는 사실만으로 모든 쌍의 거리가 잘 보존됐다고 보고할 수 없습니다.
실제 랜덤 투영은 문서에 정한 분포와 크기로 계수를 생성합니다. 더 큰 출력 차원과 여러 난수 행렬을 시험하고 원본 거리 대비 변환 거리의 비율을 확인합니다. 설명용 예시에서 한 쌍이 정확히 맞았다는 결과를 일반적인 성공률이나 허용 오차의 보증으로 옮기지 않습니다.
쉬운 예시: 출력 숫자가 줄어드는 계산과 필요한 관계가 유지되는 검증은 별개입니다. 같은 변환도 표본 쌍에 따라 왜곡 정도가 다릅니다.
왜 AI에서 랜덤 투영이 중요한가요?
많은 특징을 적은 좌표로 다룹니다
단어 빈도나 이미지 수치 특징처럼 열이 매우 많으면 저장과 후속 계산에 부담이 생깁니다. 랜덤 투영은 데이터의 주성분을 찾는 대신 행렬을 만들고 곱합니다. 이론적 근거가 있는 간단한 축소 후보지만, 행렬 생성과 변환 비용까지 포함해 원본을 쓰는 기준과 비교해야 합니다.
거리 기반 작업의 절충을 시험합니다
가까운 사례를 찾거나 거리로 군집을 나눌 때 표본 간 관계가 중요합니다. 랜덤 투영의 주요 근거는 유클리드 거리의 작은 왜곡입니다. 실제 검색 순위나 군집 결과까지 동일하게 유지된다는 보장은 없으므로 필요한 이웃의 유지 정도와 업무별 품질을 함께 측정합니다.
입력값에서 축을 학습하지 않는 후보입니다
같은 모양의 입력과 같은 정수 시드라면 행렬 생성은 특징값의 분산이나 정답을 보고 좋은 방향을 고르지 않습니다. 새 입력에는 저장된 행렬을 그대로 곱합니다. 다만 출력 차원 선택, 사전 스케일링, 뒤 모델의 학습에는 검증 경계가 필요하며 전체 흐름까지 학습이 없다고 부르지는 않습니다.
핵심 인사이트: 정보가 중요해 보이는 방향을 먼저 고르는 비용과, 무작위로 줄인 뒤 품질을 검사하는 비용을 비교하는 선택입니다.
랜덤 투영은 어떤 순서로 작동하나요?
1. 입력 특징과 출력 차원을 정합니다
한 행의 의미, 원본 열 순서, 수치 단위와 결측 처리를 고정합니다. 투영은 문자열의 의미를 자동으로 읽지 않으므로 텍스트에는 먼저 단어 빈도·TF-IDF·기존 임베딩 같은 숫자 표현이 필요합니다. 유지하려는 거리의 의미도 그 입력 표현과 전처리에 따라 달라집니다.
2. 분포에 맞는 행렬을 생성합니다
가우시안 방식은 계수를 평균 0, 분산이 출력 차원 수의 역수인 정규분포에서 뽑습니다. 여기서 분산과 표준편차를 구별합니다. 확인한 공식 구현은 난수 생성기의 표준편차에 출력 차원 수의 제곱근 역수를 넣습니다. 생성한 축들이 PCA처럼 서로 직교하도록 맞춰지는 것은 아닙니다.
희소 방식은 많은 계수를 0으로 두고 나머지에 양수와 음수를 배정합니다. 비영 계수의 밀도에 맞춰 크기도 조정합니다. 계수를 0으로 만드는 확률을 높이면서 남은 크기를 그대로 둔다면 같은 분포가 되지 않습니다. 공식 구현의 밀도와 스케일을 한 묶음으로 읽습니다.
3. 같은 행렬로 모든 표본을 변환합니다
API의
components_
는 출력 차원 수 × 원본 특징 수 모양입니다. 입력이 표본 수 × 특징 수라면
X @ components_.T
로 표본 수 × 출력 차원 수 결과를 얻습니다. 원본 열을 몇 개 골라 남기는 계산과 달리 각 출력 좌표는 여러 원본 열의 선형 결합입니다.
검증 자료와 새 입력은 다시 fit하지 않고 저장된 모델의 transform을 사용합니다. 문서 벡터와 질문 벡터를 함께 비교한다면 양쪽에 같은 행렬을 적용합니다. 행렬을 바꾸고 기존 벡터를 남겨 두면 서로 다른 좌표계를 섞게 되므로 재변환과 인덱스 갱신이 필요합니다.
주요 설정과 결과는 어떻게 읽나요?
출력 차원과 eps의 역할을 구분합니다
n_components
는 출력 좌표의 개수입니다.
n_components="auto"
에서는 표본 수와
eps
를 이용한 보수적 추정으로 개수를 정합니다. eps는 이때 거리 왜곡 기준에 쓰이며 분류 오차나 허용 개인정보 노출률을 뜻하지 않습니다.
자동 계산에 쓰는 eps는 0보다 크고 1보다 작아야 합니다. 작게 정하면 추정 차원이 커집니다. 출력 차원을 정수로 지정하면 eps가 그 숫자를 다시 늘려 주지 않습니다. 줄어든 좌표를 반환했다고 설정한 eps 범위 안에 실제 모든 거리가 들어갔다고 해석하면 안 됩니다.
자동 계산도 차원을 줄이지 못할 수 있습니다
존슨-린덴스트라우스 보조정리는 유한한 표본 집합을 작은 왜곡으로 옮길 수 있다는 근거입니다. 공식 함수의 기준은 두 점 사이 제곱 거리가 원본 제곱 거리의
1 - eps
배와
1 + eps
배 사이에 드는지입니다. 일반 거리와 제곱 거리의 허용 비율을 혼동하지 않습니다.
확인한 구현의 추정식을 Python으로 계산하면 표본 1,000개에서 eps 0.5는 331차원, eps 0.1은 5,920차원입니다. 이는 추정식의 계산 결과이며 라이브러리 실행이나 실제 거리 검증 결과는 아닙니다. 자동 추정이 원본 특징 수를 넘으면 이 구현은 오류를 냅니다. 원본 차원과 업무 목적을 먼저 봅니다.
희소 밀도와 출력 자료형을 함께 봅니다
SparseRandomProjection
의
density
는 행렬에서 0이 아닌 계수를 뽑는 비율입니다. 자동 값은 원본 특징 수 제곱근의 역수이며 실제 표본에서 뽑힌 비영 비율과 구분합니다. 밀도를 낮추면 행렬의 저장 부담을 줄일 후보가 되지만 품질과 곱셈 비용은 입력에서도 확인합니다.
dense_output=False
이면 희소 입력의 출력도 희소 표현을 사용합니다. 출력 좌표에 값이 많이 차면 희소 저장이 오히려 부담일 수 있습니다. 가우시안 방식은 조밀 행렬과 조밀 출력을 사용합니다. 입력·행렬·결과·후속 모델을 합한 메모리를 측정해야 절감 효과를 알 수 있습니다.
랜덤 투영과 헷갈리는 용어는 무엇이 다른가요?
PCA·무작위 SVD와의 차이
주성분 분석(PCA)는 중심화한 입력에서 분산이 큰 직교 방향을 찾습니다. 랜덤 투영은 정한 분포로 축을 생성하며 설명 분산 순으로 정렬하지 않습니다. PCA나 SVD의 randomized solver는 무작위 계산을 활용해 데이터의 주요 방향을 근사하는 구현입니다. 이름에 무작위가 있어도 출력의 목적이 다릅니다.
특징 해싱·의미 임베딩과의 차이
특징 해싱은 특징 이름을 해시해 고정 칸에 값을 누적합니다. 이 글의 가우시안·희소 랜덤 투영은 이미 숫자인 입력에 투영 행렬을 곱합니다. 관련 이론을 공유하는 변형이 있어도 API 입력과 출력 계약을 그대로 교환하지 않습니다. 의미 임베딩은 텍스트의 관계를 학습한 표현이며 그 벡터에 랜덤 투영을 추가할 수도 있습니다.
양자화·비선형 차원 축소와의 차이
스칼라 양자화는 숫자의 정밀도를 낮추는 압축이고 랜덤 투영은 좌표 수를 바꾸는 변환입니다. 서로 다른 절충이며 함께 적용할 때는 두 단계의 왜곡을 확인합니다. Isomap·LLE는 이웃 관계를 사용해 비선형 구조의 좌표를 찾습니다. 랜덤 투영은 하나의 선형 행렬로 입력을 변환합니다.
비교 정리: PCA는 데이터 분산을 보고 축을 찾고, 랜덤 투영은 축을 무작위로 정하며, 양자화는 각 숫자의 저장 정밀도를 조정합니다.
실전에서는 어디에 쓰이나요?
큰 텍스트 특징의 거리 비교
scikit-learn의 공식 예제는 뉴스그룹 문서의 TF-IDF 특징을 희소 랜덤 투영으로 옮기고 원본·출력의 제곱 거리 비율을 살핍니다. 출력 차원에 따른 왜곡 분포를 보는 실험입니다. 예제의 실행 시간과 저장량은 해당 환경의 측정값이며 모든 한국어 문서나 장치의 성능으로 일반화하지 않습니다.
후속 예측과 벡터 처리의 비교 후보
고차원 특징을 쓰는 분류·회귀나 벡터 거리 작업의 전처리 후보로 시험할 수 있습니다. 원본 특징, PCA 같은 대안과 같은 분할에서 품질을 비교합니다. 검색에 적용한다면 문서와 질문의 전처리·행렬·후속 정규화를 고정하고 중요한 질문의 이웃 순위와 누락을 별도로 확인합니다.
랜덤 투영을 적용할 때 어떤 순서로 확인하나요?
1. 줄이려는 비용과 기준 결과를 남깁니다
입력 차원 수, 표본 수, 원본 처리 시간과 메모리를 적습니다. 거리 비교가 목적이라면 대표 표본 쌍의 원본 제곱 거리도 보관합니다. 모든 쌍을 계산하는 비용이 크면 표본 추출 범위를 기록하고 중요한 이웃과 드문 사례를 포함합니다. 검사하지 않은 쌍까지 확인했다고 보고하지 않습니다.
2. 차원 수와 여러 시드를 비교합니다
가우시안·희소 방식과 출력 차원 후보를 정하고 같은 평가 자료에서 비교합니다. 정수
random_state
는 반복 실행의 재현성을 돕지만 한 시드에서 좋은 결과가 나왔다고 일반화하지 않습니다. 행렬을 여러 번 생성해 품질 변동을 남기고 최종 테스트는 선택에 사용하지 않습니다.
3. 거리 왜곡과 업무 지표를 따로 잽니다
원본 거리가 0이 아닌 쌍에서 출력 제곱 거리를 원본 제곱 거리로 나눈 비율을 확인합니다. 평균만 보지 말고 분포와 큰 왜곡 사례도 살핍니다. 원본에서 같은 점은 0으로 나누지 않습니다. 작은 거리 차이가 순위를 바꿀 수 있으므로 검색·군집·예측 지표는 별도입니다.
4. 전처리와 실제 행렬을 함께 보관합니다
열 순서, 자료형, 특징 생성 규칙, 스케일러, 출력 차원, 라이브러리 버전과 행렬을 모델과 묶습니다. 같은 시드라도 생성 절차나 환경이 바뀔 수 있어 실제 행렬 보관이 중요합니다. 이 변환은 중심화나 표준화를 자동 수행하지 않습니다. 필요한 전처리 통계는 각 훈련 분할에서 구합니다.
실전 팁: 거리 비율이 양호한 후보만 다음 단계로 넘기고, 마지막에는 원본을 쓰는 기준 모델과 업무 품질·총비용을 비교하세요.
사용할 때 무엇을 주의해야 하나요?
첫째, 확률적 근거를 무조건적인 품질 보증으로 쓰지 않습니다. 유한한 표본 집합과 적절한 분포·차원에 관한 이론을 모든 미래 입력의 보증으로 넓히지 않습니다. 자동 차원이 보수적이라는 설명도 실제 데이터 검사를 생략할 이유가 되지 않습니다.
둘째, 역변환을 원본의 완전 복원으로 부르지 않습니다.
inverse_transform
은 투영 행렬의 의사역행렬을 사용합니다. 축소하면서 잃은 성분을 일반적으로 복구하지 못합니다. 다시 투영한 값이 같더라도 처음 입력과 완전히 같은 값으로 돌아왔다는 의미는 아닙니다.
셋째, 복원 단계의 조밀 메모리를 계산합니다.
compute_inverse_components=True
는 fit에서 의사역행렬을 계산해 저장합니다. 기본값 False에서는 역변환을 호출할 때 다시 계산합니다. 희소 투영이어도 의사역행렬과 복원 결과는 조밀하므로 큰 입력을 한 번에 복원하면 부담이 커집니다.
넷째, 무작위 축소를 암호화나 비식별화로 사용하지 않습니다. 좌표가 바뀌고 개수가 줄어도 개인정보 보호를 자동으로 보장하지 않습니다. 원본과 행렬의 접근 권한, 결과 벡터의 보존과 배포 범위는 별도로 정합니다. 민감한 식별자는 특징 생성 전에 처리합니다.
주의: 차원 수 감소, 작은 거리 왜곡, 후속 모델의 정확도, 메모리 절감은 각각 다른 결과입니다. 한 가지 성공으로 나머지까지 통과했다고 판정하지 않습니다.
자주 묻는 질문
Q1. 랜덤 투영과 무작위 투영은 같은 말인가요?
네. 같은 Random Projection을 가리키는 표현입니다. 문서의 가우시안 방식과 희소 방식은 계수 분포와 저장 구조가 다르므로 어떤 구현을 선택했는지 함께 확인합니다.
Q2. fit을 호출하면 데이터의 패턴을 배우나요?
여기서 설명한 구현은 입력 모양과 난수 설정으로 행렬을 생성합니다. 정답 라벨, 공분산이나 분산이 큰 방향을 학습하지 않습니다. 다만 자동 차원은 표본 수를 사용하고 앞뒤 전처리와 예측 모델에는 학습 단계가 있을 수 있습니다.
Q3. eps를 0.1로 정하면 정확도 손실이 10% 이하인가요?
아닙니다. eps는 자동 출력 차원 계산의 제곱 거리 왜곡 기준입니다. 분류 정확도·검색 재현율·복원 오차의 허용값으로 읽지 않습니다. 정수로 차원을 지정했을 때는 eps가 그 수를 조절하지도 않습니다.
Q4. PCA의 randomized solver와 같은 방법인가요?
목적이 다릅니다. randomized solver는 입력의 주요 방향을 근사해 PCA나 SVD를 계산하는 방법입니다. 랜덤 투영은 데이터의 주요 방향을 찾지 않고 정한 분포로 만든 행렬을 그대로 변환에 사용합니다.
Q5. 희소 투영이면 출력 메모리도 항상 작은가요?
항상 그렇지는 않습니다. 출력에 값이 많이 차면 희소 표현의 인덱스 저장 비용도 커집니다. 입력 모양, 출력 차원과 자료형을 보고 실제 메모리를 확인하며, 역변환의 의사역행렬과 결과는 조밀하다는 점도 계산합니다.
Q6. 새 벡터가 들어올 때마다 행렬을 다시 만들면 되나요?
기존 벡터와 비교하려면 저장된 행렬을 그대로 사용합니다. 전처리와 열 순서도 같아야 합니다. 행렬을 교체하면 기존 벡터까지 재변환하고 관련 인덱스와 후속 모델을 함께 검증해야 같은 공간에서 비교합니다.
출처
마무리
랜덤 투영은 정한 분포로 만든 행렬을 수치 특징에 곱해 적은 좌표로 바꾸는 방법입니다. 데이터의 주성분을 학습하는 PCA, 특징 이름을 칸에 넣는 해싱, 숫자의 정밀도를 줄이는 양자화와 구별하면 목적과 결과를 읽기 쉬워집니다.
처음에는 작은 자료에서 투영 계산과 거리 왜곡부터 확인하세요. 이후 차원과 시드별 변동, 실제 업무 품질과 총메모리를 기준 결과와 비교합니다. 새 입력에도 같은 전처리와 행렬을 사용하고 근사 복원의 한계까지 기록해야 차원 축소의 이득을 정확하게 판단할 수 있습니다.
