def generate_student_data(ndag, size, r=0.8): order = ndag.getTopologicalOrder() copulas = [] for k in range(order.getSize()): d = 1 + ndag.getParents(k).getSize() R = ot.CorrelationMatrix(d) for i in range(d): for j in range(i): R[i, j] = r copulas.append(ot.Student(5.0, [0.0]*d, [1.0]*d, R).getCopula()) cbn = otagr.ContinuousBayesianNetwork(ndag, [ot.Uniform(0., 1.)]*ndag.getSize(), copulas) sample = cbn.getSample(size) return sample
def generate_student_data(ndag, size, r=0.8): order = ndag.getTopologicalOrder() jointDistributions = [] for k in range(order.getSize()): d = 1 + ndag.getParents(k).getSize() R = ot.CorrelationMatrix(d) for i in range(d): for j in range(i): R[i, j] = r jointDistributions.append( ot.Student(5.0, [0.0] * d, [1.0] * d, R).getCopula()) copula = otagr.ContinuousBayesianNetwork(ndag, jointDistributions) sample = copula.getSample(size) return sample
from __future__ import print_function import openturns as ot import openturns.viewer as viewer from matplotlib import pylab as plt ot.Log.Show(ot.Log.NONE) # %% # Create an 1-d distribution dist_1 = ot.Normal() # Create a 2-d distribution dist_2 = ot.ComposedDistribution( [ot.Normal(), ot.Triangular(0.0, 2.0, 3.0)], ot.ClaytonCopula(2.3)) # Create a 3-d distribution copula_dim3 = ot.Student(5.0, 3).getCopula() dist_3 = ot.ComposedDistribution( [ot.Normal(), ot.Triangular(0.0, 2.0, 3.0), ot.Exponential(0.2)], copula_dim3) # %% # Get the dimension fo the distribution dist_2.getDimension() # %% # Get the 2nd marginal dist_2.getMarginal(1) # %% # Get a 2-d marginal
import openturns as ot from matplotlib import pyplot as plt from openturns.viewer import View if (ot.ClaytonCopula().__class__.__name__ == 'SklarCopula'): myStudent = ot.Student(3.0, [1.0] * 2, [3.0] * 2, ot.CorrelationMatrix(2)) copula = ot.SklarCopula(myStudent) else: copula = ot.ClaytonCopula() if copula.getDimension() == 1: copula = ot.ClaytonCopula(2) copula.setDescription(['$u_1$', '$u_2$']) pdf_graph = copula.drawPDF() cdf_graph = copula.drawCDF() fig = plt.figure(figsize=(10, 4)) plt.suptitle(str(copula)) pdf_axis = fig.add_subplot(121) cdf_axis = fig.add_subplot(122) View(pdf_graph, figure=fig, axes=[pdf_axis], add_legend=False, square_axes=True) View(cdf_graph, figure=fig, axes=[cdf_axis], add_legend=False, square_axes=True)
import openturns as ot from matplotlib import pyplot as plt from openturns.viewer import View if (ot.Student().__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.Student().__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.Student() 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() fig = plt.figure(figsize=(10, 5))
# its PDF. dim = 2 distribution = ot.Normal(dim) graph = distribution.drawPDF() graph.setTitle("Bivariate standard unit gaussian PDF") view = otv.View(graph) # %% # The Student distribution # ^^^^^^^^^^^^^^^^^^^^^^^^ # # The :class:`~openturns.Student` distribution is natively multivariate. Here we define a Student distribution in dimension 2 and display its PDF : dim = 2 R = ot.CorrelationMatrix(dim) R[1, 0] = -0.2 distribution = ot.Student(4, [0.0, 1.0], [1.0, 1.0], R) graph = distribution.drawPDF() graph.setTitle("Bivariate Student PDF") view = otv.View(graph) # %% # The UserDefined distribution # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # # We can also define our own distribution with the :class:`~openturns.UserDefined` distribution. # For instance consider the square :math:`[-1,1] \times [-1, 1]` with some # random points uniformly drawn. For each point the weight chosen is the square # of the distance to the origin. The :class:`~openturns.UserDefined` class normalizes the weights. # %% # We first generate random points in the square.
size = 20 oneSample = ot.Sample(size, 1) twoSample = ot.Sample(size, 1) for i in range(size): oneSample[i, 0] = 7.0 * sin(-3.5 + (6.5 * i) / (size - 1.0)) + 2.0 twoSample[ i, 0] = -2.0 * oneSample[i, 0] + 3.0 + 0.05 * sin(oneSample[i, 0]) test = lm.LinearModelAlgorithm(oneSample, twoSample) result = lm.LinearModelResult(test.getResult()) analysis = lm.LinearModelAnalysis(result) print(analysis) # Compute confidence level (95%) for coefficients estimate (1-alpha = 0.95) alpha = 0.05 lower_sample = analysis.getCoefficientsEstimates( ) - analysis.getCoefficientsStandardErrors() * ot.Student( analysis.getDegreesOfFreedom()).computeQuantile(1 - alpha) upper_sample = analysis.getCoefficientsEstimates( ) + analysis.getCoefficientsStandardErrors() * ot.Student( analysis.getDegreesOfFreedom()).computeQuantile(1 - alpha) # lower and upper bounds as Point lower_bounds = ot.Point(lower_sample.getSize()) for i in range(lower_bounds.getSize()): lower_bounds[i] = lower_sample[i][0] upper_bounds = ot.Point(upper_sample.getSize()) for i in range(upper_bounds.getSize()): upper_bounds[i] = upper_sample[i][0] # interval confidence bounds interval = ot.Interval(lower_bounds, upper_bounds) print("confidence intervals with level=%1.2f : %s" % (1 - alpha, interval)) print("")
distributionCollection.add(lognormal) continuousDistributionCollection.add(lognormal) logistic = ot.Logistic(1.0, 1.0) distributionCollection.add(logistic) continuousDistributionCollection.add(logistic) normal = ot.Normal(1.0, 2.0) distributionCollection.add(normal) continuousDistributionCollection.add(normal) truncatednormal = ot.TruncatedNormal(1.0, 1.0, 0.0, 3.0) distributionCollection.add(truncatednormal) continuousDistributionCollection.add(truncatednormal) student = ot.Student(10.0, 10.0) distributionCollection.add(student) continuousDistributionCollection.add(student) triangular = ot.Triangular(-1.0, 2.0, 4.0) distributionCollection.add(triangular) continuousDistributionCollection.add(triangular) uniform = ot.Uniform(1.0, 2.0) distributionCollection.add(uniform) continuousDistributionCollection.add(uniform) weibull = ot.WeibullMin(1.0, 1.0, 2.0) distributionCollection.add(weibull) continuousDistributionCollection.add(weibull)
import openturns as ot from matplotlib import pyplot as plt from openturns.viewer import View if ot.Student().__class__.__name__ == 'Bernoulli': distribution = ot.Bernoulli(0.7) elif ot.Student().__class__.__name__ == 'Binomial': distribution = ot.Binomial(5, 0.2) elif ot.Student().__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.Student().__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.Student().__class__.__name__ == 'Histogram': distribution = ot.Histogram([-1.0, 0.5, 1.0, 2.0], [0.45, 0.4, 0.15]) elif ot.Student().__class__.__name__ == 'KernelMixture': kernel = ot.Uniform() sample = ot.Normal().getSample(5) bandwith = [1.0] distribution = ot.KernelMixture(kernel, bandwith, sample) elif ot.Student().__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.Student().__class__.__name__ == 'Multinomial': distribution = ot.Multinomial(5, [0.2])
#! /usr/bin/env python from __future__ import print_function import openturns as ot ot.TESTPREAMBLE() nu = 4.5 dim = 5 distribution = ot.Student(nu, dim) transformation = ot.RosenblattEvaluation(distribution) print("transformation=", repr(transformation)) point = ot.Point(dim, 0.75) print("transformation(", point, ")=", repr(transformation(point))) print("transformation parameters gradient=", repr(transformation.parameterGradient(point))) print("input dimension=", transformation.getInputDimension()) print("output dimension=", transformation.getOutputDimension())
if False: marginals = [ot.Uniform(0.0, 1.0) for i in range(order.getSize())] copulas = list() for i in range(order.getSize()): d = 1 + ndag.getParents(i).getSize() print("i=", i, ", d=", d) if d == 1: copulas.append(ot.IndependentCopula(1)) else: R = ot.CorrelationMatrix(d) for i in range(d): for j in range(i): R[i, j] = 0.5 / d copulas.append( ot.Student(5.0, [0.0] * d, [1.0] * d, R).getCopula()) cbn = otagrum.ContinuousBayesianNetwork(ndag, marginals, copulas) print("cbn=", cbn) print("cbn pdf=", cbn.computePDF([0.5] * d)) print("cbn realization=", cbn.getRealization()) size = 300 sampleLearn = cbn.getSample(size) sample = cbn.getSample(size) sampleLearn.exportToCSVFile("samplelearn.csv", ",") sample.exportToCSVFile("sample.csv", ",") print("cbn sample=", sample) logL = 0.0 pdfSample = cbn.computePDF(sample)
def clean(polynomial): coefficients = polynomial.getCoefficients() for i in range(coefficients.getDimension()): if abs(coefficients[i]) < 1.0e-12: coefficients[i] = 0.0 return ot.UniVariatePolynomial(coefficients) iMax = 5 distributionCollection = [ ot.Laplace(1.0, 0.0), ot.Logistic(0.0, 1.0), ot.Normal(0.0, 1.0), ot.Normal(1.0, 1.0), ot.Rayleigh(1.0), ot.Student(22.0), ot.Triangular(-1.0, 0.3, 1.0), ot.Uniform(-1.0, 1.0), ot.Uniform(-1.0, 3.0), ot.Weibull(1.0, 3.0), ot.Beta(1.0, 3.0, -1.0, 1.0), ot.Beta(0.5, 1.0, -1.0, 1.0), ot.Beta(0.5, 1.0, -2.0, 3.0), ot.Gamma(1.0, 3.0), ot.Arcsine() ] for n in range(len(distributionCollection)): distribution = distributionCollection[n] name = distribution.getClassName() polynomialFactory = ot.StandardDistributionPolynomialFactory( ot.AdaptiveStieltjesAlgorithm(distribution))
# %% # We draw the fitted distribution graph = distribution.drawPDF() graph.setTitle("Fitted Normal distribution") view = viewer.View(graph) # %% # The Student distribution # ------------------------ # # The parameters of the Student law are estimated by a mixed method of moments and reduces MLE. # # %% # We generate a sample from a Student distribution with parameters :math:`\nu=5.0`, :math:`\mu = -0.5` and a scale parameter :math:`\sigma=2.0`. sample = ot.Student(5.0, -0.5, 2.0).getSample(1000) # %% # We use the factory to build an estimated distribution : distribution = ot.StudentFactory().build(sample) # %% # We can obtain the estimated parameters with the `getParameter` method : print(distribution.getParameter()) # %% # Draw fitted distribution graph = distribution.drawPDF() graph.setTitle("Fitted Student distribution") view = viewer.View(graph)
indices = [1, 2, 3, 5, 6] print("indices=", indices) margins = distribution.getMarginal(indices) print("margins=", margins) print("margins PDF=%.5f" % margins.computePDF(point)) print("margins CDF=%.5f" % margins.computeCDF(point)) quantile = margins.computeQuantile(0.95) print("margins quantile=", quantile) print("margins CDF(quantile)=%.5f" % margins.computeCDF(quantile)) print("margins realization=", margins.getRealization()) # Tests o the isoprobabilistic transformation # General case with normal standard distribution print("isoprobabilistic transformation (general normal)=", distribution.getIsoProbabilisticTransformation()) # General case with non-normal standard distribution collection[0] = ot.SklarCopula(ot.Student( 3.0, [1.0]*2, [3.0]*2, ot.CorrelationMatrix(2))) collection.append(ot.Triangular(2.0, 3.0, 4.0)) distribution = ot.BlockIndependentDistribution(collection) print("isoprobabilistic transformation (general non-normal)=", distribution.getIsoProbabilisticTransformation()) dim = distribution.getDimension() x = 0.6 y = [0.2] * (dim - 1) print("conditional PDF=%.5f" % distribution.computeConditionalPDF(x, y)) print("conditional CDF=%.5f" % distribution.computeConditionalCDF(x, y)) print("conditional quantile=%.5f" % distribution.computeConditionalQuantile(x, y)) pt = ot.Point(dim) for i in range(dim): pt[i] = 0.1 * i + 0.05 print("sequential conditional PDF=",
print("children(", nod, ") : ", ndag.getChildren(nod)) order = ndag.getTopologicalOrder() marginals = [ot.Uniform(0.0, 1.0) for i in range(order.getSize())] copulas = list() for i in range(order.getSize()): d = 1 + ndag.getParents(i).getSize() print("i=", i, ", d=", d) if d == 1: copulas.append(ot.IndependentCopula(1)) else: R = ot.CorrelationMatrix(d) for i in range(d): for j in range(i): R[i, j] = 0.5 / d copulas.append(ot.Student(5.0, [0.0] * d, [1.0] * d, R).getCopula()) cbn = otagrum.ContinuousBayesianNetwork(ndag, marginals, copulas) size = 300 sample = cbn.getSample(size) # ContinuousBayesianNetworkFactory marginalsFactory = ot.UniformFactory() copulasFactory = ot.BernsteinCopulaFactory() threshold = 0.1 maxParents = 5 factory = otagrum.ContinuousBayesianNetworkFactory(marginalsFactory, copulasFactory, ndag, threshold, maxParents) cbn = factory.build(sample) print('cbn=', cbn)
import openturns as ot from matplotlib import pyplot as plt from openturns.viewer import View if ot.Student().__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.Student().__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.Student().__class__.__name__ == 'Histogram': distribution = ot.Histogram([-1.0, 0.5, 1.0, 2.0], [0.45, 0.4, 0.15]) else: distribution = ot.Student() 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()