Skip to content

Commit 140ca49

Browse files
committed
Added Trend Parameter encoding in GP Priors
1 parent c7a8c92 commit 140ca49

File tree

8 files changed

+39
-20
lines changed

8 files changed

+39
-20
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ packageDescription := "DynaML is a scala library/repl for implementing and worki
1212
"which can be extended easily to implement advanced models for small and large scale applications.\n\n"+
1313
"But the library can also be used as an educational/research tool for data analysis."
1414

15-
val mainVersion = "v1.4.3-beta.1"
15+
val mainVersion = "v1.4.3-beta.2"
1616

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

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import io.github.mandar2812.dynaml.modelpipe.GPRegressionPipe2
2828
import io.github.mandar2812.dynaml.models.gp.AbstractGPRegressionModel
2929

3030
import scala.reflect.ClassTag
31-
import io.github.mandar2812.dynaml.pipes.{DataPipe, MetaPipe, ParallelPipe}
31+
import io.github.mandar2812.dynaml.pipes.{DataPipe, Encoder, MetaPipe, ParallelPipe}
3232
import io.github.mandar2812.dynaml.probability.{MatrixNormalRV, MultGaussianPRV}
3333

3434
/**
@@ -46,7 +46,8 @@ import io.github.mandar2812.dynaml.probability.{MatrixNormalRV, MultGaussianPRV}
4646
* */
4747
abstract class GaussianProcessPrior[I: ClassTag, MeanFuncParams](
4848
val covariance: LocalScalarKernel[I],
49-
val noiseCovariance: LocalScalarKernel[I]) extends
49+
val noiseCovariance: LocalScalarKernel[I],
50+
val trendParamsEncoder: Encoder[MeanFuncParams, Map[String, Double]]) extends
5051
StochasticProcessPrior[
5152
I, Double, PartitionedVector,
5253
MultGaussianPRV, MultGaussianPRV,
@@ -138,6 +139,7 @@ abstract class GaussianProcessPrior[I: ClassTag, MeanFuncParams](
138139
ScaledKernel[I](self.covariance, scalingFunc),
139140
ScaledKernel[I](self.noiseCovariance, scalingFunc),
140141
MetaPipe((p: MeanFuncParams) => (x: I) => self.meanFunctionPipe(p)(x)*scalingFunc(x)),
142+
self.trendParamsEncoder,
141143
self._meanFuncParams)
142144

143145
}
@@ -151,8 +153,9 @@ object GaussianProcessPrior {
151153
covariance: LocalScalarKernel[I],
152154
noiseCovariance: LocalScalarKernel[I],
153155
meanFPipe: MetaPipe[MeanFuncParams, I, Double],
156+
trendParamsEncoder: Encoder[MeanFuncParams, Map[String, Double]],
154157
initialParams: MeanFuncParams): GaussianProcessPrior[I, MeanFuncParams] =
155-
new GaussianProcessPrior[I, MeanFuncParams](covariance, noiseCovariance) {
158+
new GaussianProcessPrior[I, MeanFuncParams](covariance, noiseCovariance, trendParamsEncoder) {
156159

157160
private var params = initialParams
158161

@@ -173,9 +176,10 @@ object GaussianProcessPrior {
173176
* */
174177
class LinearTrendGaussianPrior[I: ClassTag](
175178
cov: LocalScalarKernel[I], n: LocalScalarKernel[I],
179+
trendParamsEncoder: Encoder[(I, Double), Map[String, Double]],
176180
trendParams: I, intercept: Double)(
177181
implicit inner: InnerProductSpace[I, Double]) extends
178-
GaussianProcessPrior[I, (I, Double)](cov, n) with
182+
GaussianProcessPrior[I, (I, Double)](cov, n, trendParamsEncoder) with
179183
LinearTrendStochasticPrior[I, MultGaussianPRV, MultGaussianPRV, AbstractGPRegressionModel[Seq[(I, Double)], I]]{
180184

181185
override val innerProduct = inner
@@ -210,8 +214,12 @@ class LinearTrendGaussianPrior[I: ClassTag](
210214
* */
211215
abstract class CoRegGPPrior[I: ClassTag, J: ClassTag, MeanFuncParams](
212216
covarianceI: LocalScalarKernel[I], covarianceJ: LocalScalarKernel[J],
213-
noiseCovarianceI: LocalScalarKernel[I], noiseCovarianceJ: LocalScalarKernel[J]) extends
214-
GaussianProcessPrior[(I,J), MeanFuncParams](covarianceI:*covarianceJ, noiseCovarianceI:*noiseCovarianceJ) {
217+
noiseCovarianceI: LocalScalarKernel[I], noiseCovarianceJ: LocalScalarKernel[J],
218+
trendParamsEncoder: Encoder[MeanFuncParams, Map[String, Double]]) extends
219+
GaussianProcessPrior[(I,J), MeanFuncParams](
220+
covarianceI:*covarianceJ,
221+
noiseCovarianceI:*noiseCovarianceJ,
222+
trendParamsEncoder) {
215223

216224
self =>
217225

@@ -243,6 +251,7 @@ abstract class CoRegGPPrior[I: ClassTag, J: ClassTag, MeanFuncParams](
243251
MetaPipe((p: MeanFuncParams) => (x: (I, J)) => {
244252
self.meanFunctionPipe(p)(x)*scalingFunc._1(x._1)*scalingFunc._2(x._2)
245253
}),
254+
self.trendParamsEncoder,
246255
self._meanFuncParams
247256
)
248257
}
@@ -268,8 +277,12 @@ object CoRegGPPrior {
268277
covarianceI: LocalScalarKernel[I], covarianceJ: LocalScalarKernel[J],
269278
noiseCovarianceI: LocalScalarKernel[I], noiseCovarianceJ: LocalScalarKernel[J])(
270279
meanFPipe: MetaPipe[MeanFuncParams, (I, J), Double],
280+
trendParamsEncoder: Encoder[MeanFuncParams, Map[String, Double]],
271281
initialParams: MeanFuncParams) =
272-
new CoRegGPPrior[I, J, MeanFuncParams](covarianceI, covarianceJ, noiseCovarianceI, noiseCovarianceJ) {
282+
new CoRegGPPrior[I, J, MeanFuncParams](
283+
covarianceI, covarianceJ,
284+
noiseCovarianceI, noiseCovarianceJ,
285+
trendParamsEncoder) {
273286

274287
private var params = initialParams
275288

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ import spire.algebra.InnerProductSpace
2727

2828

2929
/**
30-
* @author mandar2812 date: 16/02/2017.
31-
*
3230
* Represents a stochastic process with a
3331
* defined prior distribution.
34-
*/
32+
*
33+
* @author mandar2812 date: 16/02/2017.
34+
*
35+
* */
3536
trait StochasticProcessPrior[I, Y, Y1,
3637
D <: RandomVarWithDistr[Y1, _], W,
37-
StochasticModel <: StochasticProcessModel[Seq[(I, Y)], I, Y, W]] {
38+
StochasticModel <: StochasticProcessModel[Seq[(I, Y)], I, Y, W]] extends Serializable {
3839

3940
protected var hyperPrior: Map[String, ContinuousDistrRV[Double]] = Map()
4041

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import io.github.mandar2812.dynaml.utils._
3737
* the random variable is defined;
3838
* i.e. the range of values it can take
3939
*/
40-
abstract class RandomVariable[Domain] {
40+
abstract class RandomVariable[Domain] extends Serializable {
4141

4242
self =>
4343
/**
@@ -91,7 +91,7 @@ abstract class RandomVariable[Domain] {
9191
* underlying probability density function.
9292
*
9393
* */
94-
trait HasDistribution[Domain] {
94+
trait HasDistribution[Domain] extends Serializable {
9595

9696
/**
9797
* The actual probability density

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ JointDist <: Density[(ConditioningSet, Domain)] with Rand[(ConditioningSet, Doma
3636

3737
override val sample = prior.sample >
3838
DataPipe[ConditioningSet, ConditioningSet, Domain](
39-
(c: ConditioningSet) => (c, likelihood(c).sample())
39+
(c: ConditioningSet) => (c, likelihood(c).draw)
4040
)
4141

4242
override val posterior: DataPipe[Domain, RandomVariable[ConditioningSet]] =

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/probability/distributions/GenericDistribution.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import breeze.stats.distributions.{ContinuousDistr, Density, DiscreteDistr, Rand
55
/**
66
* @author mandar2812 date 06/01/2017.
77
* */
8-
abstract class GenericDistribution[T] extends Density[T] with Rand[T]
8+
abstract class GenericDistribution[T] extends Density[T] with Rand[T] with Serializable
99

1010
abstract class AbstractDiscreteDistr[T] extends GenericDistribution[T] with DiscreteDistr[T]
1111

@@ -15,7 +15,7 @@ abstract class AbstractContinuousDistr[T] extends GenericDistribution[T] with Co
1515
* Distributions which can generate confidence intervals around their mean
1616
* can extend this trait and override the `confidenceInterval` method .
1717
* */
18-
trait HasErrorBars[T] {
18+
trait HasErrorBars[T] extends Serializable {
1919

2020
def confidenceInterval(s: Double): (T, T)
2121
}

scripts/probModels.sc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ val abcPosterior = abcModel.posterior(data)
4545

4646
val posterior: RandomVariable[(Double, Double)] = gModel.posterior(data)
4747

48-
val samples = (1 to 3000).map(_ => {posterior.sample()})
48+
val samples = (1 to 3000).map(_ => posterior.draw)
4949

5050
histogram(data)
5151
title("Histogram of data")
@@ -73,7 +73,7 @@ c_model.tolerance_(0.05)
7373

7474
val post = c_model.posterior(350)
7575

76-
val postSamples = (1 to 2000).map(_ => post.sample())
76+
val postSamples = (1 to 2000).map(_ => post.draw)
7777

7878
histogram((1 to 2000).map(_ => p.sample()))
7979
hold()

scripts/stochasticPriors.sc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ val encoder = Encoder(
1313
(conf: Map[String, Double]) => (conf("c"), conf("s")),
1414
(cs: (Double, Double)) => Map("c" -> cs._1, "s" -> cs._2))
1515

16+
val trendEncoder = Encoder(
17+
(cs: (Double, Double)) => Map("slope" -> cs._1, "intercept" -> cs._2),
18+
(conf: Map[String, Double]) => (conf("slope"), conf("intercept"))
19+
)
20+
1621
val hyp_prior: Map[String, ContinuousDistrRV[Double]] = Map(
1722
"c" -> GaussianRV(2.5, 1.5),
1823
"s" -> RandomVariable(Gamma(2.0, 2.0)),
@@ -23,7 +28,7 @@ val sgp_hyp_prior = hyp_prior ++ Map("cutoff" -> GaussianRV(0.0, 1.0), "skewness
2328
val gsmKernel = GaussianSpectralKernel[Double](3.5, 2.0, encoder)
2429
val n = new MAKernel(0.8)
2530

26-
val gp_prior = new LinearTrendGaussianPrior[Double](gsmKernel, n, 0.0, 0.0)
31+
val gp_prior = new LinearTrendGaussianPrior[Double](gsmKernel, n, trendEncoder, 0.0, 0.0)
2732
//gp_prior.hyperPrior_(hyp_prior)
2833

2934
val sgp_prior = new LinearTrendESGPrior[Double](gsmKernel, n, 0.75, 0.1, 0.0, 0.0)

0 commit comments

Comments
 (0)