Skip to content

Commit e22e044

Browse files
committed
Release 1.5.2-beta.4
1 parent 8fdf41b commit e22e044

File tree

6 files changed

+66
-22
lines changed

6 files changed

+66
-22
lines changed

build.sbt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ packageSummary := "Scala Library/REPL for Machine Learning Research"
99

1010
packageDescription := "DynaML is a Scala environment for conducting research and education in Machine Learning. DynaML comes packaged with a powerful library of classes for various predictive models and a Scala REPL where one can not only build custom models but also play around with data work-flows. It can also be used as an educational/research tool for data analysis."
1111

12-
val mainVersion = "v1.5.2-beta.3"
12+
val mainVersion = "v1.5.2-beta.4"
1313

1414
val dataDirectory = settingKey[File]("The directory holding the data files for running example scripts")
1515

conf/DynaMLInit.scala

-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ import io.github.mandar2812.dynaml.wavelets._
4646
import io.github.mandar2812.dynaml.openml.OpenML
4747
//Spark support
4848
import io.github.mandar2812.dynaml.DynaMLSpark._
49-
//Tensorflow support
50-
import io.github.mandar2812.dynaml.tensorflow._
5149
//Renjin imports
5250
import javax.script._
5351
import org.renjin.script._

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/evaluation/MetricsTF.scala

+43-11
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ under the License.
1818
* */
1919
package io.github.mandar2812.dynaml.evaluation
2020

21+
import com.quantifind.charts.Highcharts.{regression, title, xAxis, yAxis}
2122
import io.github.mandar2812.dynaml.tensorflow.dtf
22-
import org.platanios.tensorflow.api.{Tensor, ::, ---}
23+
import org.platanios.tensorflow.api.{---, ::, Tensor}
2324

2425

2526
/**
@@ -29,22 +30,22 @@ import org.platanios.tensorflow.api.{Tensor, ::, ---}
2930
*
3031
* @param targets The actual output values.
3132
* */
32-
abstract class MetricsTF(names: Seq[String], preds: Tensor, targets: Tensor) {
33+
abstract class MetricsTF(val names: Seq[String], val preds: Tensor, val targets: Tensor) {
3334

3435
protected val scoresAndLabels: (Tensor, Tensor) = (preds, targets)
3536

3637
protected var name = "Target"
3738

3839
lazy val results: Tensor = run()
3940

40-
def _target_quantity = name
41+
def _target_quantity: String = name
4142

4243
def target_quantity_(n: String): Unit = {
4344
name = n
4445
}
4546

4647
def print(): Unit = {
47-
println("Model Performance: "+name)
48+
println("\nModel Performance: "+name)
4849
println("============================")
4950
println()
5051

@@ -76,24 +77,53 @@ abstract class MetricsTF(names: Seq[String], preds: Tensor, targets: Tensor) {
7677
/**
7778
* Implements a common use for Regression Task Evaluators.
7879
* */
79-
class RegressionMetricsTF(preds: Tensor, targets: Tensor, num_partitions: Int = 4)
80-
extends MetricsTF(Seq("RMSE", "MAE", "Corr"), preds, targets) {
80+
class RegressionMetricsTF(preds: Tensor, targets: Tensor)
81+
extends MetricsTF(Seq("RMSE", "MAE", "Coefficient of Corr.", "Yield"), preds, targets) {
8182

83+
private val num_outputs = if (preds.shape.toTensor().size == 1) 1 else preds.shape(1)
8284

83-
private lazy val (_ , rmse , mae, corr) = RegressionMetricsTF.calculate(preds, targets, num_partitions)
85+
private lazy val (_ , rmse , mae, corr) = RegressionMetricsTF.calculate(preds, targets)
8486

85-
override protected def run(): Tensor = dtf.stack(Seq(rmse, mae, corr))
87+
private lazy val modelyield =
88+
(preds.max(axes = 0) - preds.min(axes = 0)).divide(targets.max(axes = 0) - targets.min(axes = 0))
89+
90+
override protected def run(): Tensor = dtf.stack(Seq(rmse, mae, corr, modelyield))
91+
92+
override def generatePlots(): Unit = {
93+
println("Generating Plot of Fit for each target")
94+
95+
if(num_outputs == 1) {
96+
val (pr, tar) = (
97+
scoresAndLabels._1.entriesIterator.map(_.asInstanceOf[Double]),
98+
scoresAndLabels._2.entriesIterator.map(_.asInstanceOf[Double]))
99+
100+
regression(pr.zip(tar).toSeq)
101+
102+
title("Goodness of fit: "+name)
103+
xAxis("Predicted "+name)
104+
yAxis("Actual "+name)
105+
106+
} else {
107+
(0 until num_outputs).foreach(output => {
108+
val (pr, tar) = (
109+
scoresAndLabels._1(::, output).entriesIterator.map(_.asInstanceOf[Double]),
110+
scoresAndLabels._2(::, output).entriesIterator.map(_.asInstanceOf[Double]))
111+
112+
regression(pr.zip(tar).toSeq)
113+
})
114+
}
115+
}
86116
}
87117

88118
/**
89119
* Implements core logic of [[RegressionMetricsTF]]
90120
* */
91121
object RegressionMetricsTF {
92122

93-
protected def calculate(preds: Tensor, targets: Tensor, num_partitions: Int) = {
123+
protected def calculate(preds: Tensor, targets: Tensor): (Tensor, Tensor, Tensor, Tensor) = {
94124
val error = targets.subtract(preds)
95125

96-
println("Shape of error tensor: "+error.shape.toString())
126+
println("Shape of error tensor: "+error.shape.toString()+"\n")
97127

98128
val num_instances = error.shape(0)
99129
val rmse = error.square.mean(axes = 0).sqrt
@@ -110,7 +140,9 @@ object RegressionMetricsTF {
110140

111141
val targets_c = targets.subtract(dtf.stack(Seq.fill(num_instances)(mean_targets)))
112142

113-
preds_c.multiply(targets_c).mean(axes = 0).divide(preds_c.square.mean().sqrt).divide(targets_c.square.mean().sqrt)
143+
val (sigma_t, sigma_p) = (targets_c.square.mean().sqrt, preds_c.square.mean().sqrt)
144+
145+
preds_c.multiply(targets_c).mean(axes = 0).divide(sigma_t.multiply(sigma_p))
114146
}
115147

116148
(error, rmse, mae, corr)

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/utils/package.scala

+17
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import java.io.{BufferedWriter, File, FileWriter}
2222

2323
import breeze.linalg.{DenseMatrix, DenseVector, Matrix, MatrixNotSquareException, MatrixNotSymmetricException, kron}
2424
import com.github.tototoshi.csv.{CSVReader, DefaultCSVFormat, QUOTE_NONNUMERIC}
25+
import org.renjin.script.{RenjinScriptEngine, RenjinScriptEngineFactory}
26+
import org.renjin.sexp.SEXP
2527
//import org.apache.spark.mllib.regression.LabeledPoint
2628
//import org.apache.spark.rdd.RDD
2729

@@ -503,5 +505,20 @@ package object utils {
503505
}
504506
}
505507

508+
/**
509+
* Encapsulates renjin script engine and its capabilities.
510+
* */
511+
object Renjin {
512+
513+
private val r_engine_factory = new RenjinScriptEngineFactory()
514+
515+
val renjin: RenjinScriptEngine = r_engine_factory.getScriptEngine()
516+
517+
val r: String => SEXP = (s: String) => renjin.eval(s).asInstanceOf[SEXP]
518+
519+
val R: java.io.File => Unit = (f: java.io.File) => renjin.eval(f)
520+
}
521+
522+
506523
}
507524

project/Dependencies.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ object Dependencies {
123123
)
124124

125125
val rejinDependency = Seq(
126-
"org.renjin" % "renjin-script-engine" % "0.8.2523"
126+
"org.renjin" % "renjin-script-engine" % "0.8.2527"
127127
)
128128

129129
val rPackages = Seq(
130-
"org.renjin.cran" % "plyr" % "1.8.4-b66",
131-
"org.renjin.cran" % "abc" % "2.1-b288",
132-
"org.renjin.cran" % "ggplot2" % "2.2.1-b96"
130+
"org.renjin.cran" % "plyr" % "1.8.4-b75",
131+
"org.renjin.cran" % "abc" % "2.1-b290",
132+
"org.renjin.cran" % "ggplot2" % "2.2.1-b102"
133133
)
134134

135135
val cppCompatDependencies = Seq(

src/main/resources/DynaMLInit.scala

+1-4
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,4 @@ import io.github.mandar2812.dynaml.tensorflow._
5252
import javax.script._
5353
import org.renjin.script._
5454
import org.renjin.sexp._
55-
val r_engine_factory = new RenjinScriptEngineFactory()
56-
implicit val renjin = r_engine_factory.getScriptEngine()
57-
val r: String => SEXP = (s: String) => renjin.eval(s).asInstanceOf[SEXP]
58-
val R: java.io.File => Unit = (f: java.io.File) => renjin.eval(f)
55+
import utils.Renjin._

0 commit comments

Comments
 (0)