본문 바로가기

spark

기계학습 - Spark(8) - PCA 코드분석2 Spark, .../mlib/feature/PCA.scala 코드를 분석한 글이다. PCA의 원리에 대해 이해를 하기 위해 소스를 분석했는데 조금은 원리를 알게 되었지만, 수학으로 인한 장벽은 여전했다. SPARK's PCA.sala1. 'pc'로 명칭된 값과 Explained Variance을 구한다.val mat = new RowMatrix(sources) val (pc, explainedVariance) = mat.computePrincipalComponentsAndExplainedVariance(k) 변수 pc : K값으로 보정된 SVD의 U행렬변수 explainedVariance : Explained Variance 2. 입력된 벡터들을 차례대로 pc에 곱한 결과를 구한다.pc.transpose.. 더보기
기계학습 - Spark(8) - PCA 코드분석1 Spark의 기계학습 교육사이트의 나머지 부분은 평이한 내용들이지만, 그중에 ngram과 PCA는 흥미로웠다. ngram은 개요만 읽어도 이해하는데 충분했다. PCA는 N차원의 벡터를 N보다 같거나 작은 차원의 벡터로 변한하는 것인데, 어떻게 구현이 되는지가 궁금했고, word2vec을 이해할 때와 만찬가지로 직접 구현 소스 코드를 분석해보기로 했다. 먼저 spark사이트에 나온 샘플예제는 최신버전에서 약간 문법오류가 있어보여 수정한 코드를 아래에 적는다.import org.apache.spark.ml.feature.PCAimport org.apache.spark.ml.linalg.Vectors val data = Array( Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),.. 더보기
기계학습 - Spark(7) - Word2Vec 코드분석 완결 지금까지 스파크 소스코드 분석을 통해 이해한 word2vec작동 원리에 대한 정리글을 올린다. word2vec은 아주 많은 양의 문장을 사용한 학습을 통해 단어들마다 고유의 벡터값을 산정하는데, 그 값에 따르면 유사한 성격의 단어들이 어느 한 지점에 몰리는 것을 볼 수 있다. 그러나 학습은 단어간의 연관성을 문장에서 서로 가까운 위치에 놓여 있는지에 따라 정해지기 때문에 한계도 있다. word2vec은 크게 두 단계로 나뉜다. 첫번째는 문장들의 단어들을 추려 빈도수에 따라 이진 트리를 구성하는 것이고, 두번째는 본격적으로 학습을 행하는 것이다. 1. 이진트리 구성 위의 그림은 이진트리를 구성할 때 사용하는 빈도수가 어떻게 적용되는지를 보여준다. 이 이진 트리는 소위 인공지능을 이용한 여러 이론에서 애용되.. 더보기
기계학습 - Spark(6) - Word2Vec, 학습하는 부분 코드 분석2 코딩 조금하는 놈이 적은 지식을 갖고 직관에 상당히 의존해서 Word2Vec 스칼라 구현코드를 분석하는 글이다. 따라서 이 글은 틀릴 수 있다. 이번회는 지난회의 다듬어지지 않은 생각이 한층 정리된 글이다. 결론에 가기전에 벡터 스칼라곱과 y'=ax + y를 처리하는 saxpy(Scalar Alpha X Plus Y)함수의 의미를 추리해 본다. 1. 스칼라곱은 아래처럼 다른 식으로 표현 가능한데. cos값의 성질에 따라 두 벡터의 내각이 90도 이내면 양수, 90도이면 0, 90~270이내면 음수, 270도이면 0 ... 등이 된다. 따라서 이 값은 정반대의 벡터의 곱부터 직교하는 벡터의 곱을 거쳐 같은 방향의 벡터 곱까지이다. 2. saxpy함수는 알파값과 매개변수로 2개의 배열을 받는데 앞의 배열 값.. 더보기
기계학습 - Spark(4) - Word2Vec Word2Vec에 대한 기술자료들을 찾아봤는데, 소개중심 또는 추상적인 이론중심으로 설명을 한데다 설명 또한 자세하지 않아 개발자 입장에서 이해하기 힘들다. 그래서 Spark 소스를 직접 분석해보기로 했다. 우선 .fit함수부터 시작했다.scala> val w2v = new Word2Vec().setInputCol("text").setOutputCol("result").setVectorSize(3).setMinCount(0)w2v: org.apache.spark.ml.feature.Word2Vec = w2v_d6ac8192b87f scala> val model = w2v.fit(df) Word2Vec객체는 내려받은 소스 폴더에서 찾아보니. "/spark/mllib/src/main/scala/org/apa.. 더보기
기계학습 - Spark(3) - Word2Vec, CountVectorizer Spark 교재중 Word2Vec, CountVectorizer 설명 페이지에는 샘플코드중 스칼라로 코딩된 부분을 이해한다. [링크] Word2Vec 샘플 스칼라 코드에서 .map(Tuple1.apply) 이 부분을 이해해보자. 여기서 map함수는 키-값의 맵을 구성하는 것이 아니라 맵리듀스의 맵으로 이해하면 된다. Seq 문으로 구성한 목록의 모든 구성요소에 대해 Tuple1.apply를 적용한다. 여기서 apply 호출을 눈여겨 보자. 'apply'는 스칼라 개발언어에서 아주 중요한 개념중의 하나이다. Tuple1객체는 생성자를 통해 인스턴스로 생성될 때, 생성자 매개변수로 하나의 데이터를 받아 그 데이터 하나로 구성된 tuple이 된다. 아래는 간단한 예다. scala> val t1 = new Tu.. 더보기
기계학습 - Spark(2) - TF-IDF 샘플코드 이해 Spark 교재중 TF-IDF 설명 페이지에는 샘플코드가 있다. 스칼라로 코딩된 것을 이해해보고자 한다. [링크] val sentenceData = spark.createDataFrame(... 이 것은 DataFrame 을 생성하는 코드인데, API 레퍼런스에서 찾는데 애를 먹었다. 먼저 spark 생뚱맞다. 대체 이 변수 아니면 오브젝트의 인스턴스는 어디서 나온거지? 한참을 찾아보니, 이 인스턴스는 SparkSession객체의 것인데, spark-shell을 구동할 때 시작시 출력을 보면 내부적으로 선언했다고 알려준다. Spark context available as 'sc' (master = local[*], app id = local-1493634526691).Spark session availa.. 더보기
기계학습 - Spark(1) - 시작하면서 바로 TF-IDF 공부 R등을 이용해서 데이터분석등을 공부했지만 여전히 어렵다. 안개속에서 헤매는건 여전하다. 그래도 다시 또 기계학습에 대해 체계적으로 공부해보려 한다. 우선 아파치 Spark를 사용하려 한다. 게다가 Spark사이트에는 좋은 교재가 있다. [Link] Spark의 설치등은 생략한다. 프로그래밍 언어는 스칼라로 정했다. 스칼라 공부도 겸사겸사. 교재의 첫 단원은 Pipelines는 건너뛰고. 두번째 단원 "Extracting, transforming and selecting features" "추출, 변환 그리고 특징 선택"으로 해석해 본다. 추출에는, 데이터를 수집하는 의미, 그리고 어느정도는 거르고(필터링), 정형화하는 기능이 포함될 듯 하다. 그 이유는 저장을 해야하기 때문으로 생각한다. (방대한 데이터.. 더보기