diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/linear_regression/unimodal.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/linear_regression/unimodal.h')
-rw-r--r-- | library/cpp/linear_regression/unimodal.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/library/cpp/linear_regression/unimodal.h b/library/cpp/linear_regression/unimodal.h new file mode 100644 index 0000000000..e11b1118f6 --- /dev/null +++ b/library/cpp/linear_regression/unimodal.h @@ -0,0 +1,59 @@ +#pragma once + +#include "linear_regression.h" + +struct TGreedyParams { + double LowerBound = 0; + double UpperBound = 0; + size_t StepsCount = 0; + + double Point(const size_t step) const; +}; + +struct TOptimizationParams { + TGreedyParams ModeParams; + TGreedyParams NormalizerParams; + + double OptimizationShrinkage = 1e-2; + double RegressionShrinkage = 1e-5; + + size_t IterationsCount = 1000; + + TOptimizationParams() = default; + + static TOptimizationParams Default(const TVector<double>& values) { + TOptimizationParams optimizationParams; + + optimizationParams.ModeParams.LowerBound = 0; + optimizationParams.ModeParams.UpperBound = values.size(); + optimizationParams.ModeParams.StepsCount = values.size() + 1; + + optimizationParams.NormalizerParams.LowerBound = 0.5; + optimizationParams.NormalizerParams.UpperBound = values.size() * 2; + optimizationParams.NormalizerParams.StepsCount = values.size() * 2 + 1; + + return optimizationParams; + } + + static TOptimizationParams Default(const TVector<double>& values, const TVector<double>& arguments) { + Y_ASSERT(values.size() == arguments.size()); + + TOptimizationParams optimizationParams; + + optimizationParams.ModeParams.LowerBound = *MinElement(arguments.begin(), arguments.end()); + optimizationParams.ModeParams.UpperBound = *MaxElement(arguments.begin(), arguments.end()); + optimizationParams.ModeParams.StepsCount = arguments.size() + 1; + + optimizationParams.NormalizerParams.UpperBound = optimizationParams.ModeParams.UpperBound - optimizationParams.ModeParams.LowerBound; + optimizationParams.NormalizerParams.StepsCount = arguments.size() * 2 + 1; + optimizationParams.NormalizerParams.LowerBound = optimizationParams.NormalizerParams.UpperBound / optimizationParams.NormalizerParams.StepsCount; + + return optimizationParams; + } +}; + +double MakeUnimodal(TVector<double>& values, const TOptimizationParams& optimizationParams); +double MakeUnimodal(TVector<double>& values); + +double MakeUnimodal(TVector<double>& values, const TVector<double>& arguments, const TOptimizationParams& optimizationParams); +double MakeUnimodal(TVector<double>& values, const TVector<double>& arguments); |