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
# 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,
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)')
# 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)