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
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
# # %% 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]):
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
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)})