Skip to content

Commit e9042f7

Browse files
committed
Changes to Prob GP committee
- Improvements to GPC logging - Changes to GP pipe API - Bug fix to GP STP setState for Decomposable Kernels
1 parent 37012bc commit e9042f7

File tree

6 files changed

+78
-13
lines changed

6 files changed

+78
-13
lines changed

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import breeze.numerics.sqrt
2525
import io.github.mandar2812.dynaml.evaluation.RegressionMetrics
2626
import io.github.mandar2812.dynaml.models.ParameterizedLearner
2727
import io.github.mandar2812.dynaml.models.gp.AbstractGPRegressionModel
28-
import io.github.mandar2812.dynaml.optimization.{CoupledSimulatedAnnealing, GloballyOptWithGrad, GradBasedGlobalOptimizer, GridSearch}
28+
import io.github.mandar2812.dynaml.optimization._
2929
import io.github.mandar2812.dynaml.pipes._
3030
import io.github.mandar2812.dynaml.utils.{GaussianScaler, MVGaussianScaler, MinMaxScaler}
3131
import io.github.mandar2812.dynaml.wavelets.{GroupedHaarWaveletFilter, HaarWaveletFilter, InvGroupedHaarWaveletFilter, InverseHaarWaveletFilter}
@@ -667,6 +667,43 @@ object DynaMLPipe {
667667
"maxIterations" -> grid.toString))
668668
})
669669

670+
def gpTuning[T, I:ClassTag](
671+
startingState: Map[String, Double],
672+
globalOpt: String = "GS",
673+
grid: Int = 3, step: Double = 0.02,
674+
maxIt: Int = 20, policy: String = "GS") =
675+
DataPipe((model: AbstractGPRegressionModel[T, I]) => {
676+
val gs = globalOpt match {
677+
case "GS" => new GridSearch(model)
678+
.setGridSize(grid)
679+
.setStepSize(step)
680+
.setLogScale(false)
681+
682+
case "ML" => new GradBasedGlobalOptimizer(model)
683+
684+
case "CSA" => new CoupledSimulatedAnnealing(model)
685+
.setGridSize(grid)
686+
.setStepSize(step)
687+
.setLogScale(false)
688+
.setMaxIterations(maxIt)
689+
.setVariant(CoupledSimulatedAnnealing.MwVC)
690+
691+
case "GPC" => new ProbGPCommMachine(model)
692+
.setPolicy(policy)
693+
.setGridSize(grid)
694+
.setStepSize(step)
695+
.setMaxIterations(maxIt)
696+
}
697+
698+
gs.optimize(
699+
startingState,
700+
Map(
701+
"tolerance" -> "0.0001",
702+
"step" -> step.toString,
703+
"maxIterations" -> grid.toString,
704+
"persist" -> "true"))
705+
})
706+
670707

671708
def GPRegressionTest[T <: AbstractGPRegressionModel[
672709
Seq[(DenseVector[Double], Double)],

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/models/GPRegressionPipe.scala

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ under the License.
1818
* */
1919
package io.github.mandar2812.dynaml.models
2020

21+
import io.github.mandar2812.dynaml.DynaMLPipe
2122
import io.github.mandar2812.dynaml.kernels.LocalScalarKernel
2223
import io.github.mandar2812.dynaml.models.gp.AbstractGPRegressionModel
2324
import io.github.mandar2812.dynaml.pipes.DataPipe
@@ -27,20 +28,31 @@ import scala.reflect.ClassTag
2728
/**
2829
* Created by mandar on 15/6/16.
2930
*/
30-
class GPRegressionPipe[
31-
M <: AbstractGPRegressionModel[Seq[(IndexSet, Double)], IndexSet],
32-
Source, IndexSet: ClassTag](
31+
class GPRegressionPipe[Source, IndexSet: ClassTag](
3332
pre: (Source) => Seq[(IndexSet, Double)],
3433
cov: LocalScalarKernel[IndexSet],
3534
n: LocalScalarKernel[IndexSet],
3635
order: Int = 0, ex: Int = 0,
3736
meanFunc: DataPipe[IndexSet, Double] = DataPipe((_: IndexSet) => 0.0))
38-
extends ModelPipe[Source, Seq[(IndexSet, Double)], IndexSet, Double, M] {
37+
extends ModelPipe[
38+
Source, Seq[(IndexSet, Double)], IndexSet, Double,
39+
AbstractGPRegressionModel[Seq[(IndexSet, Double)], IndexSet]] {
3940

4041
override val preProcess: (Source) => Seq[(IndexSet, Double)] = pre
4142

42-
implicit val transform = DataPipe(preProcess)
43+
implicit val transform = DynaMLPipe.identityPipe[Seq[(IndexSet, Double)]]
4344

44-
override def run(data: Source): M = AbstractGPRegressionModel(cov, n, meanFunc)(data, 0).asInstanceOf[M]
45+
override def run(data: Source): AbstractGPRegressionModel[Seq[(IndexSet, Double)], IndexSet] =
46+
AbstractGPRegressionModel(cov, n, meanFunc)(preProcess(data), 0)
4547

4648
}
49+
50+
51+
object GPRegressionPipe {
52+
def apply[Source, IndexSet: ClassTag](
53+
pre: (Source) => Seq[(IndexSet, Double)],
54+
cov: LocalScalarKernel[IndexSet], n: LocalScalarKernel[IndexSet],
55+
order: Int = 0, ex: Int = 0,
56+
meanFunc: DataPipe[IndexSet, Double] = DataPipe((_: IndexSet) => 0.0)) =
57+
new GPRegressionPipe[Source, IndexSet](pre, cov, n, order, ex, meanFunc)
58+
}

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/models/gp/AbstractGPRegressionModel.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,14 @@ abstract class AbstractGPRegressionModel[T, I: ClassTag](
9292
* kernels.
9393
* */
9494
def setState(s: Map[String, Double]): this.type = {
95-
covariance.setHyperParameters(s)
96-
noiseModel.setHyperParameters(s)
95+
96+
val (covHyp, noiseHyp) = (
97+
s.filterKeys(covariance.hyper_parameters.contains),
98+
s.filterKeys(noiseModel.hyper_parameters.contains)
99+
)
100+
101+
covariance.setHyperParameters(covHyp)
102+
noiseModel.setHyperParameters(noiseHyp)
97103
current_state = covariance.state ++ noiseModel.state
98104
this
99105
}

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/models/gp/GPCommitteeRegression.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import scala.reflect.ClassTag
2828
*/
2929
abstract class GPCommitteeRegression[D, I: ClassTag](
3030
num: Int, data: D,
31-
networks: GPRegressionPipe[AbstractGPRegressionModel[Seq[(I, Double)], I], D, I]*) extends
31+
networks: GPRegressionPipe[D, I]*) extends
3232
LinearModel[D, DenseVector[Double], I, Double, D] {
3333

3434
override protected val g: D = data

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/models/stp/AbstractSTPRegressionModel.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,15 @@ abstract class AbstractSTPRegressionModel[T, I](
8989
* kernels.
9090
* */
9191
def setState(s: Map[String, Double]): this.type = {
92-
covariance.setHyperParameters(s)
93-
noiseModel.setHyperParameters(s)
92+
93+
val (covHyp, noiseHyp) = (
94+
s.filterKeys(covariance.hyper_parameters.contains),
95+
s.filterKeys(noiseModel.hyper_parameters.contains)
96+
)
97+
98+
covariance.setHyperParameters(covHyp)
99+
noiseModel.setHyperParameters(noiseHyp)
100+
94101
current_state = covariance.state ++ noiseModel.state
95102
current_state += ("degrees_of_freedom" -> (s("degrees_of_freedom")+2.0))
96103
this

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/optimization/CoupledSimulatedAnnealing.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,11 @@ class ProbGPCommMachine[T, I: ClassTag](
344344

345345
logger.info("===============================================")
346346

347-
if(options.contains("persist") && (options("persist") == "true" || options("persist") == "1"))
347+
if(options.contains("persist") && (options("persist") == "true" || options("persist") == "1")) {
348+
logger.info("Persisting model state")
348349
committeeGP.persist(committeeGP._current_state)
350+
}
351+
349352

350353
//Return the resultant model
351354
(committeeGP, committeeGP._current_state)

0 commit comments

Comments
 (0)