愛林

데이터의 유사도(Similarity) 와 비유사도(Dis-Similarity, = 거리(Distance)) 본문

Data Science/Machine Learning

데이터의 유사도(Similarity) 와 비유사도(Dis-Similarity, = 거리(Distance))

愛林 2022. 8. 6. 00:44
반응형

 

 

K-NN 이나 우리가 이 다음에 알아볼 다른 머신러닝 기법들을 배우기 이전에,

먼저 데이터의 유사도와 비유사도 그리고 이를 측정하는 척도를 알아가는 것은

중요하다.

또한 군집분석을 할 때도 사용했었던 것들이다.

 

 

먼저 알아보도록 하자.

 

 


 

데이터 유사도, 비유사도

 

 

비유사도 ( Dis - Similarity , 거리(Distance) )

 

두 개체(Object) 의 다른 정도에 대한 수치적인 척도로, 두 개체의 쌍이 더 닮을 수록 낮아진다.

Distance(거리) 는 비유사도의 동의어이다.

하한은 0, 상한은 제한이 없다.

0에 가까우면 유사한 것 (거리가 가까운 것),

1에 가까우면 유사한 것이 아닌 것 (거리가 먼  것) 이다.

 

 

 

유사도 ( Similarity )

 

두 개체(Object) 의 닮은 정도에 대한 수치적인 척도이다. 

음이 아닌 수, 0과 1 사이의 값으로 보통 표현한다.

1에 가까우면 유사, 0에 가까우면 유사하지 않다.

피어슨 상관계수와 유사하며, 값이 1이나 -1에 가까울수록 관계가 있고 유사하다는 것을 생각하면 된다.

 

유사도를 비유사도로 변환하거나 그 역으로 변환해서 근접도 척도를 [0,1] 과 같은 특정 범위로

적용하기 위해 사용하는 것을 변환 이라고 한다.

 

 

 

데이터 유사도와 비유사도의 측정 = 거리 (Distance)

 

 

개체 간의 비유사도 (거리)의 측도는 데이터와 데이터간의 유사성을 보는 군집분석 뿐만 아니라

변수와 변수 간 관계를 보는 다변량 통계 분석에서도 사용된다.

 

저번에도 보았던 맨해튼, 유클리드 거리

 

여기서 가장 많이 쓰이는 거리는 맨해튼 거리(Manhattawn Distance),

유클리드 거리 (Euclidean Distance) 이다.

 

 

맨해튼 거리는 거리를 가로블록과 세로 블록 절대합으로 계산되는 방식에서

착안한 거리척도이다.

r = 1 거리는 맨해튼거리를 말한다.

 

맨해튼 거리

 

유클리드 거리는 두 점을 잇는 가장 짧은 직선거리를 측정하는 척도이다.

r = 2 거리는 유클리드 거리를 말한다.

 

유클리드 거리

 

 

이외에도 다양한 거리 척도들이 있다.

 

 

 

 


 

실습

 

 

 

 

X = [[5,4,3],[1,7,9]]

 

X를 먼저 정의해주고 ,

 

from sklearn.neighbors import DistanceMetric

 

sklearn 의 DistanceMetric 을 불러온다.

DistanceMetric 은 안에 우리가 위에서 배웠던 거리들이 들어있는 클래스이다.

 

DistanceMetric.get_metric('거리이름') 으로 사용한다.

 


 

유클리드 거리 

dist_euclidean = DistanceMetric.get_metric('euclidean')
print(dist_euclidean.pairwise(X))

 


 

 

맨해튼 거리

 

dist_manhattan = DistanceMetric.get_metric('manhattan')
print(dist_manhattan.pairwise(X))

 


 

 

해밍 거리

 

 

한 문자열을 다른 문자열로 바꾸기 위해 몇 글자를 바꾸어야 하는 지를 정의한다.
고정 길이의 이진 데이터에서 서로 다른 비트 부호수를 갖는 문자 개수를 찾는다.

 

dist_hamming = DistanceMetric.get_metric('hamming')
print(dist_hamming.pairwise(X))

 

 X = [[5,4,3],[1,7,9]]

 

이었으므로 , 안에있는 요소들이 다 다르므로 다 바꾸어주어야 한다

그러므로 1이 나옴. (100% 다 바꿔야한다는 뜻이다.)

 

 

그렇다면 한 개만 중복되는 것이 있는 경우에는 ?

Y 를 정의해보고 , Haming 거리에 넣어보자.

 

Y = [[1,4,3],[1,7,9]]
print(dist_hamming.pairwise(Y))

 

3개 중에서 2개만 바꾸면 되니까 0.67 % 정도 바꾸면 되므로, 0.67이 나왔다.


Haming 거리는 정확하게 같은 지에 대한 여부만 고려한다.

이 여부에서 다른 값을 count 하는 것이다.

 

 


 

민코우스키거리

 

두 가지 거리 (맨해튼거리, 유클리드 거리) 를 일반화한 거리이다.
p=1 은 맨해튼거리, p=2 는 유클리드 거리이다.

 

dist_minkowski = DistanceMetric.get_metric('minkowski', p=2) # 유클리드 거리
print(dist_minkowski.pairwise(X))

p = 2 는 유클리드 거리였으므로, 위에서 유클리드 거리를 실습했던 것과

같은 수가 나왔다.

 

dist_minkowski = DistanceMetric.get_metric('minkowski', p=1) # 맨해튼 거리
print(dist_minkowski.pairwise(X))

p = 1 은 맨해튼 거리였으므로, 위에서 맨해튼 거리를 실습했던 것과

같은 수가 나왔다.

 

 

 

 

 

 

 

 

 

※ 해당 자료는 모두 공공 빅데이터 청년 인턴 교육자료들을 참고합니다.

Comments