Loading...
Searching...
No Matches
statistics.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
7
8namespace opennn
9{
10
12{
13 Descriptives(const float = QUIET_NAN, float = QUIET_NAN, float = QUIET_NAN, float = QUIET_NAN);
14
15 void set(const float = QUIET_NAN, float = QUIET_NAN, float = QUIET_NAN, float = QUIET_NAN);
16
17 float minimum;
18
19 float maximum;
20
21 float mean;
22
24
25};
26
27inline VectorR descriptives_field(const vector<Descriptives>& descriptives,
28 float Descriptives::* member)
29{
30 VectorR values(ssize(descriptives));
31 for (Index i = 0; i < values.size(); ++i)
32 values(i) = descriptives[size_t(i)].*member;
33 return values;
34}
35
36struct BoxPlot
37{
38 BoxPlot(const float = QUIET_NAN,
39 float = QUIET_NAN,
40 float = QUIET_NAN,
41 float = QUIET_NAN,
42 float = QUIET_NAN);
43
45
47
49
51
53};
54
56{
57 Histogram(const Index = 0);
58
60
62
64
66
68 {
69 return frequencies.size() == 0 ? Index(0) : Index(frequencies.minCoeff());
70 }
71
73 {
74 return frequencies.size() == 0 ? Index(0) : Index(frequencies.maxCoeff());
75 }
76
78 {
79 return centers_with_frequency(calculate_minimum_frequency());
80 }
81
83 {
84 return centers_with_frequency(calculate_maximum_frequency());
85 }
86
87private:
88
89 VectorR centers_with_frequency(Index frequency) const
90 {
91 const Index bins_number = frequencies.size();
92
93 Index matches_number = 0;
94
95 for (Index j = 0; j < bins_number; ++j)
96 if (Index(frequencies(j)) == frequency)
97 ++matches_number;
98
99 VectorR selected_centers(matches_number);
100
101 Index position = 0;
102
103 for (Index j = 0; j < bins_number; ++j)
104 if (Index(frequencies(j)) == frequency)
105 selected_centers(position++) = centers.size() > j ? centers(j) : float(j);
106
107 return selected_centers;
108 }
109};
110float minimum(const MatrixR&);
111float minimum(const VectorR&);
112float minimum(const VectorR&, const vector<Index>&);
113float maximum(const MatrixR&);
114float maximum(const VectorR&);
115float maximum(const VectorR&, const vector<Index>&);
116float mean(const VectorR&);
117float mean(const MatrixR&, Index);
119VectorR mean(const MatrixR&, const vector<Index>&, const vector<Index>&);
120float median(const VectorR&);
121float median(const MatrixR&, Index);
122VectorR median(const MatrixR&, const vector<Index>&, const vector<Index>&);
123float variance(const VectorR&);
124float variance(const VectorR&, const VectorI&);
127VectorR quartiles(const VectorR&, const vector<Index>&);
129BoxPlot box_plot(const VectorR&, const vector<Index>&);
131vector<Descriptives> descriptives(const MatrixR&);
132vector<Descriptives> descriptives(const MatrixR&, const vector<Index>&, const vector<Index>&);
133Histogram histogram(const VectorR&, Index = 10);
134Histogram histogram_centered(const VectorR&, float = 0.0f, Index = 10);
135vector<Histogram> histograms(const MatrixR&, Index = 10);
136Index minimal_index(const VectorR&);
137Index maximal_index(const VectorR&);
140inline bool row_finite(const VectorR& values, Index i) { return isfinite(values(i)); }
141inline bool row_finite(const MatrixR& matrix, Index i) { return matrix.row(i).array().isFinite().all(); }
142
144
145template<typename InputType, typename TargetType>
146pair<InputType, TargetType> filter_missing_values(const InputType& x, const TargetType& y)
147{
148 throw_if(x.rows() != y.rows(),
149 "filter_missing_values: row count mismatch");
150
151 vector<Index> valid;
152 valid.reserve(x.rows());
153
154 for (Index i = 0; i < x.rows(); ++i)
155 if (row_finite(x, i) && row_finite(y, i))
156 valid.push_back(i);
157
158 return {x(valid, Eigen::placeholders::all), y(valid, Eigen::placeholders::all)};
159}
160
161template <typename T>
162inline bool is_binary(const T& tensor)
163{
164 return all_of(tensor.data(), tensor.data() + tensor.size(),
165 [](float value) { return value == 0.0f || value == 1.0f || isnan(value); });
166}
167
168template <typename T>
169inline bool is_constant(const T& tensor)
170{
171 const float* data = tensor.data();
172 const float* end = data + tensor.size();
173
174 const float* first = find_if(data, end, [](float value) { return !isnan(value); });
175
176 if (first == end)
177 return true;
178
179 const float reference_value = *first;
180
181 return all_of(first + 1, end,
182 [reference_value](float value) { return isnan(value) || abs(reference_value - value) <= numeric_limits<float>::min(); });
183}
184
185VectorI calculate_rank(const VectorR&, bool ascending = true);
186
187vector<Index> ranked_indices(const VectorR&);
188
189VectorR minmax_score(const VectorR&, bool invert = false);
191
192vector<Index> extreme_indices(const MatrixR&);
193
194vector<VectorI> nearest_neighbors(const MatrixR&, Index);
197
198void farthest_point_fill(const MatrixR& distances, vector<Index>& selection, Index quota);
199
200}
Definition configuration.h:10
bool is_constant(const T &tensor)
Definition statistics.h:169
bool is_binary(const T &tensor)
Definition statistics.h:162
Index minimal_index(const VectorR &)
float mean(const VectorR &)
VectorR filter_missing_values(const VectorR &)
BoxPlot box_plot(const VectorR &)
Index maximal_index(const VectorR &)
float variance(const VectorR &)
void farthest_point_fill(const MatrixR &distances, vector< Index > &selection, Index quota)
Histogram histogram(const VectorR &, Index=10)
vector< Index > extreme_indices(const MatrixR &)
float maximum(const MatrixR &)
VectorR local_outlier_factor(const MatrixR &, Index)
VectorR minmax_score(const VectorR &, bool invert=false)
vector< Index > ranked_indices(const VectorR &)
vector< Descriptives > descriptives(const MatrixR &)
float median(const VectorR &)
float minimum(const MatrixR &)
constexpr float QUIET_NAN
Definition opennn_types.h:312
VectorI maximal_indices(const VectorR &, Index)
Descriptives vector_descriptives(const VectorR &)
vector< VectorI > nearest_neighbors(const MatrixR &, Index)
bool row_finite(const VectorR &values, Index i)
Definition statistics.h:140
float standard_deviation(const VectorR &)
VectorR neighbor_distances(const MatrixR &, Index)
VectorI calculate_rank(const VectorR &, bool ascending=true)
Histogram histogram_centered(const VectorR &, float=0.0f, Index=10)
vector< Histogram > histograms(const MatrixR &, Index=10)
VectorR quartiles(const VectorR &)
VectorR descriptives_field(const vector< Descriptives > &descriptives, float Descriptives::*member)
Definition statistics.h:27
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixR
Definition opennn_types.h:331
Eigen::Matrix< Index, Eigen::Dynamic, 1 > VectorI
Definition opennn_types.h:336
#define throw_if(condition,...)
Definition opennn_types.h:243
Definition statistics.h:37
float first_quartile
Definition statistics.h:46
float median
Definition statistics.h:48
BoxPlot(const float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN)
float third_quartile
Definition statistics.h:50
float minimum
Definition statistics.h:44
float maximum
Definition statistics.h:52
Definition statistics.h:12
Descriptives(const float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN)
void set(const float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN, float=QUIET_NAN)
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 statistics.h:56
VectorR frequencies
Definition statistics.h:65
VectorR calculate_maximal_centers() const
Definition statistics.h:82
VectorR calculate_minimal_centers() const
Definition statistics.h:77
VectorR maximums
Definition statistics.h:61
Index calculate_minimum_frequency() const
Definition statistics.h:67
Index calculate_maximum_frequency() const
Definition statistics.h:72
VectorR minimums
Definition statistics.h:59
VectorR centers
Definition statistics.h:63
Histogram(const Index=0)