헬창 개발자

코사인 유사도, 코사인 거리 구현[파이썬] 본문

데이터 분석

코사인 유사도, 코사인 거리 구현[파이썬]

찬배 2022. 4. 23. 21:33

1. 코사인 유사도란?

코사인 유사도(Cosine Similarity)는 두 벡터 간의 유사성을 측정하는 방법으로, 벡터 간의 각도를 기준으로 유사도를 계산합니다. 두 벡터가 동일한 방향을 가질수록 코사인 유사도는 1에 가까워지며, 반대 방향일수록 -1에 가까워집니다. 벡터 간의 각도를 측정하여 텍스트 데이터나 다른 고차원 데이터의 유사성을 평가할 때 유용합니다.

 

2. 코사인 유사도의 수식

코사인 유사도는 다음과 같이 정의됩니다:

 

3. 코사인 거리란?

코사인 거리(Cosine Distance)는 코사인 유사도(Cosine Similarity)의 보완적인 개념으로, 두 벡터 간의 유사성을 거리의 형태로 표현합니다. 코사인 유사도가 두 벡터 간의 각도를 기준으로 유사성을 측정하는 반면, 코사인 거리는 이 유사성을 거리로 변환하여 표현합니다.

 

코사인 거리는 두 벡터 간의 코사인 유사도를 기반으로 계산되며, 유사도가 1에 가까울수록 거리는 0에 가까워지고, 유사도가 0에 가까울수록 거리는 1에 가까워집니다. 코사인 거리의 수식은 다음과 같습니다:

4. 소스코드

#데이터 셋
dic = {'Tom Cruise' : [('Collateral','04'),('Last','Samurai','03'),('Minority','Report','02'),('Vanilla','Sky','02')],
       'T_Cruise' : [('Vanilla','Sky'),('The','Last','Samurai'),('Mission','Impossible'),('Minority','Report')]
       }

#코사인 유사도
class cosine_simlality:
    def __init__(self, dic):
        self.a=set()
        self.b=set()
        self.keys=[]
        self.tlist=[]
        for i in dic:
            self.keys.append(i)
            for j in dic[i]:
                for k in j:
                    if i=='Tom Cruise':
                        self.a.add(k)
                    elif i=='T_Cruise':
                        self.b.add(k)
    
    def simlality(self):
        c = self.a | self.b # 합
        v1=[]
        v2=[]
        self.tlist=list(c)
        print(self.tlist)
        for i in self.tlist:
            if i in list(self.a):
                v1.append(1)
            else:
                v1.append(0)
        for i in self.tlist:
            if i in list(self.b):
                v2.append(1)
            else:
                v2.append(0)
        print('Tom Cruise vector ', v1)
        print('T Cruise vector ', v2)
        sum = 0
        for i in range(0, len(v1)):
            sum= sum+(v1[i]*v1[i])
        n1 = sum**0.5
        sum = 0
        for i in range(0, len(v2)):
            sum= sum+(v2[i]*v2[i])
        n2 = sum**0.5
        print(n1)
        print(n2)
        
        v3 = 0
        for i in range(0, len(v1)):
            v3 = v3 + (v1[i]*v2[i])
        print('||Tom x T|| : ',v3)
        dist = v3 / (n1*n2)
        print('코사인 유사도:', dist)
        print('코사인 거리:', 1-dist)
www = cosine_simlality(dic)
www.simlality()

Comments