【Apache Spark에서 기계 학습】SparseVector(희소 벡터)와 DenseVector(밀밀 벡터)

개요


  • Apache Spark의 SparseVector (희소 벡터)와 DenseVector (밀도 벡터)에 대한 구성

  • 환경


  • Apache Spark 2.4.3
  • 기계 학습 패키지 spark.ml

  • SparseVector(희소 벡터)란?



    Sparse(스퍼스)란 「스카스카 하고 있다」라는 의미.

    한 벡터의 요소에 0이 많이 포함된 경우
    예를 들면
    [0.1,0.0,0.0,0.0,0.3]
    라는 벡터가 있었을 때,

    이 벡터를 표현하려면

    "첫 번째 요소의 값이 0.1이고 마지막 요소의 값이 0.3이고 요소 수가 5입니다."

    라는 정보만으로 충분하네, 라는 생각에 근거한다. (그 외의 요소의 값은 0.0으로 한다)

    이렇게 해서 정보량을 억제할 수 있으므로 메모리도 절약할 수 있다는 것이 이익.

    희소 벡터는 대부분의 기계 학습 라이브러리에서 구현됩니다.

    Spark에서 SparceVector



    글쎄, Spark에서 희소 벡터를 만드는 방법은 간단합니다.

    spark.ml 패키지의 org.apache.spark.ml.linalg.SparseVector를 사용한다.

    SparseVector 클래스는 인덱스의 배열(indices)과 값의 배열(values)을 지정해 초기화한다
    [0.1,0.0,0.0,0.0,0.3] 를 만들고 싶을 때는 인덱스의 배열(indices) new int[] { 0, 2 } 와 값의 배열(values) new double[] { 0.1, 0.5 }


    SparseVector
    // SparseVector(疎ベクトル)
    int size = 3;//ベクトルの要素サイズ
    int[] indices = new int[] { 0, 4 };
    double[] svalues = new double[] { 0.1, 0.5 };
    Vector svec = new SparseVector(size, indices, svalues);
    System.out.println("SparseVector=" + Arrays.toString(svec.toArray()));
    

    실행 결과
    SparseVector=[0.1, 0.0, 0.0, 0.0, 0.5]
    
    Vector#toArray 로 배열할 수 있지만, 필요하지 않은 경우는 물론 소비되는 메모리는 indices(첨자의 배열)와 values(값의 배열)만 보관 유지되므로 메모리가 절약된다.

    DenseVector(밀밀 벡터)란?



    희소 벡터와 쌍을 이룹니다. 일반적인 배열과 마찬가지로 벡터 요소의 모든 값을 유지합니다.
    [0.1,0.0,0.0,0.0,0.3]

    Spark에서 DenseVector



    DenseVecotr은 값의 배열 (values)을 지정하여 초기화합니다.
    [0.1,0.0,0.0,0.0,0.3] 를 만들고 싶을 때는, 그 요소수의 배열 new double[] { 0.1, 0.0, 0.0, 0.0, 0.5 } 를 건네주어 만드는 것이 DenseVector(밀밀 벡터)



    DenseVector
    // DenseVector(密ベクトル)
    double[] dvalues = new double[] { 0.1, 0.0, 0.0, 0.0, 0.5 };
    Vector dvec = new DenseVector(dvalues);
    System.out.println("DenseVector=" + Arrays.toString(dvec.toArray()));
    

    실행 결과
    DenseVector=[0.1, 0.0, 0.0, 0.0, 0.5]
    

    풀 소스 코드 (Java)



    Apache Spark를 Java에서 사용

    SparkVectorExamples.java
    package org.riversun.spark;
    
    import java.util.Arrays;
    
    import org.apache.spark.ml.linalg.DenseVector;
    import org.apache.spark.ml.linalg.SparseVector;
    import org.apache.spark.ml.linalg.Vector;
    
    public class SparkVectorExamples {
    
        public static void main(String[] args) {
    
            // DenseVector(密ベクトル)
            double[] dvalues = new double[] { 0.1, 0.0, 0.0, 0.0, 0.5 };
            Vector dvec = new DenseVector(dvalues);
            System.out.println("DenseVector=" + Arrays.toString(dvec.toArray()));
    
            // SparseVector(疎ベクトル)
            int size = 5;// ベクトルの要素サイズ
            int[] indices = new int[] { 0, 4 };
            double[] svalues = new double[] { 0.1, 0.5 };
            Vector svec = new SparseVector(size, indices, svalues);
            System.out.println("SparseVector=" + Arrays.toString(svec.toArray()));
        }
    }
    

    실행 결과
    DenseVector=[0.1, 0.0, 0.0, 0.0, 0.5]
    SparseVector=[0.1, 0.0, 0.0, 0.0, 0.5]
    

    좋은 웹페이지 즐겨찾기