BRIC 연재 초심자를위한생물학 + 정보학 _37_ - 다양한거리 - 고주온 (John Go, Ph.D.) 지난번에코사인유사도를확인하는데사용했던파이썬의 scipy 모듈에서거리 (distance) 의에적용할수 있는다양한함수들을보면, 다음과같다. 표 1. scipy 모듈의거리함수 모듈명 내용 ( 특기하지않는한 2 개의 1차원배열을대상으로함 ) braycurtis(u, v) 브레이-커티스거리 canberra(u, v) 캔버라거리 chebyshev(u, v) 체비쇼프 (Chebyshev) 거리 ( 체스판거리 ) cityblock(u, v) 맨해튼 (Manhattan) 거리 correlation(u, v) 연관거리 (correlation distance) cosine(u, v) 코사인거리 (cosine distance) dice(u, v) 1차원불배열 (boolean 1-D arrays)* 에대한다이스비유사도 (dice dissimilarity) euclidean(u, v) 유클리드거리 (Euclidean distance) hamming(u, v) 해밍거리 (hamming distance) jaccard(u, v) 1차원불배열에대한자카드-니덤비유사도 (Jaccard-Needham dissimilarity) kulsinski(u, v) 1차원불배열에대한쿨친스키비유사도 (Kulsinski dissimilarity) mahalanobis(u, v, VI) 마할라노비스거리 (Mahalanobis distance) matching(u, v) 1차원불배열에대한매칭비유사도 (matching dissimilarity) minkowski(u, v, p) 민코브스키거리 (Minkowski distance) rogerstanimoto(u, v) 1차원불배열에대한로저스-타니모토비유사도 (Rogers-Tanimoto dissimilarity) russellrao(u, v) 1차원불배열에대한러셀-라오비유사도 (Russell-Rao dissimilarity) seuclidean(u, v, V) 표준유클리드거리 (standardized Euclidean distance) sokalmichener(u, v) 1차원불배열에대한소칼-미쉬너비유사도 (Sokal-Michener dissimilarity) sokalsneath(u, v) 1차원불배열에대한소칼-스니스비유사도 (Sokal-Sneath dissim- 초심자를위한생물학 + 정보학 _37_ 다양한거리고주온 Page 1 / 5
ilarity) sqeuclidean(u, v) 제곱유클리드거리 (squared Euclidean distance) wminkowski(u, v, p, w) 가중민코브스키거리 (weighted Minkowski distance) yule(u, v) 1차원불배열에대한율비유사도 (Yule dissimilarity) * 0 또는 1만으로이루어진 1차원배열. 측정법 (metric) 이주어지지않을경우기본값. 파이썬의 scipy 모듈에있는거리관련함수는거리 (distance) 에상응하는개념인비유사도 ( 非類似度, dissimilarity) 에관한함수도포함하는데, 표 1에서볼수있는바와같이 scipy 모듈에서사용할수있는관련함수는 20여가지가있다. 이들거리, 비유사도등의개념은개체의분류 (classification) 또는군집화 (clustering) 등의수행에필수적으로적용되는중요한개념이다. 그런데, 여기서짚고넘어가야할중요한사항이있다. 자료또는각객체간의관계를확인하기위해서는보통거리, 유사도, 상관계수 (correlation coefficient) 등의개념을도입하여이를객관화하게되는데, 이과정에서용어나개념의혼란이있을수있다. 앞에서본코사인유사도 (cosine similarity) 와코사인거리 (cosine distance) 를예로하여 scipy 모듈의사용법과유의사항에대해알아보자. A = [1, 1, 0, 1] <-- (1) B = [2, 0, 1, 1] <-- (2) import scipy.spatial.distance <-- (3) scipy.spatial.distance.pdist((a, B), 'cosine') <-- (4) <-- (5) pdist((a, B), 'cosine') <-- (6) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'pdist' is not defined <-- (7) 지난번코사인유사도의예에서사용했던자료를재적용하고 (1, 2), scipy 모듈의거리기능을불러온다 (3). pdist() 를사용하여 (4) 코사인거리를한다 (5). 모듈을제외하고 pdist() 만실행할경우에는 (6) 정의되지않았다고오류를출력한다 (7). pdist() 는 scipy 모듈이포함한함수를실행할때 n-차원공간의객체간의짝거리 (pairwise distance) 를구하는기능으로서, 예시한바와같이 1차원배열쌍과적용하고자하는측정법을인수 (argument) 로한다. 그런데, 이런방식으로실행을하려면기능을호출할때마다매번원래의모듈명을모두입력해야하는번거로움이있다. 그래서, 반복적인을간편하게하기위해실제로실행할때에는다음과같은몇가지방법을사용하기도한다. A = [1, 1, 0, 1] B = [2, 0, 1, 1] from scipy.spatial.distance import * <-- (1) pdist((a, B), 'cosine') <-- (2) 초심자를위한생물학 + 정보학 _37_ 다양한거리고주온 Page 2 / 5
scipy.spatial.distance 모듈로부터 (from) 모든함수를불러온다음 (import *, 1), pdist() 를실행하여 코사인거리를한다 (2). 위의방법은거리모듈의전체함수를불러오는 (import *) 것이다. 또다른방법 으로는해당모듈에임의의모듈명 (dist1, 다른명칭도상관없다 ) 을지정하여다음과같이사용할수도있다. A = [1, 1, 0, 1] B = [2, 0, 1, 1] import scipy.spatial.distance as dist1 <-- (1) dist1.pdist((a, B), 'cosine') <-- (2) scipy.spatial.distance 모듈을 dist1 이라는이름으로불러온후 (1), dist1 에대한 pdist() 로코사인거리 를한다 (2). 참고로, pdist() 를사용하는방법으로는다음과같은것도있다. A = [1, 1, 0, 1] B = [2, 0, 1, 1] from scipy.spatial.distance import pdist <-- (1) pdist((a, B), 'cosine') <-- (2) scipy.spatial.distance 모듈로부터 pdist 함수를불러온다음 (1), 이를사용하여 A 와 B 의코사인거리를계 산한다 (2). 지금까지모듈의기본적인호출방법에대해약간알아보았는데, 여기서기억해두어야할내용은, 사용하고자하는함수를포함하는모듈명전체를호출하여해당함수를사용해야한다는것이다. 모듈을사용하는초기에는모듈을불러오는방법이쉽게익숙해지지않아서혼란스러울수있지만, 내친김에 pdist() 를사용하지않고직접함수를실행하는방법도알아보자. 아래예시한것들은내용이조금씩차이가나므로주의깊게보아야한다. import scipy.spatial.distance <-- (1) distance.cosine(a, B) <-- (2) scipy.spatial.distance 모듈을호출하고 (1) 코사인거리함수 (cosine(u, v)) 를실행하면 (2), 결과 가실수값 ( 부동소수점수 ) 으로출력된다 (3). from scipy.spatial import distance <-- (1) distance.cosine(a, B) <-- (2) 초심자를위한생물학 + 정보학 _37_ 다양한거리고주온 Page 3 / 5
코사인거리함수를포함하는모듈의호출방식을달리하여 (1) 코사인거리를해도 (2) 동일한결과를볼수있다 (3). import scipy.spatial.distance as dist2 <-- (1) dist2.cosine(a, B) <-- (2) 불러올모듈을임의의이름으로호출하여 (as dist2, 1) 코사인거리를하는것도가능하다 (2, 3). from scipy.spatial import distance as dist3 <-- (1) dist3.cosine(a, B) <-- (2) 모듈명칭의지정을달리하여도 (1) 동일한결과를보인다 (2, 3). 이처럼다양한방식으로모듈을불러거리을실행할수있는데, 이는파이썬모듈운영에있어서그계층적구조에대해잘이해하면쉽게응용할수있다. 또한, 모듈사용방식에대한사용자의취향도중요하므로, 가능한한많은경험을쌓으면서기존의개발자들이적용한개발표준을참조하여작업하는것이좋을것이다. 지금까지 scipy 모듈을이용한코사인거리의예를통하여사용방법에대해간략히알아보았다. 그런데, 코사인거리의결과를보면, 지난번의코사인유사도 (S c ) 결과 (0.70710678) 와이번코사인거리 (D c ) 의결과 (0.29289322) 사이에지난번에언급한것과같이 D c = 1 - S c 의관계가성립되는것을볼수있다. 이를달리말하자면, 함수나매개변수의명칭이같은 cosine이라고해도주어진기능에서의개념이무엇인지반드시확인해야한다. 유사도 (similarity), 거리 (distance), 비유사도 ( 부동성, dissimilarity), 계수 (coefficient) 등의표현도해당용어의실제개념과의미에따라서다르게사용될수있다. 파이썬의 scipy 모듈인자카드-니덤비유사도 (jaccard(u, v)) 와로저스-타니모토비유사도 (rogerstanimoto(u, v)) 는일반적으로언급되는자카드계수 (Jaccard coefficient) 나타니모토계수 (Tanimoto coefficient) 와는각각다른개념이다. 내용이다소혼란스러울수있으나, 간단히요약하자면용어및그개념에대한정의를정확하게확인하고해당기능을유의해서사용해야오류를피할수있다는것이다. 참고로, scipy.spatial.distance 모듈을사용한거리시, 적용하고자하는측정법을특정하지않으면, 다음예에서보는바와같이, 유클리드거리을기본값 (default) 으로한다. C = [0, 0] D = [1, 2] from scipy.spatial.distance import pdist <-- (1) pdist((c, D)) <-- (2) 초심자를위한생물학 + 정보학 _37_ 다양한거리고주온 Page 4 / 5
array([ 2.23606798]) <-- (3) scipy.spatial.distance 모듈로부터 pdist 를호출하여 (1), 측정법을지정하지않고 C 와 D 간의거리를 하면 (2), 기본값인유클리드거리를적용하여그결과를출력한다 (3). 보통유클리드거리는 R 패키지나 MATLAB 1 등의여러도구의다양한거리관련연산 (hierarchical clustering, K-means clustering, etc.) 에서기본측정법으로사용된다. 또한, scipy 모듈에관하여더자세하게알고싶다면 scipy.org 2 를참조해보기바란다. 거리에서짝으로구성된자료간의거리를하는 pdist() 외에도다른구조의자료에대해을수행하는기능에대해서도확인할수있다. 고주온 ( 필명 ) (http://bioprofiler.tistory.com) IBM-XT시절부터개인용컴퓨터를사용하였으나, 강산이변한지금도어제코딩한내용을오늘기억하지못하는자유인. 박사학위는분자유전학분야로받았으며, 물리학과화학에관심만있음. 현재대학교수로재직중. The views and opinions expressed by its writers do not necessarily reflect those of the Biological Research Information Center. 고주온 (2016). [ 초심자를위한생물학 + 정보학 ] _37_ 다양한거리. Available from http://www.ibric.org/myboard/read.php?board=news&id=272298 (May.20, 2016) Email: member@ibric.org 1 MathWorks 에서발매하는전산도구이다. 2 http://scipy.org 초심자를위한생물학 + 정보학 _37_ 다양한거리고주온 Page 5 / 5