반응형
유클리드 거리는 크기로만 비교한다는 명확한 단점이 있어서 사실 추천시스템에서 유용한 방법은 아니라고 알려져있다.
하지만 선형대수 관점에서 유클리드 거리가 단순히 크기만 뜻하는 것이 아니라, 현실 세계에서 어떻게 접목되고 활용되는지 알 수 있는 것만으로도 큰 도움이 되리라 생각한다.
또한 시도해보는 것 자체만으로 다른 개념을 이해할 때 큰 도움이 되리라 생각한다.
엑셀 테이블에 고객의 데이터가 저장되어 있다고 가정해보자.
이를 테면 아래와 같은 테이블처럼 고객 데이터가 있을 때, 이 데이터를 euclidean distance 개념에 입각해서 어떻게 활용할 수 있을까?
고객명 | 키 | 몸무게 | 나이 | 성별 |
박미영 | 160 | 50 | 23 | 여성 |
아이윳 | 155 | 48 | 27 | 여성 |
이순신 | 175 | 71 | 31 | 남성 |
강감찬 | 176 | 75 | 28 | 남성 |
단순하다.
범주형 변수는 숫자형 변수로 바꿔주고,
하나의 행을 벡터로 보고 각 벡터별로 거리를 구하면 된다.
비슷한 유형의 데이터는 거리가 가까울 것이며,
그렇지 않은 유형의 데이터는 거리가 멀 것이다.
여기서는 단순한 예제이기에 성별별로 거리가 멀고 가까움을 알 수 있다.
# 유클리드 거리를 이용한 유사도 측정
import numpy as np
import pandas as pd
def euclidean_dist(x, y):
return np.sqrt(np.sum((x - y) ** 2))
# (height, weight, age, sex(man=0, woman=1))
woman1 = pd.Series([160, 50, 23, 1], name='woman1')
woman2 = pd.Series([155, 48, 27, 1], name='woman2')
man1 = pd.Series([175, 72, 31, 0], name='man1')
man2 = pd.Series([176, 75, 28, 0], name='man2')
lst = [woman1, woman2, man1, man2]
# print(li)
def recommend_by_dist(li):
for i in range(0, len(lst)-1):
for j in range(i+1, len(lst)):
x, y = lst[i], lst[j]
print('distance between {} and {}: {}'.format(x.name, y.name, euclidean_dist(x, y)))
recommend_by_dist(lst)
# 출력 결과물:
distance between woman1 and woman2: 6.708203932499369
distance between woman1 and man1: 27.820855486487112
distance between woman1 and man2: 30.116440692751194
distance between woman2 and man1: 31.51190251317746
distance between woman2 and man2: 34.23448553724738
distance between man1 and man2: 4.358898943540674
같은 성별끼리는 거리가 가깝고, 다른 성별끼리는 거리가 멀게 나온 것을 확인할 수 있다.
유클리드 거리에 기반한 유사도는 방향이나 패턴을 전혀 고려하지 않았다는 점에서 한계가 명확하며,
자카드나 코사인 유사도의 활용성이 더 좋다는 것을 알아두자
반응형
'추천시스템 > 추천시스템 기초' 카테고리의 다른 글
[python] 코사인 유사도를 이용한 추천시스템 - 기초 (0) | 2022.12.22 |
---|