File: t_HSICEstimatorConditionalSensitivity_std.py

package info (click to toggle)
openturns 1.26-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 67,708 kB
  • sloc: cpp: 261,605; python: 67,030; ansic: 4,378; javascript: 406; sh: 185; xml: 164; makefile: 101
file content (95 lines) | stat: -rwxr-xr-x 2,970 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#! /usr/bin/env python

import openturns as ot
import openturns.testing as ott
from openturns.usecases import ishigami_function

ot.TESTPREAMBLE()
ot.RandomGenerator.SetSeed(0)


# Ishigami use-case
ishigami = ishigami_function.IshigamiModel()
distX = ishigami.distribution

# Get a sample of it
size = 100
X = distX.getSample(size)


# The Ishigami model
modelIshigami = ishigami.model
modelIshigami.setParameter([5, 0.1])

# Apply model: Y = m(X)
Y = modelIshigami(X)

# We define the covariance models for the HSIC indices.
# For the input, we consider a SquaredExponential covariance model.
covarianceModelCollection = ot.CovarianceModelCollection()

# Input sample
for i in range(3):
    Xi = X.getMarginal(i)
    Cov = ot.SquaredExponential(1)
    Cov.setScale(Xi.computeStandardDeviation())
    covarianceModelCollection.add(Cov)

# Output sample with squared exponential covariance
Cov2 = ot.SquaredExponential(1)
Cov2.setScale(Y.computeStandardDeviation())
covarianceModelCollection.add(Cov2)


# We define a distance function for the weights
# For the TSA, the critical domain is [5,+inf].
interval = ot.Interval(5, float("inf"))
g = ot.DistanceToDomainFunction(interval)

stdDev = Y.computeStandardDeviation()[0]
foo = ot.SymbolicFunction(["x", "s"], ["exp(-x/s)"])
g2 = ot.ParametricFunction(foo, [1], [0.1 * stdDev])

# The weight function
weight = ot.ComposedFunction(g2, g)

# random generator state
# use the same state for parallel/sequential validation
state = ot.RandomGenerator.GetState()

for key in [True, False]:
    ot.ResourceMap.SetAsBool("HSICEstimator-ParallelPValues", key)
    ot.RandomGenerator.SetState(state)

    # We eventually build the HSIC object
    # HSICVStat event is already embedded as it is the only one available
    # for that kind of analysis
    CSA = ot.HSICEstimatorConditionalSensitivity(
        covarianceModelCollection, X, Y, weight
    )

    # We get the R2-HSIC
    R2HSIC = CSA.getR2HSICIndices()
    ott.assert_almost_equal(R2HSIC, [0.03717355, 0.00524130, 0.23551919])

    # and the HSIC indices
    HSICIndices = CSA.getHSICIndices()
    ott.assert_almost_equal(HSICIndices, [0.00064033, 0.00025769, 0.01105157])

    # We set the number of permutations for the pvalue estimate
    b = 100
    CSA.setPermutationSize(b)

    # We get the pvalue estimate by permutations
    pvaluesPerm = CSA.getPValuesPermutation()
    ott.assert_almost_equal(pvaluesPerm, [0.74257426, 0.94059406, 0.00000000])

    # Change the weight function and recompute everything
    squaredExponential = ot.SymbolicFunction("x", "exp(-x^2)")
    alternateWeight = ot.ComposedFunction(squaredExponential, g)
    CSA.setWeightFunction(alternateWeight)
    ott.assert_almost_equal(CSA.getR2HSICIndices(), [0.0910527, 0.00738055, 0.166624])
    ott.assert_almost_equal(CSA.getHSICIndices(), [0.00218376, 0.000419288, 0.00898721])
    ott.assert_almost_equal(
        CSA.getPValuesPermutation(), [0.287129, 0.881188, 0.00000000]
    )