Skip to content

Commit 7878329

Browse files
committed
Added moments to Truncated Gaussian
1 parent 7046885 commit 7878329

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ import breeze.stats.distributions._
1010
case class TruncatedGaussian(mu: Double, sigma: Double, a: Double, b: Double)(
1111
implicit rand: RandBasis = Rand) extends
1212
AbstractContinuousDistr[Double] with
13-
HasCdf with HasInverseCdf {
13+
HasCdf with HasInverseCdf with Moments[Double, Double] {
1414

1515
require(sigma > 0.0, "Std Dev must be positive.")
1616
require(a < b, "A must be lower limit, B must be upper limit")
1717

1818
private val baseGaussian = Gaussian(mu, sigma)
1919

2020
private val z = baseGaussian.cdf(b) - baseGaussian.cdf(a)
21+
private val y = baseGaussian.pdf(b) - baseGaussian.pdf(a)
22+
23+
private val (alpha, beta) = ((a-mu)/sigma, (b-mu)/sigma)
2124

2225
override def probability(x: Double, y: Double) = ???
2326

@@ -37,4 +40,14 @@ case class TruncatedGaussian(mu: Double, sigma: Double, a: Double, b: Double)(
3740
override def draw() = {
3841
inverseCdf(rand.uniform.draw())
3942
}
43+
44+
override def mean = mu - sigma*(baseGaussian.pdf(b) - baseGaussian.pdf(a))/z
45+
46+
override def variance =
47+
sigma*sigma*(1.0 - ((beta*baseGaussian.pdf(b) - alpha*baseGaussian.pdf(a))/z) - math.pow(y/z, 2.0))
48+
49+
override def entropy =
50+
(alpha*baseGaussian.pdf(a) - beta*baseGaussian.pdf(b))/(2*z) + math.sqrt(2*math.Pi*math.exp(1.0))*sigma*z
51+
52+
override def mode = if (mu < a) a else if (mu > b) b else mu
4053
}

0 commit comments

Comments
 (0)