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
print('i=', i, 'f(X)=', f(x)) # Using multi-indices enum = basis.getEnumerateFunction() for i in range(10): indices = enum(i) f = basis.build(indices) print('indices=', indices, 'f(X)=', f(x)) # Other factories factoryCollection = [ ot.OrthogonalUniVariatePolynomialFunctionFactory(ot.LaguerreFactory(2.5)), ot.HaarWaveletFactory(), ot.FourierSeriesFactory() ] dim = len(factoryCollection) basisFactory = ot.OrthogonalProductFunctionFactory(factoryCollection) basis = ot.OrthogonalBasis(basisFactory) print('basis=', basis) x = [0.5] * dim for i in range(10): f = basis.build(i) print('i=', i, 'f(X)=', f(x)) # Using multi-indices enum = basis.getEnumerateFunction() for i in range(10): indices = enum(i) f = basis.build(indices) print('indices=', indices, 'f(X)=', f(x))
import openturns as ot from matplotlib import pyplot as plt from openturns.viewer import View from math import sqrt domain = ot.Interval(-1.0, 1.0) basis = ot.OrthogonalProductFunctionFactory([ot.FourierSeriesFactory()]) basisSize = 10 experiment = ot.GaussProductExperiment(basis.getMeasure(), [20]) mustScale = False threshold = 0.001 model = ot.AbsoluteExponential([1.0]) algo = ot.KarhunenLoeveQuadratureAlgorithm(domain, domain, model, experiment, basis, basisSize, mustScale, threshold) algo.run() ev = algo.getResult().getEigenValues() functions = algo.getResult().getScaledModes() g = ot.Graph() g.setXTitle("$t$") g.setYTitle("$\sqrt{\lambda_n}\phi_n$") for i in range(functions.getSize()): g.add(functions.build(i).draw(-1.0, 1.0, 256)) g.setColors(ot.Drawable.BuildDefaultPalette(functions.getSize())) fig = plt.figure(figsize=(6, 4)) plt.suptitle("Quadrature approx. of KL expansion for $C(s,t)=e^{-|s-t|}$") axis = fig.add_subplot(111) axis.set_xlim(auto=True) View(g, figure=fig, axes=[axis], add_legend=False)