summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/optimization/isotonic_regression_abstract.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ml/dlib/dlib/optimization/isotonic_regression_abstract.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/ml/dlib/dlib/optimization/isotonic_regression_abstract.h b/ml/dlib/dlib/optimization/isotonic_regression_abstract.h
new file mode 100644
index 000000000..b00334bef
--- /dev/null
+++ b/ml/dlib/dlib/optimization/isotonic_regression_abstract.h
@@ -0,0 +1,128 @@
+// Copyright (C) 2018 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#undef DLIB_ISOTONIC_ReGRESSION_ABSTRACT_H_
+#ifdef DLIB_ISOTONIC_ReGRESSION_ABSTRACT_H_
+
+#include <vector>
+#include <utility>
+
+namespace dlib
+{
+ class isotonic_regression
+ {
+ /*!
+ WHAT THIS OBJECT REPRESENTS
+ This object is a tool for performing 1-D isotonic regression. That is, it
+ finds the least squares fit of a non-parametric curve to some user supplied
+ data, subject to the constraint that the fitted curve is non-decreasing.
+
+ This is done using the fast O(n) pool adjacent violators algorithm.
+ !*/
+
+ public:
+
+ template <
+ typename const_iterator,
+ typename iterator
+ >
+ void operator() (
+ const_iterator begin,
+ const_iterator end,
+ iterator obegin
+ );
+ /*!
+ requires
+ - [begin,end) is an iterator range of float or doubles or a range of
+ std::pair<T,double> or std::pair<T,float> where T an be anything.
+ - obegin points to an iterator range at least std::distance(begin,end).
+ - obegin points to an iterator range of objects of type float, double, std::pair<T,float>, or std::pair<T,double>.
+ ensures
+ - Given the range of real values stored in [begin,end), this method performs isotonic regression
+ on this data and writes the results to obegin. To be specific:
+ - let IN refer to the input values stored in the iterator range [begin,end).
+ - let OUT refer to the output values stored in the iterator range [obegin, obegin+std::distance(begin,end)).
+ - This function populates OUT with values such that the sum_i of
+ (IN[i]-OUT[i])^2 is minimized, subject to the constraint that
+ OUT[i] <= OUT[i+1], i.e. that OUT is monotonic.
+ - It is OK for [begin,end) to overlap with the range pointed to by obegin.
+ That is, this function can run in-place.
+ - Note that when the inputs or outputs are std::pairs this algorithm only
+ looks at the .second field of the pair. It therefore still treats these
+ iterator ranges as ranges of reals since it only looks at the .second
+ field, which is a real number. The .first field is entirely ignored.
+ !*/
+
+ void operator() (
+ std::vector<double>& vect
+ ) { (*this)(vect.begin(), vect.end(), vect.begin()); }
+ /*!
+ ensures
+ - performs in-place isotonic regression. Therefore, #vect will contain the
+ isotonic regression of vect.
+ - #vect.size() == vect.size()
+ !*/
+
+ template <typename T, typename U>
+ void operator() (
+ std::vector<std::pair<T,U>>& vect
+ ) { (*this)(vect.begin(), vect.end(), vect.begin()); }
+ /*!
+ ensures
+ - performs in-place isotonic regression. Therefore, #vect will contain the
+ isotonic regression of vect.
+ - #vect.size() == vect.size()
+ !*/
+
+
+ template <
+ typename const_iterator,
+ typename iterator
+ >
+ void fit_with_linear_output_interpolation (
+ const_iterator begin,
+ const_iterator end,
+ iterator obegin
+ );
+ /*!
+ requires
+ - [begin,end) is an iterator range of float or doubles or a range of
+ std::pair<T,double> or std::pair<T,float> where T an be anything.
+ - obegin points to an iterator range at least std::distance(begin,end).
+ - obegin points to an iterator range of objects of type float, double, std::pair<T,float>, or std::pair<T,double>.
+ ensures
+ - This function behaves just like (*this)(begin,end,obegin) except that the
+ output is interpolated. To explain, not that the optimal output of
+ isotonic regression is a step function. However, in many applications
+ that isn't really what you want. You want something smoother. So
+ fit_with_linear_output_interpolation() does isotonic regression and then
+ linearly interpolates the step function into a piecewise linear function.
+ !*/
+
+ void fit_with_linear_output_interpolation (
+ std::vector<double>& vect
+ ) { fit_with_linear_output_interpolation(vect.begin(), vect.end(), vect.begin()); }
+ /*!
+ ensures
+ - performs in-place isotonic regression. Therefore, #vect will contain the
+ isotonic regression of vect.
+ - #vect.size() == vect.size()
+ !*/
+
+ template <typename T, typename U>
+ void fit_with_linear_output_interpolation (
+ std::vector<std::pair<T,U>>& vect
+ ) { fit_with_linear_output_interpolation(vect.begin(), vect.end(), vect.begin()); }
+ /*!
+ ensures
+ - performs in-place isotonic regression. Therefore, #vect will contain the
+ isotonic regression of vect.
+ - #vect.size() == vect.size()
+ !*/
+
+ };
+}
+
+#endif // DLIB_ISOTONIC_ReGRESSION_ABSTRACT_H_
+
+
+