aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/linear_regression/unimodal.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/linear_regression/unimodal.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/linear_regression/unimodal.h')
-rw-r--r--library/cpp/linear_regression/unimodal.h59
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);