이 글을 쓰게 된 이유
썸블링 블로그의 다른 글들을 읽다 보면 “코사인 유사도”라는 단어가 반복적으로 등장합니다. Soul Score를 계산하는 핵심 수식이자, 두 사람의 성격이 얼마나 닮았는지를 판단하는 기준이기도 합니다.
이름만 들으면 고등학교 수학 시간의 악몽이 떠오를 수 있습니다. “코사인이 삼각함수 아니었나? 그걸 왜 사람 매칭에 써?” 당연한 의문입니다. 이 글에서는 그 의문에 답하기 위해, 코사인 유사도가 어디에서 탄생했고, 왜 작동하며, 과학적으로 어떤 근거가 있는지 비개발자도 이해할 수 있도록 풀어보겠습니다.
1. 삼각함수에서 태어나다
코사인(cosine)의 원래 의미
코사인은 원래 삼각형의 각도와 변의 관계를 설명하는 함수입니다. 직각삼각형에서:
cos(θ) = 인접한 변의 길이 / 빗변의 길이
여기서 중요한 것은 θ(세타)가 각도라는 점입니다.
- θ = 0도 → cos(0) = 1 (두 변이 완전히 같은 방향)
- θ = 90도 → cos(90) = 0 (두 변이 완전히 수직)
- θ = 180도 → cos(180) = -1 (두 변이 완전히 반대 방향)
flowchart LR
subgraph same["θ = 0°"]
A1["→ A"]
B1["→ B"]
R1["cos = 1.0<br/>완전 일치"]
end
subgraph partial["θ = 60°"]
A2["→ A"]
B2["↗ B"]
R2["cos = 0.5<br/>부분 유사"]
end
subgraph ortho["θ = 90°"]
A3["→ A"]
B3["↑ B"]
R3["cos = 0.0<br/>무관"]
end
subgraph opposite["θ = 180°"]
A4["→ A"]
B4["← B"]
R4["cos = -1.0<br/>정반대"]
end
style same fill:#e8fce8,stroke:#4a4
style partial fill:#f3f0ff,stroke:#7F5AF0
style ortho fill:#fff8e0,stroke:#cc0
style opposite fill:#fee,stroke:#e55
이 성질이 핵심입니다. 코사인 값은 두 방향이 얼마나 같은지를 -1~1 사이의 숫자로 알려줍니다. 1750년대 레온하르트 오일러(Leonhard Euler)가 정립한 이 관계는 300년이 지난 지금, AI와 데이터 과학의 기초 도구가 되었습니다.
2. 벡터라는 개념
숫자의 나열로 세상을 표현하기
**벡터(vector)**는 숫자를 순서대로 나열한 것입니다. 물리학에서는 “방향과 크기를 가진 양”이지만, 데이터 과학에서는 무엇이든 숫자로 나열할 수 있으면 벡터로 만들 수 있다는 의미로 확장됩니다.
커피 취향을 예로 들어보겠습니다.
| 기준 | 나 | 친구 A | 친구 B |
|---|---|---|---|
| 산미 선호도 | 80 | 75 | 20 |
| 바디감 선호도 | 30 | 25 | 90 |
이것을 벡터로 쓰면:
나 = [80, 30]
친구 A = [75, 25]
친구 B = [20, 90]
2개의 숫자이므로 2차원 평면 위의 점으로 그릴 수 있습니다. 각 점을 원점에서 화살표로 연결하면, 화살표의 방향이 그 사람의 취향 패턴을 나타냅니다.
quadrantChart
title 커피 취향 공간
x-axis "산미 낮음" --> "산미 높음"
y-axis "바디감 낮음" --> "바디감 높음"
quadrant-1 "산미 + 바디감"
quadrant-2 "바디감 위주"
quadrant-3 "담백한 취향"
quadrant-4 "산미 위주"
"나": [0.80, 0.30]
"친구 A": [0.75, 0.25]
"친구 B": [0.20, 0.90]
나와 친구 A는 거의 같은 방향을 가리킵니다. 친구 B는 완전히 다른 방향이죠.
차원이 늘어나면?
커피는 2차원이면 충분하지만, 사람의 성격은 더 많은 기준이 필요합니다. 썸블링은 19개의 숫자(OCEAN 5개 + 가치관 10개 + 애착유형 4개)로 한 사람을 표현합니다. 19차원은 그림으로 그릴 수 없지만, 수학적으로는 2차원과 완전히 동일한 원리로 작동합니다.
flowchart LR
subgraph 2D["2차원"]
C["커피: [산미, 바디감]"]
end
subgraph 5D["5차원"]
O["OCEAN: [개방성, 성실성,<br/>외향성, 친화성, 신경성]"]
end
subgraph 19D["19차원"]
S["Soul Score 벡터:<br/>OCEAN + 가치관 + 애착유형"]
end
C --> O --> S
style 2D fill:#f3f0ff,stroke:#7F5AF0
style 5D fill:#f3f0ff,stroke:#7F5AF0
style 19D fill:#7F5AF0,color:#fff,stroke:#7F5AF0
3. 코사인 유사도의 수식
이제 본론입니다. 수식은 딱 세 단계입니다.
Step 1. 내적 (Dot Product)
두 벡터의 대응하는 값을 곱해서 더합니다.
A · B = A₁×B₁ + A₂×B₂ + ... + Aₙ×Bₙ
커피 예시:
나 · 친구A = 80×75 + 30×25 = 6000 + 750 = 6750
나 · 친구B = 80×20 + 30×90 = 1600 + 2700 = 4300
내적이 클수록 비슷한 경향입니다. 하지만 아직 공정한 비교가 아닙니다. 벡터 길이가 다르면 내적이 자동으로 커지기 때문입니다. 이것을 보정하는 것이 다음 단계입니다.
Step 2. 크기 (Magnitude)
각 벡터의 길이를 구합니다. 피타고라스 정리의 확장입니다.
||A|| = √(A₁² + A₂² + ... + Aₙ²)
||나|| = √(80² + 30²) = √(7300) ≈ 85.4
||친구A|| = √(75² + 25²) = √(6250) ≈ 79.1
||친구B|| = √(20² + 90²) = √(8500) ≈ 92.2
Step 3. 나누기
cos(A, B) = (A · B) / (||A|| × ||B||)
나 vs 친구A = 6750 / (85.4 × 79.1) ≈ 0.999
나 vs 친구B = 4300 / (85.4 × 92.2) ≈ 0.546
| 비교 | 코사인 유사도 | 해석 |
|---|---|---|
| 나 vs 친구 A | 0.999 | 거의 동일한 취향 |
| 나 vs 친구 B | 0.546 | 상당히 다른 취향 |
직관과 정확히 일치합니다.
왜 “코사인” 유사도인가?
수식을 자세히 보면, 이것은 사실 두 벡터 사이 각도(θ)의 코사인 값을 구한 것입니다. 선형대수학에서 내적은 다음과 같이 정의됩니다:
A · B = ||A|| × ||B|| × cos(θ)
양변을 ||A|| × ||B||로 나누면:
cos(θ) = (A · B) / (||A|| × ||B||)
이것이 코사인 유사도 공식 그 자체입니다. 즉, 코사인 유사도는 두 벡터가 이루는 각도의 코사인 값입니다. 이름이 코사인 유사도인 이유가 바로 이것입니다.
4. 유클리드 거리와의 비교
“그냥 두 점 사이의 거리를 재면 안 되나?” 이것은 매우 자연스러운 질문입니다. 두 점 사이의 직선 거리를 **유클리드 거리(Euclidean Distance)**라고 합니다.
거리 = √((A₁-B₁)² + (A₂-B₂)² + ... + (Aₙ-Bₙ)²)
결정적 차이: 스케일 문제
두 사람의 OCEAN 성격 프로필을 비교해보겠습니다.
A: [80, 60, 40, 70, 20] (전반적으로 점수가 높은 사람)
B: [40, 30, 20, 35, 10] (전반적으로 점수가 낮은 사람)
패턴을 보면 둘 다 “외향성 > 친화성 > 개방성 > 성실성 > 신경성” 순서입니다. 성격 구조가 매우 비슷합니다. B는 단지 설문에 신중하게 답했거나, 문화적으로 낮게 응답하는 경향이 있었을 뿐일 수 있습니다.
flowchart TD
subgraph Euclidean["유클리드 거리"]
E1["두 점 사이의 직선 거리를 측정"]
E2["A와 B의 거리 = 55.9"]
E3["판정: 매우 다르다 ✗"]
E4["문제: 응답 스케일 차이에 취약"]
end
subgraph Cosine["코사인 유사도"]
C1["두 화살표의 각도를 측정"]
C2["A와 B의 유사도 = 1.000"]
C3["판정: 완전히 같다 ✓"]
C4["장점: 스케일 차이를 자동 보정"]
end
style Euclidean fill:#fee,stroke:#e55
style Cosine fill:#e8fce8,stroke:#4a4
| 방법 | 결과 | 해석 |
|---|---|---|
| 유클리드 거리 | 55.9 (큰 값) | “이 두 사람은 매우 다르다” |
| 코사인 유사도 | 1.000 | ”이 두 사람은 완전히 같은 패턴이다” |
코사인 유사도는 벡터를 정규화(normalize) — 길이를 1로 만든 후 비교하기 때문에 전체적인 크기 차이에 영향받지 않습니다. 성격 검사에서는 절대적인 점수보다 상대적인 패턴이 더 의미 있기 때문에, 코사인 유사도가 적합합니다.
5. 과학적 근거와 역사적 배경
정보 검색(IR)에서의 탄생: 1960년대
코사인 유사도가 처음 주목받은 분야는 **정보 검색(Information Retrieval)**입니다.
1960년대 코넬 대학교의 Gerard Salton 교수는 문서와 검색어를 벡터로 표현하는 **벡터 공간 모델(Vector Space Model)**을 제안했습니다. 문서에 등장하는 단어의 빈도를 벡터로 만들고, 검색어 벡터와의 코사인 유사도가 높은 문서를 상위에 노출하는 방식입니다.
이 모델은 이후 TF-IDF, BM25, 그리고 현대의 임베딩 기반 검색까지 이어지는 검색 기술의 초석이 됩니다. Google의 초기 검색 엔진도 이 개념의 영향을 받았습니다.
Salton, G., Wong, A., & Yang, C. S. (1975). “A Vector Space Model for Automatic Indexing.” Communications of the ACM, 18(11), 613-620.
추천 시스템으로의 확장: 1990~2000년대
1990년대 Amazon과 Netflix가 추천 시스템을 본격화하면서, 코사인 유사도는 **협업 필터링(Collaborative Filtering)**의 핵심 도구가 됩니다.
사용자 A와 사용자 B의 영화 평점 벡터를 비교하여, 취향이 비슷한 사용자가 높게 평가한 영화를 추천하는 방식입니다. 2006년 Netflix Prize 대회에서 우승한 팀들도 코사인 유사도를 기본 유사도 측정 도구로 사용했습니다.
Breese, J. S., Heckerman, D., & Kadie, C. (1998). “Empirical Analysis of Predictive Algorithms for Collaborative Filtering.” UAI ‘98.
심리학에서의 프로필 유사도 연구
성격 심리학에서도 프로필 유사도 측정은 오래된 주제입니다.
Cattell의 rₚ 계수(1949)는 두 사람의 심리 프로필이 얼마나 비슷한지를 측정하는 초기 시도였습니다. 이후 Cronbach & Gleser(1953)는 프로필 유사도를 거리(distance), 형태(shape), 분산(scatter) 세 요소로 분해할 수 있음을 보였습니다.
코사인 유사도는 이 중 형태(shape) 유사도에 해당합니다. 즉, 두 사람의 점수 높낮이 패턴이 얼마나 같은지를 측정합니다. 심리학 연구에서 관계 만족도와 가장 높은 상관을 보인 것이 바로 이 형태 유사도입니다.
Cronbach, L. J., & Gleser, G. C. (1953). “Assessing similarity between profiles.” Psychological Bulletin, 50(6), 456-473.
OCEAN 모델과 관계 만족도
썸블링이 OCEAN(Big Five) 모델을 사용하는 이유도 과학적 근거가 있습니다.
- Barelds(2005)의 연구에서 커플의 OCEAN 프로필 유사도와 관계 만족도 사이에 유의미한 양의 상관이 확인되었습니다.
- Luo & Klohnen(2005)은 실제 신혼부부를 대상으로 한 연구에서, 가치관과 태도의 유사성이 관계 질에 긍정적 영향을 미친다는 것을 보여주었습니다.
- Hudson & Fraley(2014)는 Big Five 특성 중 특히 친화성(Agreeableness)과 정서적 안정성(낮은 Neuroticism)의 유사도가 관계 만족도의 강력한 예측 변수임을 밝혔습니다.
Luo, S., & Klohnen, E. C. (2005). “Assortative mating and marital quality in newlyweds.” Journal of Personality and Social Psychology, 88(2), 304-326.
현대 AI에서의 활용
2020년대에 들어서 코사인 유사도는 **대규모 언어 모델(LLM)**과 **임베딩(embedding)**의 핵심 연산이 되었습니다.
- OpenAI의 텍스트 임베딩: 문장을 1,536차원 벡터로 변환하고, 코사인 유사도로 의미적 유사성을 측정
- 얼굴 인식(FaceNet): 얼굴 이미지를 128차원 벡터로 변환하고, 코사인 유사도로 동일인 여부를 판단
- Spotify의 음악 추천: 곡의 오디오 특성을 벡터화하고, 코사인 유사도로 비슷한 곡을 추천
검색, 추천, 인식, 매칭까지 — 코사인 유사도는 “두 것이 얼마나 비슷한가?”라는 질문에 대한 가장 범용적인 답입니다.
6. 값의 범위와 해석
| 값 | 각도 | 의미 | 예시 |
|---|---|---|---|
| 1.0 | 0° | 완전히 같은 방향 | 쌍둥이 수준의 성격 |
| 0.8~0.9 | 25~35° | 상당히 유사 | 대화가 잘 통하는 사이 |
| 0.5~0.7 | 45~60° | 약간 유사 | 공통점도 있고 차이도 있는 |
| 0.0 | 90° | 무관 (직교) | 성향이 완전히 독립적 |
| -1.0 | 180° | 완전히 반대 | 모든 면에서 정반대 |
썸블링에서는 성격 점수가 모두 0 이상이므로 실제 범위는 0~1입니다. 이를 100을 곱해 Soul Score로 변환합니다.
Soul Score = 코사인 유사도 × 100
7. 썸블링에서 어떻게 쓰이나
썸블링은 소울 테스트 50문항의 응답을 19차원 벡터로 변환합니다.
sequenceDiagram
participant U as 사용자
participant T as 소울 테스트
participant S as 서버
participant DB as PostgreSQL
U->>T: 50문항 응답
T->>S: 응답 데이터 전송
S->>S: OCEAN 5차원 벡터 계산
S->>S: 가치관 10차원 벡터 계산
S->>S: 애착유형 4차원 벡터 계산
S->>S: 가중 결합 → 19차원 매칭 벡터
S->>DB: matching_vector JSONB 저장
Note over S,DB: 매일 새벽 2시 배치
S->>DB: 후보 필터링 (성별, 나이, 차단)
DB-->>S: 후보 벡터 목록
S->>S: 코사인 유사도 계산
S->>S: Top 3 선정
S-->>U: 오늘의 매칭 (Soul Score 표시)
가중치가 적용되는 방식
19차원 벡터는 세 영역의 비중이 다릅니다.
| 영역 | 차원 수 | 가중치 | 근거 |
|---|---|---|---|
| OCEAN 성격 | 5 | 50% | Big Five 모델의 관계 예측력 (Costa & McCrae, 1992) |
| 가치관 | 10 | 30% | 가치관 유사성의 관계 만족도 기여 (Schwartz, 1992) |
| 애착유형 | 4 | 20% | 애착 이론의 관계 안정성 예측 (Bowlby, 1969) |
각 하위 벡터에 √(가중치)를 곱한 후 결합합니다. 코사인 유사도 내적 계산에서 이 값이 제곱되므로, 최종 기여도는 정확히 지정된 가중치 비율이 됩니다.
8. 직접 계산해보기
두 사람의 OCEAN 프로필만으로 간단히 계산해봅시다.
지민: [개방성 72, 성실성 58, 외향성 81, 친화성 65, 신경성 34]
수현: [개방성 68, 성실성 62, 외향성 78, 친화성 70, 신경성 30]
Step 1. 내적
72×68 + 58×62 + 81×78 + 65×70 + 34×30
= 4896 + 3596 + 6318 + 4550 + 1020
= 20380
Step 2. 크기
||지민|| = √(72² + 58² + 81² + 65² + 34²) = √20490 ≈ 143.1
||수현|| = √(68² + 62² + 78² + 70² + 30²) = √20352 ≈ 142.7
Step 3. 코사인 유사도
cos = 20380 / (143.1 × 142.7) = 20380 / 20424 ≈ 0.998
Soul Score = 99.8점. 두 사람은 성격 패턴이 매우 유사합니다.
9. 한계와 썸블링의 보완 전략
코사인 유사도는 강력하지만 만능은 아닙니다.
| 한계 | 설명 | 썸블링의 보완 |
|---|---|---|
| 형태만 측정 | 절대적 수준 차이를 무시 | 애착유형(범주형)을 별도 가중치로 반영 |
| 선형적 관계 가정 | 비선형 궁합은 포착 불가 | 애착유형 호환성 매트릭스로 보완 |
| 차원의 저주 | 고차원에서 유사도가 수렴 | 19차원으로 적정 수준 유지 |
| 응답 신뢰도 | 부정확한 응답이 벡터를 왜곡 | 역문항 배치 + 일관성 검증 |
코사인 유사도는 출발점입니다. 썸블링은 실제 커플의 만남 후기 데이터를 축적하여, 가중치를 학습하고 비선형 요소를 반영하는 방향으로 알고리즘을 발전시킬 계획입니다.
핵심 정리
| 개념 | 한 줄 요약 |
|---|---|
| 코사인 | 두 방향이 이루는 각도를 -1~1로 표현하는 삼각함수 |
| 벡터 | 숫자의 나열. 사람의 특성을 좌표로 표현 |
| 코사인 유사도 | 두 벡터의 방향이 얼마나 같은지. 내적 / (크기 × 크기) |
| 유클리드 거리와의 차이 | 크기가 아닌 패턴(방향)을 비교. 스케일 차이에 강건 |
| 역사 | 1960년대 문서 검색에서 시작 → 추천 시스템 → AI 임베딩 |
| 심리학 근거 | 프로필 형태 유사도가 관계 만족도와 높은 상관 |
| 썸블링 활용 | 19차원 성격 벡터의 유사도 → Soul Score (0~100) |
300년 전 삼각함수에서 시작된 코사인은, 60년 전 문서 검색의 핵심 도구가 되었고, 오늘날 AI 시대의 “유사도 측정 표준”이 되었습니다. 썸블링은 이 검증된 수학을 사람과 사람의 내면 매칭에 적용한 것입니다.
Soul Score의 기술적 구현이 궁금하다면 Soul Score 알고리즘 글을 참고해주세요.
참고 문헌
- Salton, G., Wong, A., & Yang, C. S. (1975). “A Vector Space Model for Automatic Indexing.” Communications of the ACM, 18(11), 613-620.
- Cronbach, L. J., & Gleser, G. C. (1953). “Assessing similarity between profiles.” Psychological Bulletin, 50(6), 456-473.
- Luo, S., & Klohnen, E. C. (2005). “Assortative mating and marital quality in newlyweds.” Journal of Personality and Social Psychology, 88(2), 304-326.
- Costa, P. T., & McCrae, R. R. (1992). Revised NEO Personality Inventory (NEO-PI-R) and NEO Five-Factor Inventory (NEO-FFI) Professional Manual. Psychological Assessment Resources.
- Breese, J. S., Heckerman, D., & Kadie, C. (1998). “Empirical Analysis of Predictive Algorithms for Collaborative Filtering.” UAI ‘98.
GitHub 계정으로 로그인하여 댓글을 남길 수 있습니다. 허위사실, 욕설, 사칭 등의 댓글은 통보 없이 삭제될 수 있습니다.