유클리디안 거리(Euclidean Distance) 개념과 구현해보기

    유클리디안 거리(Euclidean Distance) 혹은 유클리드 거리는 매우 심플하고, 베이직한 값들간의 거리를 구하는 알고리즘이다. 이틀 토대로 값들간의 유사도를 구할 수 있어서 유클리디안 거리로 유사도를 측정하는 방식을 유클리디안 유사도(Euclidean Similarity)라고도 하여, 같은 의미로도 인식 될 수 있다.


    유클리디안 거리는 우리가 학창 시절(필자는 중학생 시절) 배웠던 피타고라스 정리와 같은 개념이라 생각하면 된다. 피타고라스의 정리는 이미 만들어진 삼각형을 이용한 공식이라 한다면, 유클리디안 거리는 삼각형을 만들어서 계산을 한다는 개념이라 인식하면 된다.




    다만 추가적으로 차이점은 유클리디안 거리는 여러차원의 거리를 계산할 수 있다. 그래서 여러차원일 때의 공식을 보면 마치 엄청난 수학적 알고리즘을 쓰는지 착각할 수 있지만 하나씩 뜯고보면 피타고라스 정리의 연속일 뿐이다.


    우선, 누구나 알고 있고 지금도 기억할 수 있는 피타고라스 정리를 리마인드해보면 다음과 같은 공식이다.



    그리고 피타고라스 정리를 이용하면, 2값을 알았을 때 나머지 값을 유추할 수 있다.



    리마인드 되었다면, 이제 다시 유클리드 거리로 가보자



    이 삼각형은 사실 x1,y1 위치의 점과 x2,y2의 점을 놓고, X값의 차이와 Y값의 차이를 보여주는 모습이며, 이 모습이 삼각형처럼 보이는 것을 표현한 것 뿐이다. 그리고, 이 점의 최단거리 d는 피타고라스 정리에 의하면, 빗변의 모습과 유사하기 때문에 x의 크기와 y의 크기 즉, 직각 변들의 차이를 제곱하고, 더한 후 루트를 씌우면 된다.



    이와같이 우리가 알고 있는 흔한 피타고라스 정리를 사용하면 유클리드 거리를 구하는 것이다 (너무 간단한 소리를 너무 길게 쓴듯한 기분) 그리고 다차원인 상태일 때 거리를 구하는 건 아래와 같이 값만 추가하면 되는 매우 심플한 방식이다


    다차원일 경우 구하는 방식.. 값만 추가하면 된다.


    그럼 위 예제를 토대로 자바(Java) 언어로 프로그램의 예제를 만들어보겠다.



    공식으로 직접 메소드를 만들어본 방법


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public static void main(String[] args) {
        double[] a = {-1,2,3};
        double[] b = {4,0,-3};
            
    calcEuclideanDist(a,b);
    }
        
    public static void calcEuclideanDist(double[] a, double [] b) {
        double sum = 0;
        for(int i = 0; i < a.length; i++) {
            sum += Math.pow(a[i]-b[i], 2);
        }
            
        // 일단 변수차들의 제곱을 더하고
        System.out.println("Sum:" + sum);
            
        // 루트를 씌우면 유클리드 거리가 된다
        System.out.println("Euclidean Distance:" + Math.sqrt(sum));
    }
    cs


    결과는 다음과 같다.

    Sum:65.0

    Euclidean Distance:8.06225774829855


    이 방식은 메소드를 직접 공식으로 구현을 해본 것이고, 정말 간단한 방식이고 내장되어 있는 Math함수를 이용하여 구현하였다. 



    Apache Math3 라이브러리를 사용한 방식


    Apache의, Math3함수를 임포트하면 다양하고 강력한 공식, 메소드들을 사용할 수 있다. 그 중에 유클리드 거리를 구하는 메소드도 제공해준다.


    Commons Math3의 Maven

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->

    <dependency>

      <groupId>org.apache.commons</groupId>

      <artifactId>commons-math3</artifactId>

      <version>3.6.1</version>

    </dependency>


    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
        double[] a = {-1,2,3};
        double[] b = {4,0,-3};
            
        EuclideanDistance euclidean = new EuclideanDistance();
        System.out.println("Euclidean Distance :" + euclidean.compute(a, b));
    }
    cs


    EuclideanDistance라는 객체를 생성하고, compute 명령어를 써서 연산을 하면 끝이나는 매우 심플한 구조이다. 결과는


    Euclidean Distance :8.06225774829855


    다음과 같이 공식으로 만든것과 동일한 값이 나온 것을 확인할 수 있으며 프로젝트에 Math3 함수가 임포트 되어 있다면 이와같이 사용하는 것이 좋을테고, 없을 경우 굳이 임포트해서 프로그램을 무겁게 하지 말고 별도의 메소드를 만들어서 연산을 하는 것을 추천해주고 싶다.



    참고자료


    연관자료


    댓글

    Designed by JB FACTORY