|
// iterative version |
|
|
|
val x = io.Source.fromFile("/tmp/ex2x.dat").getLines.toList map { x => List(1.0, x.toDouble) } |
|
val y = io.Source.fromFile("/tmp/ex2y.dat").getLines.toList map { y => y.toDouble } |
|
|
|
def timetestIterative(x: List[List[Double]], y: List[Double], iterations: Int = 1500) = { |
|
val m = x.size |
|
val alpha = 0.07 |
|
|
|
var theta = List(0.0, 0.0) |
|
|
|
// linear regression model |
|
val h: List[Double] => Double = { x => theta(0)*x(0) + theta(1)*x(1) } |
|
|
|
// sum the difference (error) for each xy pair |
|
// using the current values of theta |
|
val delta: Int => Double = { idx => |
|
0 to m-1 map { i => |
|
val xi = x(i) |
|
val yi = y(i) |
|
(h(xi) - yi) * x(i)(idx) |
|
} reduceLeft(_+_) |
|
} |
|
|
|
for (k <- 1 to iterations) { |
|
// calculate theta values separately |
|
val theta0 = theta(0) - (alpha * 1/m * delta(0)) |
|
val theta1 = theta(1) - (alpha * 1/m * delta(1)) |
|
theta = List(theta0, theta1) |
|
} |
|
} |
|
|
|
var runtimes = 1 to 100 map { _ => |
|
val start = System.currentTimeMillis |
|
|
|
timetestIterative(x, y, 15000) |
|
|
|
val end = System.currentTimeMillis |
|
(end - start) / 1000. |
|
} |
|
|
|
// linear alegebra version |
|
|
|
val tempx = io.Source.fromFile("/tmp/ex2x.dat").getLines.toList map { x => (1.0, x.toDouble) } |
|
val tempy = io.Source.fromFile("/tmp/ex2y.dat").getLines.toList map { y => y.toDouble } |
|
|
|
def timetestLA(x: List[(Double, Double)], y: List[Double], iterations: Int = 1500) = { |
|
import scalala.tensor.dense._ |
|
|
|
val x = DenseMatrix(tempx:_*) |
|
val y = DenseVector(tempy:_*) |
|
|
|
val m = x.numRows // slight change |
|
val alpha = 0.07 |
|
|
|
var theta = DenseVector(0.0, 0.0) |
|
|
|
1 to iterations foreach { _ => |
|
val grad = x.t * ((x * theta) - y) / m |
|
theta = theta - (grad * alpha) |
|
} |
|
} |
|
|
|
|
|
var runtimes = 1 to 100 map { _ => |
|
val start = System.currentTimeMillis |
|
|
|
timetestLA(tempx, tempy, 15000) |
|
|
|
val end = System.currentTimeMillis |
|
(end - start) / 1000. |
|
} |
|
|