Loading...
Searching...
No Matches
scaling.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
8
9namespace opennn
10{
12 {
13 vector<Descriptives> descriptives;
14 vector<ScalerMethod> scalers;
15 float min_range = -1.0f;
16 float max_range = 1.0f;
17
18 Index size() const noexcept
19 {
20 return ssize(descriptives);
21 }
22 };
23
25 {
26 public:
27 virtual ~FeatureScalingEndpoint() = default;
28
29 virtual VariableRole get_scaling_role() const noexcept = 0;
31 virtual void set_feature_scaling(const FeatureScaling&) = 0;
32 };
33
34 template<typename X>
35 auto scale_minimum_maximum_formula(const X& x, const Descriptives& d, float min_range, float max_range)
36 {
37 return (x - d.minimum) / (d.maximum - d.minimum) * (max_range - min_range) + min_range;
38 }
39
40 template<typename X>
42 {
43 return (x - d.mean) / d.standard_deviation;
44 }
45
46 template<typename X>
47 auto unscale_minimum_maximum_formula(const X& x, const Descriptives& d, float min_range, float max_range)
48 {
49 return (x - min_range) / (max_range - min_range) * (d.maximum - d.minimum) + d.minimum;
50 }
51
52 template<typename X>
54 {
55 return d.mean + x * d.standard_deviation;
56 }
57
58 inline float scale_value(ScalerMethod method, const Descriptives& desc, float value,
59 float min_range = -1.0f, float max_range = 1.0f)
60 {
61 using enum ScalerMethod;
62 switch (method)
63 {
64 case None:
65 return value;
66 case ImageMinMax:
67 return value / 255.0f;
68 case MinimumMaximum:
69 return desc.maximum - desc.minimum < EPSILON
70 ? 0.0f
71 : scale_minimum_maximum_formula(value, desc, min_range, max_range);
73 return desc.standard_deviation > EPSILON ? scale_mean_standard_deviation_formula(value, desc) : 0.0f;
75 return desc.standard_deviation > EPSILON ? value / desc.standard_deviation : 0.0f;
76 case Logarithm:
77 return log(max(value, EPSILON));
78 }
79
80 return value;
81 }
82
83 struct AffineMap
84 {
85 float slope = 1.0f;
86 float offset = 0.0f;
87 };
88
91 float min_range,
92 float max_range)
93 {
94 using enum ScalerMethod;
95 switch (scaler)
96 {
97 case MinimumMaximum:
98 {
99 const float range = descriptives.maximum - descriptives.minimum;
100 if (range < EPSILON) return {0.0f, 0.0f};
101
102 const float scale = (max_range - min_range) / range;
103 return {scale, min_range - descriptives.minimum * scale};
104 }
106 {
107 if (descriptives.standard_deviation <= EPSILON) return {0.0f, 0.0f};
108
109 const float scale = 1.0f / descriptives.standard_deviation;
110 return {scale, -descriptives.mean * scale};
111 }
113 if (descriptives.standard_deviation <= EPSILON) return {0.0f, 0.0f};
114 return {1.0f / descriptives.standard_deviation, 0.0f};
115 case ImageMinMax:
116 return {1.0f / 255.0f, 0.0f};
117 case None:
118 case Logarithm:
119 return {1.0f, 0.0f};
120 }
121
122 throw runtime_error("scaling_affine: invalid scaler method.");
123 }
124
127 float min_range,
128 float max_range)
129 {
130 using enum ScalerMethod;
131 switch (scaler)
132 {
133 case MinimumMaximum:
134 {
135 const float range = descriptives.maximum - descriptives.minimum;
136 if (range < EPSILON) return {0.0f, descriptives.minimum};
137
138 const float scale = range / (max_range - min_range);
139 return {scale, descriptives.minimum - min_range * scale};
140 }
142 return {descriptives.standard_deviation, descriptives.mean};
144 if (descriptives.standard_deviation < EPSILON) return {0.0f, descriptives.mean};
145 return {descriptives.standard_deviation, 0.0f};
146 case ImageMinMax:
147 return {255.0f, 0.0f};
148 case None:
149 case Logarithm:
150 return {1.0f, 0.0f};
151 }
152
153 throw runtime_error("unscaling_affine: invalid scaler method.");
154 }
155
156}
Definition scaling.h:25
virtual void set_feature_scaling(const FeatureScaling &)=0
virtual FeatureScaling get_feature_scaling() const =0
virtual ~FeatureScalingEndpoint()=default
virtual VariableRole get_scaling_role() const noexcept=0
Definition configuration.h:10
AffineMap unscaling_affine(ScalerMethod scaler, const Descriptives &descriptives, float min_range, float max_range)
Definition scaling.h:125
constexpr float EPSILON
Definition opennn_types.h:308
AffineMap scaling_affine(ScalerMethod scaler, const Descriptives &descriptives, float min_range, float max_range)
Definition scaling.h:89
VariableRole
Definition variable.h:72
ScalerMethod
Definition variable.h:39
@ MeanStandardDeviation
Definition variable.h:42
@ Logarithm
Definition variable.h:44
@ StandardDeviation
Definition variable.h:43
@ MinimumMaximum
Definition variable.h:41
@ ImageMinMax
Definition variable.h:45
vector< Descriptives > descriptives(const MatrixR &)
auto scale_mean_standard_deviation_formula(const X &x, const Descriptives &d)
Definition scaling.h:41
auto scale_minimum_maximum_formula(const X &x, const Descriptives &d, float min_range, float max_range)
Definition scaling.h:35
float scale_value(ScalerMethod method, const Descriptives &desc, float value, float min_range=-1.0f, float max_range=1.0f)
Definition scaling.h:58
auto unscale_mean_standard_deviation_formula(const X &x, const Descriptives &d)
Definition scaling.h:53
void scale(const TensorView &, const TensorView &, const TensorView &, const TensorView &, const TensorView &, const TensorView &, float, float, TensorView &)
@ None
Definition variable.h:12
auto unscale_minimum_maximum_formula(const X &x, const Descriptives &d, float min_range, float max_range)
Definition scaling.h:47
Definition scaling.h:84
float offset
Definition scaling.h:86
float slope
Definition scaling.h:85
Definition statistics.h:12
float minimum
Definition statistics.h:17
float mean
Definition statistics.h:21
float standard_deviation
Definition statistics.h:23
float maximum
Definition statistics.h:19
Definition scaling.h:12
float min_range
Definition scaling.h:15
vector< Descriptives > descriptives
Definition scaling.h:13
float max_range
Definition scaling.h:16
vector< ScalerMethod > scalers
Definition scaling.h:14
Index size() const noexcept
Definition scaling.h:18