Example #1
0
 def test_getSample_getMean(self):
     """Test InverseWishart.getSample and InverseWishart.getMean"""
     d, Scale, DoF, N = self.dimension, self.Scale, self.DoF, int(1E+4)
     Identity = ot.CovarianceMatrix(d)
     Scale_wishart = ot.CovarianceMatrix(Scale.solveLinearSystem(Identity))
     inverse_wishart = ot.InverseWishart(Scale, DoF)
     sample_inverse = ot.Sample(N, (d * (d + 1)) // 2)
     sample = ot.Sample(N, (d * (d + 1)) // 2)
     for i in range(N):
         M_inverse = inverse_wishart.getRealizationAsMatrix()
         M = M_inverse.solveLinearSystem(Identity)
         indice = 0
         for j in range(d):
             for k in range(j + 1):
                 sample_inverse[i, indice] = M_inverse[k, j]
                 sample[i, indice] = M[k, j]
                 indice += 1
     mean_inverse = sample_inverse.computeMean()
     mean = sample.computeMean()
     theoretical_mean_inverse = inverse_wishart.getMean()
     theoretical_mean = (ot.Wishart(Scale_wishart, DoF)).getMean()
     indice, coefficient = 0, 1. / (DoF - d - 1)
     for j in range(d):
         for k in range(j + 1):
             assert_almost_equal(theoretical_mean_inverse[indice],
                                 coefficient * Scale[k, j])
             assert_almost_equal(theoretical_mean[indice],
                                 DoF * Scale_wishart[k, j])
             assert_almost_equal(mean_inverse[indice],
                                 coefficient * Scale[k, j], 0.15, 1.E-3)
             assert_almost_equal(mean[indice],
                                 DoF * Scale_wishart[k, j], 0.15, 1.E-3)
             indice += 1
Example #2
0
 def test_computeLogPDF(self):
     """Test InverseWishart.computeLogPDF"""
     dimension, DoF = self.dimension, self.DoF
     Scale, determinant = self.Scale, self.determinant
     inverse_wishart = ot.InverseWishart(Scale, DoF)
     logPDFatX = - self.logmultigamma(dimension, 0.5 * DoF) \
         - 0.5 * (DoF * dimension * log(2.) + dimension
                  + (dimension + 1) * log(determinant))
     assert_almost_equal(inverse_wishart.computeLogPDF(Scale), logPDFatX)
Example #3
0
 def test_computeLogPDF_diagonal_case(self):
     """Test InverseWishart.computeLogPDF in the case of diagonal matrices"""
     dimension, DoF = self.dimension, self.DoF
     k = 0.5 * (DoF + dimension - 1)
     diagX = ot.Uniform(0.5, 1.).getSample(dimension)
     Scale = ot.CovarianceMatrix(dimension)
     X = ot.CovarianceMatrix(dimension)
     for d in range(dimension):
         Scale[d, d], X[d, d] = self.Scale[d, d], diagX[d, 0]
     inverse_wishart = ot.InverseWishart(Scale, DoF)
     logdensity = inverse_wishart.computeLogPDF(X)
     logratio = - self.logmultigamma(dimension, 0.5 * DoF) \
         + dimension * ot.SpecFunc_LnGamma(0.5 * (DoF + dimension - 1))
     for d in range(dimension):
         inverse_gamma = ot.InverseGamma(k, 2. / Scale[d, d])
         logdensity = logdensity - inverse_gamma.computeLogPDF(diagX[d, 0])
         logratio = logratio + 0.5 * \
             (1 - dimension) * log(0.5 * Scale[d, d])
     assert_almost_equal(logdensity, logratio)
Example #4
0
 def setUpClass(cls):
     # attributes to compare a one-dimensional InverseWishart to the
     # equivalent InverseGamma distribution
     U = ot.Uniform(0., 1.)
     scale = 10. * U.getRealization()[0]
     DoF = 3. + U.getRealization()[0]  # Degrees of Freedom
     cls.k, cls.beta = 0.5 * DoF, 0.5 * scale
     cls.one_dimensional_inverse_wishart \
         = ot.InverseWishart(ot.CovarianceMatrix([[scale]]), DoF)
     cls.inverse_gamma = ot.InverseGamma(cls.k, 1. / cls.beta)
     # attributes to test a multi-dimensional InverseWishart
     cls.dimension = 5
     cls.DoF = cls.dimension + 3 + U.getRealization()[0]
     cls.L = ot.TriangularMatrix(cls.dimension)
     diagL = ot.Uniform(0.5, 1.).getSample(cls.dimension)
     cls.determinant = 1.
     for i in range(cls.dimension):
         cls.determinant *= diagL[i, 0]
         cls.L[i, i] = diagL[i, 0]
         for j in range(i):
             cls.L[i, j] = U.getRealization()[0]
     cls.determinant *= cls.determinant
     cls.Scale = ot.CovarianceMatrix(cls.L * cls.L.transpose())
Example #5
0
import openturns as ot
from matplotlib import pyplot as plt
from openturns.viewer import View
if (ot.InverseWishart().__class__.__name__ == 'ComposedDistribution'):
    correlation = ot.CorrelationMatrix(2)
    correlation[1, 0] = 0.25
    aCopula = ot.NormalCopula(correlation)
    marginals = [ot.Normal(1.0, 2.0), ot.Normal(2.0, 3.0)]
    distribution = ot.ComposedDistribution(marginals, aCopula)
elif (ot.InverseWishart().__class__.__name__ == 'CumulativeDistributionNetwork'
      ):
    distribution = ot.CumulativeDistributionNetwork(
        [ot.Normal(2), ot.Dirichlet([0.5, 1.0, 1.5])],
        ot.BipartiteGraph([[0, 1], [0, 1]]))
else:
    distribution = ot.InverseWishart()
dimension = distribution.getDimension()
if dimension <= 2:
    if distribution.getDimension() == 1:
        distribution.setDescription(['$x$'])
        pdf_graph = distribution.drawPDF()
        cdf_graph = distribution.drawCDF()
        fig = plt.figure(figsize=(10, 4))
        plt.suptitle(str(distribution))
        pdf_axis = fig.add_subplot(121)
        cdf_axis = fig.add_subplot(122)
        View(pdf_graph, figure=fig, axes=[pdf_axis], add_legend=False)
        View(cdf_graph, figure=fig, axes=[cdf_axis], add_legend=False)
    else:
        distribution.setDescription(['$x_1$', '$x_2$'])
        pdf_graph = distribution.drawPDF()
Example #6
0
        indice, coefficient = 0, 1. / (DoF - d - 1)
        for j in range(d):
            for k in range(j + 1):
                assert_almost_equal(theoretical_mean_inverse[indice],
                                    coefficient * Scale[k, j])
                assert_almost_equal(theoretical_mean[indice],
                                    DoF * Scale_wishart[k, j])
                assert_almost_equal(mean_inverse[indice],
                                    coefficient * Scale[k, j], 0.15, 1.E-3)
                assert_almost_equal(mean[indice],
                                    DoF * Scale_wishart[k, j], 0.15, 1.E-3)
                indice += 1


# Instanciate one distribution object
distribution = ot.InverseWishart(ot.CovarianceMatrix(1), 5.0)
print("Distribution ", repr(distribution))
print("Distribution ", distribution)

# Get mean and covariance
print("Mean= ", repr(distribution.getMean()))
print("Covariance= ", repr(distribution.getCovariance()))

# Is this distribution elliptical ?
print("Elliptical = ", distribution.isElliptical())

# Test for realization of distribution
oneRealization = distribution.getRealization()
print("oneRealization=", repr(oneRealization))

# Test for sampling
Example #7
0
        indice, coefficient = 0, 1. / (DoF - d - 1)
        for j in range(d):
            for k in range(j + 1):
                assert_almost_equal(theoretical_mean_inverse[indice],
                                    coefficient * Scale[k, j])
                assert_almost_equal(theoretical_mean[indice],
                                    DoF * Scale_wishart[k, j])
                assert_almost_equal(mean_inverse[indice],
                                    coefficient * Scale[k, j], 0.15, 1.E-3)
                assert_almost_equal(mean[indice],
                                    DoF * Scale_wishart[k, j], 0.15, 1.E-3)
                indice += 1


# Instanciate one distribution object
distribution = ot.InverseWishart(ot.CovarianceMatrix(1), 5.0)
print("Distribution ", repr(distribution))
print("Distribution ", distribution)

# Get mean and covariance
print("Mean= ", repr(distribution.getMean()))
print("Covariance= ", repr(distribution.getCovariance()))

# Is this distribution elliptical ?
print("Elliptical = ", distribution.isElliptical())

# Test for realization of distribution
oneRealization = distribution.getRealization()
print("oneRealization=", repr(oneRealization))

# Test for sampling
import openturns as ot
from matplotlib import pyplot as plt
from openturns.viewer import View
if ot.InverseWishart().__class__.__name__ == 'ComposedDistribution':
    correlation = ot.CorrelationMatrix(2)
    correlation[1, 0] = 0.25
    aCopula = ot.NormalCopula(correlation)
    marginals = [ot.Normal(1.0, 2.0), ot.Normal(2.0, 3.0)]
    distribution = ot.ComposedDistribution(marginals, aCopula)
elif ot.InverseWishart().__class__.__name__ == 'CumulativeDistributionNetwork':
    distribution = ot.CumulativeDistributionNetwork(
        [ot.Normal(2), ot.Dirichlet([0.5, 1.0, 1.5])],
        ot.BipartiteGraph([[0, 1], [0, 1]]))
elif ot.InverseWishart().__class__.__name__ == 'Histogram':
    distribution = ot.Histogram([-1.0, 0.5, 1.0, 2.0], [0.45, 0.4, 0.15])
else:
    distribution = ot.InverseWishart()
dimension = distribution.getDimension()
if dimension == 1:
    distribution.setDescription(['$x$'])
    pdf_graph = distribution.drawPDF()
    cdf_graph = distribution.drawCDF()
    fig = plt.figure(figsize=(10, 4))
    plt.suptitle(str(distribution))
    pdf_axis = fig.add_subplot(121)
    cdf_axis = fig.add_subplot(122)
    View(pdf_graph, figure=fig, axes=[pdf_axis], add_legend=False)
    View(cdf_graph, figure=fig, axes=[cdf_axis], add_legend=False)
elif dimension == 2:
    distribution.setDescription(['$x_1$', '$x_2$'])
    pdf_graph = distribution.drawPDF()
Example #9
0
import openturns as ot
from matplotlib import pyplot as plt
from openturns.viewer import View
if ot.InverseWishart().__class__.__name__ == 'Bernoulli':
    distribution = ot.Bernoulli(0.7)
elif ot.InverseWishart().__class__.__name__ == 'Binomial':
    distribution = ot.Binomial(5, 0.2)
elif ot.InverseWishart().__class__.__name__ == 'ComposedDistribution':
    copula = ot.IndependentCopula(2)
    marginals = [ot.Uniform(1.0, 2.0), ot.Normal(2.0, 3.0)]
    distribution = ot.ComposedDistribution(marginals, copula)
elif ot.InverseWishart().__class__.__name__ == 'CumulativeDistributionNetwork':
    coll = [ot.Normal(2), ot.Dirichlet([0.5, 1.0, 1.5])]
    distribution = ot.CumulativeDistributionNetwork(
        coll, ot.BipartiteGraph([[0, 1], [0, 1]]))
elif ot.InverseWishart().__class__.__name__ == 'Histogram':
    distribution = ot.Histogram([-1.0, 0.5, 1.0, 2.0], [0.45, 0.4, 0.15])
elif ot.InverseWishart().__class__.__name__ == 'KernelMixture':
    kernel = ot.Uniform()
    sample = ot.Normal().getSample(5)
    bandwith = [1.0]
    distribution = ot.KernelMixture(kernel, bandwith, sample)
elif ot.InverseWishart().__class__.__name__ == 'MaximumDistribution':
    coll = [
        ot.Uniform(2.5, 3.5),
        ot.LogUniform(1.0, 1.2),
        ot.Triangular(2.0, 3.0, 4.0)
    ]
    distribution = ot.MaximumDistribution(coll)
elif ot.InverseWishart().__class__.__name__ == 'Multinomial':
    distribution = ot.Multinomial(5, [0.2])