Skip to content

Commit

Permalink
Hotfix after ssa (#82)
Browse files Browse the repository at this point in the history
Return basis in transformation, Move ssa into models
  • Loading branch information
valer1435 authored Sep 12, 2023
1 parent fcf28c9 commit e63ba49
Show file tree
Hide file tree
Showing 14 changed files with 79 additions and 27 deletions.
2 changes: 1 addition & 1 deletion fedot_ind/core/architecture/pipelines/classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from pymonad.either import Right
from fedot_ind.core.architecture.pipelines.abstract_pipeline import AbstractPipelines
from fedot_ind.core.architecture.preprocessing.DatasetLoader import DataLoader
from fedot_ind.core.operation.implementation.basis.data_driven import DataDrivenBasisImplementation
from fedot_ind.core.operation.transformation.basis.data_driven import DataDrivenBasisImplementation
from functools import partial


Expand Down
4 changes: 2 additions & 2 deletions fedot_ind/core/architecture/settings/pipeline_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
from fedot_ind.core.models.recurrence.RecurrenceExtractor import RecurrenceExtractor
from fedot_ind.core.models.signal.SignalExtractor import SignalExtractor
from fedot_ind.core.models.topological.TopologicalExtractor import TopologicalExtractor
from fedot_ind.core.operation.implementation.basis.fourier import FourierBasisImplementation
from fedot_ind.core.operation.implementation.basis.wavelet import WaveletBasisImplementation
from fedot_ind.core.operation.transformation.basis.data_driven import DataDrivenBasisImplementation
from fedot_ind.core.operation.transformation.basis.fourier import FourierBasisImplementation
from fedot_ind.core.operation.transformation.basis.wavelet import WaveletBasisImplementation



Expand Down
2 changes: 1 addition & 1 deletion fedot_ind/core/models/signal/SignalExtractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from fedot_ind.core.metrics.metrics_implementation import *
from fedot_ind.core.models.WindowedFeaturesExtractor import WindowedFeatureExtractor
from fedot_ind.core.models.quantile.quantile_extractor import QuantileExtractor
from fedot_ind.core.operation.implementation.basis.wavelet import WaveletBasisImplementation
from fedot_ind.core.operation.transformation.basis.wavelet import WaveletBasisImplementation


class SignalExtractor(WindowedFeatureExtractor):
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from fedot.core.operations.evaluation.time_series import FedotTsForecastingStrategy
from fedot.core.operations.operation_parameters import OperationParameters

from fedot_ind.core.operation.ts_forecasting.data_driven_ts import DataDrivenForForecastingBasisImplementation
from fedot_ind.core.models.ts_forecasting.data_driven_ts import DataDrivenForForecastingBasisImplementation
from fedot_ind.core.repository.IndustrialOperationParameters import IndustrialOperationParameters


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from fedot_ind.core.models.topological.TopologicalExtractor import TopologicalExtractor
from fedot_ind.core.operation.dummy.dummy_operation import DummyOperation

from fedot_ind.core.operation.implementation.basis.fourier import FourierBasisImplementation
from fedot_ind.core.operation.implementation.basis.wavelet import WaveletBasisImplementation
from fedot_ind.core.operation.transformation.basis.fourier import FourierBasisImplementation
from fedot_ind.core.operation.transformation.basis.wavelet import WaveletBasisImplementation
from fedot_ind.core.operation.transformation.basis.data_driven import DataDrivenBasisImplementation

from fedot_ind.core.repository.IndustrialOperationParameters import IndustrialOperationParameters
Expand Down
88 changes: 70 additions & 18 deletions fedot_ind/core/operation/transformation/basis/data_driven.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
from typing import Optional, TypeVar
from typing import Optional, Tuple, TypeVar
from typing import Optional, Tuple, TypeVar

import numpy as np
import pandas as pd
import tensorly as tl
from fedot.core.data.data import InputData

from fedot.core.operations.operation_parameters import OperationParameters
from joblib import Parallel, delayed
from pymonad.either import Either
from pymonad.list import ListMonad
from scipy import stats
from scipy.spatial.distance import cdist
from tensorly.decomposition import parafac
from tqdm import tqdm

from fedot_ind.core.operation.decomposition.SpectrumDecomposition import SpectrumDecomposer
from fedot_ind.core.operation.implementation.basis.abstract_basis import BasisDecompositionImplementation
from fedot_ind.core.operation.decomposition.matrix_decomposition.fast_svd import RSVDDecomposition
from fedot_ind.core.operation.transformation.basis.abstract_basis import BasisDecompositionImplementation
from fedot_ind.core.operation.transformation.data.hankel import HankelMatrix
from fedot_ind.core.operation.transformation.regularization.spectrum import reconstruct_basis, \
singular_value_hard_threshold

class_type = TypeVar("T", bound="DataDrivenBasis")

Expand All @@ -36,7 +42,8 @@ def __init__(self, params: Optional[OperationParameters] = None):
self.SV_threshold = None
# self.sv_selector = params.get('sv_selector')
self.sv_selector = 'median'

self.svd_estimator = RSVDDecomposition()
self.low_rank_approximation = True
self.logging_params.update({'WS': self.window_size,
'SV_selector': self.sv_selector,
})
Expand Down Expand Up @@ -89,15 +96,6 @@ def _transform(self, input_data: InputData) -> np.array:
# predict = self._clean_predict(np.array(v))
return predict

def _transform_one_sample(self, series: np.array, svd_flag: bool = False):
trajectory_transformer = HankelMatrix(time_series=series, window_size=self.window_size)
data = trajectory_transformer.trajectory_matrix
self.window_size = trajectory_transformer.window_length
self.decomposer = SpectrumDecomposer(data, trajectory_transformer.ts_length, self.SV_threshold)
if svd_flag:
return self.estimate_singular_values(data)
return self._get_basis(data)

def get_threshold(self, data, selector: str):

selectors = {'median': stats.mode,
Expand All @@ -111,20 +109,74 @@ def get_threshold(self, data, selector: str):

return selectors[selector](svd_numbers).mode[0]

def _transform_one_sample(self, series: np.array, svd_flag: bool = False):
trajectory_transformer = HankelMatrix(time_series=series, window_size=self.window_size)
data = trajectory_transformer.trajectory_matrix
self.ts_length = trajectory_transformer.ts_length
if svd_flag:
return self.estimate_singular_values(data)
return self._get_basis(data)

def estimate_singular_values(self, data):
basis = Either.insert(data).then(self.decomposer.svd).value[0]
svd = lambda x: ListMonad(self.svd_estimator.rsvd(tensor=x, approximation=self.low_rank_approximation))
basis = Either.insert(data).then(svd).value[0]
spectrum = [s_val for s_val in basis[1] if s_val > 0.001]
# self.left_approx_sv, self.right_approx_sv = basis[0], basis[2]
return len(spectrum)

def _get_1d_basis(self, data):
basis = Either.insert(data).then(self.decomposer.svd).then(self.decomposer.threshold).then(
self.decomposer.data_driven_basis).value[0]
data_driven_basis = lambda Monoid: ListMonad(reconstruct_basis(Monoid[0],
Monoid[1],
Monoid[2],
ts_length=self.ts_length))
threshold = lambda Monoid: ListMonad([Monoid[0],
Monoid[1][:self.SV_threshold],
Monoid[2]])
svd = lambda x: ListMonad(self.svd_estimator.rsvd(tensor=x,
approximation=self.low_rank_approximation,
regularized_rank=self.SV_threshold))
basis = Either.insert(data).then(svd).then(threshold).then(data_driven_basis).value[0]
return np.swapaxes(basis, 1, 0)

def _get_multidim_basis(self, data):
rank = round(data[0].shape[0] / 10)
beta = data[0].shape[0] / data[0].shape[1]

tensor_decomposition = lambda x: ListMonad(parafac(tl.tensor(x), rank=rank).factors)
multi_threshold = lambda x: singular_value_hard_threshold(singular_values=x,
beta=beta,
threshold=None)

threshold = lambda Monoid: ListMonad([Monoid[1],
list(map(multi_threshold, Monoid[0])),
Monoid[2].T]) if self.n_components is None else ListMonad([Monoid[1][
:,
:self.n_components],
Monoid[0][
:,
:self.n_components],
Monoid[2][
:,
:self.n_components].T])
data_driven_basis = lambda Monoid: ListMonad(reconstruct_basis(Monoid[0],
Monoid[1],
Monoid[2],
ts_length=self.ts_length))

basis = np.array(
Either.insert(data).then(self.decomposer.tensor_decomposition).then(self.decomposer.multi_threshold).then(
self.decomposer.data_driven_basis).value[0])
Either.insert(data).then(tensor_decomposition).then(threshold).then(data_driven_basis).value[0])

basis = basis.reshape(basis.shape[1], -1)

return basis

def evaluate_derivative(self: class_type,
coefs: np.array,
order: int = 1) -> Tuple[class_type, np.array]:
basis = type(self)(
domain_range=self.domain_range,
n_basis=self.n_basis - order,
)
derivative_coefs = np.array([np.polyder(x[::-1], order)[::-1] for x in coefs])

return basis, derivative_coefs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional
import numpy as np
from fedot.core.operations.operation_parameters import OperationParameters
from fedot_ind.core.operation.implementation.basis.abstract_basis import BasisDecompositionImplementation
from fedot_ind.core.operation.transformation.basis.abstract_basis import BasisDecompositionImplementation


class FourierBasisImplementation(BasisDecompositionImplementation):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from fedot.core.operations.operation_parameters import OperationParameters
from pymonad.either import Either
from pymonad.list import ListMonad
from fedot_ind.core.operation.implementation.basis.abstract_basis import BasisDecompositionImplementation
from fedot_ind.core.operation.transformation.basis.abstract_basis import BasisDecompositionImplementation


class WaveletBasisImplementation(BasisDecompositionImplementation):
Expand Down
Empty file.

0 comments on commit e63ba49

Please sign in to comment.