00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SCALING_H_
00019 #define SCALING_H_
00020
00021 #include "shared_ptr.h"
00022
00023 #include <valarray>
00024 #include <iostream>
00025 #include <string>
00026
00027 class TargetInfo;
00028
00029 class ScalingBase {
00030 public:
00031
00032 virtual ~ScalingBase() {}
00033
00034 std::valarray<double> apply(const std::valarray<double>& x) {
00035 std::valarray<double> xtmp = x;
00036 transform(xtmp);
00037 return xtmp;
00038 }
00039
00040 virtual double transform(double input) const = 0;
00041 virtual void transform(std::valarray<double>& inputs) const = 0;
00042 virtual std::ostream& print(std::ostream& os, std::string str) const = 0;
00043 virtual std::valarray<double> transform(const std::valarray<double>& inputs) const = 0;
00044 };
00045
00046 typedef shared_ptr<ScalingBase> Scaling;
00047
00048 class LinearScaling : public ScalingBase {
00049
00050 double a,b;
00051
00052 public:
00053 LinearScaling() : a(0.0), b(1.0) {}
00054 LinearScaling(double _a, double _b) : a(_a), b(_b) {}
00055
00056 double transform(double input) const { input *=b; input += a; return input; }
00057 void transform(std::valarray<double>& inputs) const { inputs *= b; inputs += a; }
00058 std::valarray<double> transform(const std::valarray<double>& inputs) const {
00059 std::valarray<double> y = a + b * inputs;
00060 return y;
00061 }
00062
00063 double intercept() const { return a; }
00064 double slope() const { return b; }
00065
00066 std::ostream& print(std::ostream& os, std::string str) const {
00067 os.precision(16);
00068 os << a << " + " << b << " * " << str;
00069 return os;
00070 }
00071 };
00072
00073 class NoScaling : public ScalingBase{
00074 void transform(std::valarray<double>&) const {}
00075 double transform(double input) const { return input; }
00076 std::valarray<double> transform(const std::valarray<double>& inputs) const { return inputs; }
00077 std::ostream& print(std::ostream& os, std::string str) const { return os << str; }
00078 };
00079
00080 extern Scaling slope(const std::valarray<double>& inputs, const TargetInfo& targets);
00081 extern Scaling ols(const std::valarray<double>& inputs, const TargetInfo& targets);
00082 extern Scaling wls(const std::valarray<double>& inputs, const TargetInfo& targets);
00083 extern Scaling med(const std::valarray<double>& inputs, const TargetInfo& targets);
00084
00085 extern Scaling ols(const std::valarray<double>& inputs, const std::valarray<double>& outputs);
00086
00087 extern double mse(const std::valarray<double>& y, const TargetInfo& t);
00088 extern double rms(const std::valarray<double>& y, const TargetInfo& t);
00089 extern double mae(const std::valarray<double>& y, const TargetInfo& t);
00090
00091
00092
00093 #endif
00094
00095