Esempio n. 1
0
 def fit(self, X, y, **fit_params):
     input_dimension = X.shape[1]
     if self.distribution is None:
         self.distribution = BuildDistribution(X)
     factoryCollection = [ot.OrthogonalUniVariateFunctionFamily(        ot.OrthogonalUniVariatePolynomialFunctionFactory(ot.StandardDistributionPolynomialFactory(self.distribution.getMarginal(i)))) for i in range(input_dimension)]
     functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)
     algo = ot.TensorApproximationAlgorithm(X, y.reshape(-1, 1), self.distribution, functionFactory, [self.nk]*input_dimension, self.max_rank)
     algo.run()
     self._result = algo.getResult()
     return self
Esempio n. 2
0
    def fit(self, X, y, **fit_params):
        """Fit Tensor regression model.

        Parameters
        ----------
        X : array-like, shape = (n_samples, n_features)
            Training data.
        y : array-like, shape = (n_samples, [n_output_dims])
            Target values.

        Returns
        -------
        self : returns an instance of self.

        """
        if len(X) == 0:
            raise ValueError(
                "Can not perform a tensor approximation with empty sample")
        # check data type is accurate
        if (len(np.shape(X)) != 2):
            raise ValueError("X has incorrect shape.")
        input_dimension = len(X[1])
        if (len(np.shape(y)) != 2):
            raise ValueError("y has incorrect shape.")
        if self.distribution is None:
            self.distribution = BuildDistribution(X)
        factoryCollection = [
            ot.OrthogonalUniVariateFunctionFamily(
                ot.OrthogonalUniVariatePolynomialFunctionFactory(
                    ot.StandardDistributionPolynomialFactory(
                        self.distribution.getMarginal(i))))
            for i in range(input_dimension)
        ]
        functionFactory = ot.OrthogonalProductFunctionFactory(
            factoryCollection)
        algo = ot.TensorApproximationAlgorithm(X, y, self.distribution,
                                               functionFactory,
                                               [self.nk] * input_dimension,
                                               self.max_rank)
        algo.run()
        self.result_ = algo.getResult()
        return self
Esempio n. 3
0
# dim = 8
# model = ot.SymbolicFunction(['rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'],
# ['(2*pi_*Tu*(Hu-Hl))/(ln(r/rw)*(1+(2*L*Tu)/(ln(r/rw)*rw^2*Kw)+Tu/Tl))'])
# coll = [ot.Normal(0.1, 0.0161812),
# ot.LogNormal(7.71, 1.0056),
# ot.Uniform(63070.0, 115600.0),
# ot.Uniform(990.0, 1110.0),
# ot.Uniform(63.1, 116.0),
# ot.Uniform(700.0, 820.0),
# ot.Uniform(1120.0, 1680.0),
# ot.Uniform(9855.0, 12045.0)]

distribution = ot.ComposedDistribution(coll)
factoryCollection = [
    ot.OrthogonalUniVariateFunctionFamily(
        ot.OrthogonalUniVariatePolynomialFunctionFactory(
            ot.StandardDistributionPolynomialFactory(dist))) for dist in coll
]

functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)

size = 1000
X = distribution.getSample(size)
Y = model(X)

# ot.ResourceMap.Set('TensorApproximationAlgorithm-Method', 'RankM')

# n-d
nk = [10] * dim
maxRank = 5
algo = ot.TensorApproximationAlgorithm(X, Y, distribution, functionFactory, nk,
Esempio n. 4
0
import openturns as ot
from openturns.viewer import View

dim = 1
f = ot.SymbolicFunction(['x'], ['x*sin(x)'])
uniform = ot.Uniform(0.0, 10.0)
distribution = ot.ComposedDistribution([uniform] * dim)
factoryCollection = [
    ot.OrthogonalUniVariateFunctionFamily(
        ot.OrthogonalUniVariatePolynomialFunctionFactory(
            ot.StandardDistributionPolynomialFactory(uniform)))
] * dim
functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)
size = 10
sampleX = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0], [7.0], [8.0]]
sampleY = f(sampleX)
nk = [5] * dim
maxRank = 1
algo = ot.TensorApproximationAlgorithm(sampleX, sampleY, distribution,
                                       functionFactory, nk, maxRank)
algo.run()
result = algo.getResult()
metamodel = result.getMetaModel()

graph = f.draw(0.0, 10.0)
graph.add(metamodel.draw(0.0, 10.0))
graph.add(ot.Cloud(sampleX, sampleY))
graph.setColors(['blue', 'red', 'black'])
graph.setLegends(['model', 'meta model', 'sample'])
graph.setLegendPosition('topleft')
graph.setTitle('y(x)=x*sin(x)')
Esempio n. 5
0
# model = ot.SymbolicFunction(['rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'],
#['(2*_pi*Tu*(Hu-Hl))/(ln(r/rw)*(1+(2*L*Tu)/(ln(r/rw)*rw^2*Kw)+Tu/Tl))'])
# coll = [ot.Normal(0.1, 0.0161812),
# ot.LogNormal(7.71, 1.0056),
# ot.Uniform(63070.0, 115600.0),
# ot.Uniform(990.0, 1110.0),
# ot.Uniform(63.1, 116.0),
# ot.Uniform(700.0, 820.0),
# ot.Uniform(1120.0, 1680.0),
# ot.Uniform(9855.0, 12045.0)]

distribution = ot.ComposedDistribution(coll)
factoryCollection = list(
    map(
        lambda dist: ot.OrthogonalUniVariateFunctionFamily(
            ot.OrthogonalUniVariatePolynomialFunctionFactory(
                ot.StandardDistributionPolynomialFactory(dist))), coll))

functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)

size = 1000
X = distribution.getSample(size)
Y = model(X)

# ot.ResourceMap.Set('TensorApproximationAlgorithm-Method', 'RankM')

# n-d
nk = [10] * dim
maxRank = 5
algo = ot.TensorApproximationAlgorithm(X, Y, distribution, functionFactory, nk,
                                       maxRank)