예제 #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
예제 #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
예제 #3
0
#

# %%
factoryCollection = [
    ot.OrthogonalUniVariatePolynomialFunctionFactory(
        ot.StandardDistributionPolynomialFactory(_)) for _ in [E, F, L, I]
]
functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)
nk = [4, 15, 3, 2]
maxRank = 1

# %%
# Finally we might launch the algorithm:

# %%
algo = ot.TensorApproximationAlgorithm(X_train, Y_train, myDistribution,
                                       functionFactory, nk, maxRank)
algo.run()
result = algo.getResult()
metamodel = result.getMetaModel()

# %%
# The `run` method has optimized the hyperparameters of the metamodel (:math:`\beta` coefficients).
#
# We can then print the coefficients which have been estimated using a double loop.

# %%
tensor = result.getTensor()
for j in range(myDistribution.getDimension()):
    print("j =", j)
    for i in range(maxRank):
        for k in range(nk[j]):
예제 #4
0
    sample = ot.Normal(3).getSample(10)
    kDTree = ot.KDTree(sample)
    myStudy.add('kDTree', kDTree)

    # TensorApproximationAlgorithm/Result
    dim = 1
    model = ot.SymbolicFunction(['x'], ['x*sin(x)'])
    distribution = ot.ComposedDistribution([ot.Uniform()] * dim)
    factoryCollection = [ot.FourierSeriesFactory()] * dim
    functionFactory = ot.OrthogonalProductFunctionFactory(factoryCollection)
    size = 10
    X = distribution.getSample(size)
    Y = model(X)
    nk = [5] * dim
    rank = 1
    algo = ot.TensorApproximationAlgorithm(X, Y, distribution, functionFactory,
                                           nk, rank)
    algo.run()
    tensorResult = algo.getResult()
    myStudy.add('tensorResult', tensorResult)
    tensorIn = [0.4]
    tensorRef = tensorResult.getMetaModel()(tensorIn)

    # Distribution parameters

    # ArcsineMuSigma parameter ave
    ams_parameters = ot.ArcsineMuSigma(8.4, 2.25)
    myStudy.add('ams_parameters', ams_parameters)
    # BetaMuSigma parameter save
    bms_parameters = ot.BetaMuSigma(0.2, 0.6, -1, 2)
    myStudy.add('bms_parameters', bms_parameters)
    # GammaMuSigma parameter save
예제 #5
0
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)')
graph.setYTitle('y')
View(graph, figure_kw={'figsize': (8, 4)})