Get the (output) marginal of a PCEΒΆ

from openturns.usecases import flood_model
import openturns as ot
ot.RandomGenerator.SetSeed(0)

Create a PCE of a multivariate output function

fm = flood_model.FloodModel()
sampleSize = 100
inputTrain = fm.distribution.getSample(sampleSize)
print(f"Output dimension = {fm.model.getOutputDimension()}")
outputTrain = fm.model(inputTrain)
marginalList = [fm.distribution.getMarginal(i) for i in range(fm.distribution.getDimension())]
multivariateBasis = ot.OrthogonalProductPolynomialFactory(marginalList)
selectionAlgorithm = ot.LeastSquaresMetaModelSelectionFactory()
projectionStrategy = ot.LeastSquaresStrategy(selectionAlgorithm)
totalDegree = 4
enumerateFunction = multivariateBasis.getEnumerateFunction()
basisSize = enumerateFunction.getBasisSizeFromTotalDegree(totalDegree)
adaptiveStrategy = ot.FixedStrategy(multivariateBasis, basisSize)
chaosAlgo = ot.FunctionalChaosAlgorithm(
    inputTrain, outputTrain, fm.distribution, adaptiveStrategy, projectionStrategy
)
chaosAlgo.run()
chaosResult = chaosAlgo.getResult()
chaosResult
Output dimension = 3
FunctionalChaosResult
  • input dimension: 8
  • output dimension: 3
  • distribution dimension: 8
  • transformation: 8 -> 8
  • inverse transformation: 8 -> 8
  • orthogonal basis dimension: 8
  • indices size: 54
Index Multi-index Coeff.#0 Coeff.#1 Coeff.#2
0 [0,0,0,0,0,0,0,0] 2.548371 -5.896414 1.051877
1 [1,0,0,0,0,0,0,0] 0.773257 0.8357752 0.1253737
2 [0,1,0,0,0,0,0,0] -0.4389366 -0.3860588 -0.05421815
3 [0,0,1,0,0,0,0,0] 0.08976339 0.647519 0.09112254
4 [0,0,0,1,0,0,0,0] -0.08137927 0 0
5 [0,0,0,0,0,0,1,0] 0 -0.1905812 -0.02479445
6 [0,0,0,0,0,0,0,1] 0 -0.5785103 -0.08005601
7 [2,0,0,0,0,0,0,0] -0.1214097 0 -0.01510397
8 [1,1,0,0,0,0,0,0] -0.1210497 0 -0.01609437
9 [1,0,1,0,0,0,0,0] 0.0249925 0 0
10 [1,0,0,1,0,0,0,0] -0.03204353 -0.06062191 -0.00616599
11 [0,2,0,0,0,0,0,0] 0.1650799 0.2157529 0
12 [0,0,1,0,0,0,0,1] 0 0.03178252 0
13 [2,1,0,0,0,0,0,0] 0 0 0.01875842
14 [2,0,1,0,0,0,0,0] 0 0 -0.02694046
15 [2,0,0,1,0,0,0,0] 0.02169697 0 0
16 [1,2,0,0,0,0,0,0] 0.03479956 0.08026756 0
17 [1,1,0,0,0,1,0,0] 0.002127432 0 0
18 [1,0,1,1,0,0,0,0] -0.01386595 0 0
19 [0,3,0,0,0,0,0,0] -0.05261044 0 0
20 [0,2,1,0,0,0,0,0] 0.007146761 0 -0.01108846
21 [0,2,0,1,0,0,0,0] 0.003041979 0 0
22 [0,2,0,0,0,1,0,0] 0.001910707 0.04568372 0
23 [0,1,1,0,0,0,0,1] -0.0118976 0 0
24 [0,0,1,2,0,0,0,0] 0.008048237 0 0
25 [0,0,0,2,1,0,0,0] 0 0 0.00304079
26 [3,0,0,0,0,1,0,0] -0.005522131 0 0
27 [2,0,0,2,0,0,0,0] 0 0 0.0005163499
28 [1,2,0,0,0,1,0,0] 0.006881887 0.02602445 0
29 [1,1,0,2,0,0,0,0] -0.002116046 0.01629044 0
30 [1,1,0,0,0,2,0,0] 0.0005137444 0 0
31 [1,1,0,0,0,1,0,1] 0.004035853 0.0310958 0
32 [1,0,1,0,0,2,0,0] 0.00530171 0 0
33 [1,0,1,0,0,0,0,2] 0 0 0.009452343
34 [1,0,0,2,1,0,0,0] -0.0003194063 0 0
35 [1,0,0,0,0,2,1,0] 0 0 -0.0003454352
36 [1,0,0,0,0,1,0,2] 0.01226029 0 0
37 [0,4,0,0,0,0,0,0] 0.05244523 0 0
38 [0,3,1,0,0,0,0,0] 0.01209063 0.05043918 0.002357003
39 [0,2,2,0,0,0,0,0] 0 0 0.00226228
40 [0,2,1,1,0,0,0,0] 0.005735646 0 0
41 [0,2,1,0,1,0,0,0] 0.006009616 0 0
42 [0,2,0,2,0,0,0,0] -0.02147063 0 0
43 [0,1,2,1,0,0,0,0] 0 0 -0.005858556
44 [0,1,2,0,0,0,0,1] 0.00340243 0 0
45 [0,1,1,1,1,0,0,0] 0.008101327 0 0
46 [0,1,0,2,1,0,0,0] -0.01241504 0 -0.003665261
47 [0,1,0,0,3,0,0,0] 0.001777337 0 0
48 [0,0,4,0,0,0,0,0] 0.003530577 0 0
49 [0,0,0,3,1,0,0,0] -0.004709976 0 0
50 [0,0,0,1,0,3,0,0] 0 0 0.003566791
51 [0,0,0,1,0,2,0,1] 0.008706613 0 0
52 [0,0,0,0,3,0,0,1] 0 0 0.005100202
53 [0,0,0,0,1,0,0,3] 0 0 0.003412873


Get the marginal PCE corresponding to the third output.

marginal_pce = chaosResult.getMarginal(2)
marginal_pce
FunctionalChaosResult
  • input dimension: 8
  • output dimension: 1
  • distribution dimension: 8
  • transformation: 8 -> 8
  • inverse transformation: 8 -> 8
  • orthogonal basis dimension: 8
  • indices size: 23
Index Multi-index Coeff.
0 [0,0,0,0,0,0,0,0] 1.051877
1 [1,0,0,0,0,0,0,0] 0.1253737
2 [0,1,0,0,0,0,0,0] -0.05421815
3 [0,0,1,0,0,0,0,0] 0.09112254
4 [0,0,0,0,0,0,1,0] -0.02479445
5 [0,0,0,0,0,0,0,1] -0.08005601
6 [2,0,0,0,0,0,0,0] -0.01510397
7 [1,1,0,0,0,0,0,0] -0.01609437
8 [1,0,0,1,0,0,0,0] -0.00616599
9 [2,1,0,0,0,0,0,0] 0.01875842
10 [2,0,1,0,0,0,0,0] -0.02694046
11 [0,2,1,0,0,0,0,0] -0.01108846
12 [0,0,0,2,1,0,0,0] 0.00304079
13 [2,0,0,2,0,0,0,0] 0.0005163499
14 [1,0,1,0,0,0,0,2] 0.009452343
15 [1,0,0,0,0,2,1,0] -0.0003454352
16 [0,3,1,0,0,0,0,0] 0.002357003
17 [0,2,2,0,0,0,0,0] 0.00226228
18 [0,1,2,1,0,0,0,0] -0.005858556
19 [0,1,0,2,1,0,0,0] -0.003665261
20 [0,0,0,1,0,3,0,0] 0.003566791
21 [0,0,0,0,3,0,0,1] 0.005100202
22 [0,0,0,0,1,0,0,3] 0.003412873


Get the marginal PCE corresponding to the second and third outputs.

marginal_pce = chaosResult.getMarginal([1, 2])
marginal_pce
FunctionalChaosResult
  • input dimension: 8
  • output dimension: 2
  • distribution dimension: 8
  • transformation: 8 -> 8
  • inverse transformation: 8 -> 8
  • orthogonal basis dimension: 8
  • indices size: 30
Index Multi-index Coeff.#0 Coeff.#1
0 [0,0,0,0,0,0,0,0] -5.896414 1.051877
1 [1,0,0,0,0,0,0,0] 0.8357752 0.1253737
2 [0,1,0,0,0,0,0,0] -0.3860588 -0.05421815
3 [0,0,1,0,0,0,0,0] 0.647519 0.09112254
4 [0,0,0,0,0,0,1,0] -0.1905812 -0.02479445
5 [0,0,0,0,0,0,0,1] -0.5785103 -0.08005601
6 [2,0,0,0,0,0,0,0] 0 -0.01510397
7 [1,1,0,0,0,0,0,0] 0 -0.01609437
8 [1,0,0,1,0,0,0,0] -0.06062191 -0.00616599
9 [0,2,0,0,0,0,0,0] 0.2157529 0
10 [0,0,1,0,0,0,0,1] 0.03178252 0
11 [2,1,0,0,0,0,0,0] 0 0.01875842
12 [2,0,1,0,0,0,0,0] 0 -0.02694046
13 [1,2,0,0,0,0,0,0] 0.08026756 0
14 [0,2,1,0,0,0,0,0] 0 -0.01108846
15 [0,2,0,0,0,1,0,0] 0.04568372 0
16 [0,0,0,2,1,0,0,0] 0 0.00304079
17 [2,0,0,2,0,0,0,0] 0 0.0005163499
18 [1,2,0,0,0,1,0,0] 0.02602445 0
19 [1,1,0,2,0,0,0,0] 0.01629044 0
20 [1,1,0,0,0,1,0,1] 0.0310958 0
21 [1,0,1,0,0,0,0,2] 0 0.009452343
22 [1,0,0,0,0,2,1,0] 0 -0.0003454352
23 [0,3,1,0,0,0,0,0] 0.05043918 0.002357003
24 [0,2,2,0,0,0,0,0] 0 0.00226228
25 [0,1,2,1,0,0,0,0] 0 -0.005858556
26 [0,1,0,2,1,0,0,0] 0 -0.003665261
27 [0,0,0,1,0,3,0,0] 0 0.003566791
28 [0,0,0,0,3,0,0,1] 0 0.005100202
29 [0,0,0,0,1,0,0,3] 0 0.003412873