Scala와 Breeze로 통계적 계산을 위한 간략한 소개

Scala와 Breeze로 통계적 계산을 위한 간략한 소개

이전 게시물에서 Scala가 통계적 컴퓨팅 및 데이터 과학에 좋은 언어라고 설명드렸습니다. 본 게시물에서는 Scala 언어와 Breeze 수치 라이브러리를 통해 통계적 컴퓨팅에 미치는 영향을 미리 보여주려 합니다. 본 게시물은 Scala를 사용하기 위해 충분한 정보를 제공하지는 않지만, Scala 언어와 Breeze 라이브러리에 대한 첫인상을 제공하는 데 집중할 것입니다. 또한, Scala의 가장 멋진 언어 특징 중 일부를 소개하지 않을 것입니다. Scala의 일부 면모는 함수형 프로그래밍 초보자에게 두려움을 주기도 합니다.

예제를 재현하려면 Scala와 Breeze를 설치해야 합니다. 이 과정은 그리 어렵지 않지만, 자세한 설치 방법은 여기서 설명하지 않을 것입니다. 대신 Scala 언어와 Breeze 라이브러리에 집중하겠습니다. 최신 버전의 Java를 설치한 후 Scala를 설치하고 Breeze를 설치해야 합니다. SBT나 ScalaIDE도 설치할 수 있지만, 이는 필수적이지 않습니다. 그런 다음 Scala REPL을 Breeze 라이브러리를classpath에 포함시키고 실행해야 합니다. 여러 가지 방법이 있습니다. 가장 쉬운 방법은 scala를 실행하고 Breeze 경로를 수동으로 지정하거나 환경 변수에 설정하는 것입니다.또는 sbt 세션에서 Breeze 의존성 있는 콘솔을 실행할 수 있습니다.또는 Scala IDE의 Worksheet에서 Breeze 의존성 있는 프로젝트에서 작업할 수 있습니다.

Scala REPL 세션

Scala의 첫인상

Breeze와 무관하게 Scala의 기본적인 개념을 살펴보겠습니다. 더 많은 정보는 Scala 문서를 참조하세요.

scala> val num = 5
num: Int = 5

scala> num
res0: Int = 5

여기까지는 익숙한 내용입니다. Python이나 R의 명령형 인터프리터와 유사합니다. 첫 번째 주의할 점은 변수의 타입을 선언해야 한다는 것입니다. numval로 선언했습니다. val은 불변 값을 나타냅니다. 다시할당할 수 없습니다.

scala> num = 6
<console>:8: error: reassignment to val
       num = 6
         ^
scala> num
res1: Int = 5

불변성은 함수형 프로그래밍 초보자에게 두려움을 주기도 합니다. 그러나 Scala에서는 가변 변수도 선언할 수 있습니다.

scala> var count = 7
count: Int = 7

scala> count
res2: Int = 7

scala> count = 8
count: Int = 8

scala> count
res3: Int = 8

Scala는 함수형 프로그래밍에 이상적인 언어입니다. 기본적인 수학 연산부터:

scala> val vec = List(3,4,5,6)
vec: List[Int] = List(3, 4, 5, 6)

scala> vec(1)
res4: Int = 4

scala> vec.sum
res5: Int = 18

scala> vec.length
res6: Int = 4

scala> vec.product
res7: Int = 360

또한, 수축 작업도 지원됩니다.

scala> vec.foldLeft(0)((x,y) => x + y)
res8: Int = 18

scala> vec.foldLeft(0)(_ + _)
res9: Int = 18

Scala는 또한 멀티셋과 같은 멀티셋 연산도 지원합니다.

Breeze의 첫인상

이번에는 Breeze 라이브러리를 통해 통계적 컴퓨팅을 수행해 보겠습니다. 더 많은 정보는 Breeze의 Quickstart 가이드를 참조하세요.

가우시안 분포에서 값을 추출해 보겠습니다.

scala> import breeze.stats.distributions._
import breeze.stats.distributions._

scala> val normal = Gaussian(0.0, 1.0)
normal: breeze.stats.distributions.Gaussian = Gaussian(0.0, 1.0)

scala> normal.draw
res10: Double = 1.606121255846881

scala> normal.draw
res11: Double = -0.1747896055492152

샘플 데이터를 추출하고 통계적 요약을 수행해 보겠습니다.

scala> val samples = normal.sample(10)
samples: IndexedSeq[Double] = Vector(-1.3758577012869702, -1.2148314970824652, -0.022501190144116855, 0.3244006323566883, 0.35978577573558407, 0.9651857500320781, -0.40834034207848985, 0.11583348205331555, -0.8797699986810634, -0.33609738668214695)

scala> samples.sum / samples.length
res12: Double = -0.34064156102380994

벡터와 행렬 연산도 지원됩니다.

scala> val vec = DenseVector(samples.toArray)
vec: breeze.linalg.DenseVector[Double] = DenseVector(-1.3758577012869702, -1.2148314970824652, -0.022501190144116855, 0.3244006323566883, 0.35978577573558407, 0.9651857500320781, -0.40834034207848985, 0.11583348205331555, -0.8797699986810634, -0.33609738668214695)

scala> vec(1 to 3) := 1.0
res13: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 1.0, 1.0)

scala> val mat = new DenseMatrix(2,2,Array(1.0, 2.0, 3.0, 4.0))
mat: breeze.linalg.DenseMatrix[Double] = 
1.0  2.0  
3.0  4.0  

scala> mat * DenseVector(1.0, 1.0)
res14: breeze.linalg.DenseVector[Double] = DenseVector(4.0, 8.0)

회귀 분석 예제

마지막으로 회귀 분석 예제를 통해 Breeze의 기능을 살펴보겠습니다.

scala> val X = new DenseMatrix(1000,5,normal.sample(5000).toArray)
X: breeze.linalg.DenseMatrix[Double] = 
-0.40186606934180685  0.9847148198711287    ... (5 columns)
-0.4760404521336951   -0.833737041320742    ...
...

scala> val beta = linspace(1.0, 2.0, 5)
beta: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 1.25, 1.5, 1.75, 2.0)

scala> val y = X * beta + DenseVector(normal.sample(1000).toArray)
y: breeze.linalg.DenseVector[Double] = DenseVector(-0.572127338358624, -0.16481167194161406, ...)

scala> val estBeta = X \ y
estBeta: breeze.linalg.DenseVector[Double] = DenseVector(0.9952708232116663, 1.2344546192238952, 1.5543512339052412, 1.744091673457169, 1.9874158953720507)

이 예제에서는 Breeze를 통해 데이터를 샘플링하고 회귀 분석을 수행하는 방법을 보여주었습니다.

태그: Scala breeze statistical-computing linear-algebra regression-analysis

6월 13일 22:44에 게시됨