1 //   OpenNN: Open Neural Networks Library
2 //   www.opennn.net
3 //
4 //   C O R R E L A T I O N S   H E A D E R
5 //
6 //   Artificial Intelligence Techniques SL
7 //   artelnics@artelnics.com
8 
9 #ifndef CORRELATIONS_H
10 #define CORRELATIONS_H
11 
12 // System includes
13 
14 #include <iostream>
15 #include <fstream>
16 #include <string>
17 #include <sstream>
18 #include <cmath>
19 #include <algorithm>
20 #include <cstdlib>
21 #include <stdexcept>
22 #include <ctime>
23 #include <exception>
24 
25 // OpenNN includes
26 
27 #include "statistics.h"
28 #include "config.h"
29 
30 
31 //using namespace std;
32 //using namespace Eigen;
33 
34 namespace OpenNN
35 {
36 
37 /// The enum RegressionMethod represents the different regression methods provided by OpenNN.
38 
39 enum RegressionMethod{Linear, Logistic, Logarithmic, Exponential, Power, KarlPearson, OneWayAnova};
40 
41 /// This structure provides the results obtained from the regression analysis.
42 
43 struct RegressionResults
44 {
RegressionResultsRegressionResults45     explicit RegressionResults() {}
46 
~RegressionResultsRegressionResults47     virtual ~RegressionResults() {}
48 
write_regression_typeRegressionResults49     string write_regression_type() const
50     {
51         switch(regression_type)
52         {
53             case Linear: return "linear";
54             case Logistic: return "logistic";
55             case Logarithmic: return "logarithmic";
56             case Exponential: return "exponential";
57             case Power: return "power";
58             case KarlPearson: return "KarlPearson";
59             case OneWayAnova: return "one-way-anova";
60         }
61     }
62 
63     /// Independent coefficient of the logistic function.
64 
65     type a = static_cast<type>(NAN);
66 
67     /// x coefficient of the logistic function.
68 
69     type b = static_cast<type>(NAN);
70 
71     /// Correlation coefficient of the  regression.
72 
73     type correlation =  static_cast<type>(NAN);
74 
75     /// Regression method type.
76 
77     RegressionMethod regression_type;
78 };
79 
80 
81 /// The enum CorrelationType represents the different correlations methods provided by OpenNN.
82 
83 enum CorrelationType{Linear_correlation, Logistic_correlation, Logarithmic_correlation, Exponential_correlation, Power_correlation, KarlPearson_correlation, OneWayAnova_correlation, Gauss_correlation};
84 
85 
86 /// This structure provides the results obtained from the correlations.
87 
88 struct CorrelationResults
89 {
CorrelationResultsCorrelationResults90     explicit CorrelationResults(){}
91 
~CorrelationResultsCorrelationResults92     virtual ~CorrelationResults() {}
93 
write_correlation_typeCorrelationResults94     string write_correlation_type() const
95     {
96         switch(correlation_type)
97         {
98             case Linear_correlation: return "Linear";
99             case Logistic_correlation: return "Logistic";
100             case Logarithmic_correlation: return "Logarithmic";
101             case Exponential_correlation: return "Exponential";
102             case Power_correlation: return "Power";
103             case KarlPearson_correlation: return "Karl-Pearson";
104             case OneWayAnova_correlation: return "One-way Anova";
105             case Gauss_correlation: return "Gauss";
106         }
107 
108         return "";
109     }
110 
111     /// Correlation coefficient.
112 
113     type correlation = static_cast<type>(NAN);
114 
115     /// Correlation type.
116 
117     CorrelationType correlation_type;
118 };
119     // Linear
120 
121     type linear_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&, const bool& = true);
122 
123     // Rank linear
124 
125     type rank_linear_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
126     type rank_linear_correlation_missing_values(const ThreadPoolDevice*, const Tensor<type, 1>&x, const Tensor<type, 1>&);
127 
128     // Exponential
129 
130     type exponential_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
131 
132     // Logarithmic
133 
134     type logarithmic_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
135 
136     // Rank Logistic
137 
138     type rank_logistic_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
139 
140     // Power
141 
142     type power_correlation(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
143 
144     // Karl Pearson
145 
146     type karl_pearson_correlation(const ThreadPoolDevice*, const Tensor<type,2>&, const Tensor<type,2>&);
147 
148     // Time series correlation methods
149 
150     Tensor<type, 1> autocorrelations(const Tensor<type, 1>&, const Index & = 10);
151     Tensor<type, 1> cross_correlations(const Tensor<type, 1>&, const Tensor<type, 1>&, const Index & = 10);
152 
153     // Logistic error methods
154 
155     type logistic(const type&, const type&, const type&);
156     Tensor<type, 1> logistic(const type&, const type&, const Tensor<type, 1>&);
157 
158     Tensor<type, 2> logistic(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 2>&, const Tensor<type, 2>&);
159 
160     type logistic_error(const type&, const type&, const Tensor<type, 1>&, const Tensor<type, 1>&);
161 
162     Tensor<type, 1> logistic_error_gradient(const type&, const type&, const Tensor<type, 1>&, const Tensor<type, 1>&);
163 
164     // Regression methods
165 
166     RegressionResults linear_regression(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&, const bool& = true);
167 
168     RegressionResults logarithmic_regression(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
169 
170     RegressionResults exponential_regression(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
171 
172     RegressionResults power_regression(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
173 
174     RegressionResults logistic_regression(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
175 
176     // Correlation methods
177 
178     CorrelationResults linear_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
179 
180     CorrelationResults logarithmic_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
181 
182     CorrelationResults exponential_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
183 
184     CorrelationResults power_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
185 
186     CorrelationResults logistic_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
187 
188     CorrelationResults multiple_logistic_correlations(const ThreadPoolDevice*, const Tensor<type, 2>&, const Tensor<type, 2>&);
189 
190     CorrelationResults karl_pearson_correlations(const ThreadPoolDevice*, const Tensor<type, 2>&, const Tensor<type, 2>&);
191 
192     CorrelationResults gauss_correlations(const ThreadPoolDevice*, const Tensor<type, 1>&, const Tensor<type, 1>&);
193 
194     // Covariance
195 
196     type covariance(const Tensor<type, 1>&, const Tensor<type, 1>&);
197     type covariance_missing_values(const Tensor<type, 1>&, const Tensor<type, 1>&);
198 
199     Tensor<type, 2> covariance_matrix(const Tensor<type, 2>&);
200 
201     Tensor<type, 1> less_rank_with_ties(const Tensor<type, 1>&);
202 
203     // Contingency tables
204 
205     Tensor<Index, 2> contingency_table(const Tensor<string, 1>&, const Tensor<string, 1>&);
206     Tensor<Index, 2> contingency_table(Tensor<string, 2>&);
207     Tensor<Index, 2> contingency_table(const Tensor<type, 2>&, const Tensor<Index, 1>&, const Tensor<Index, 1>&);
208 
209     type chi_square_test(const Tensor<type, 2>&);
210 
211     type chi_square_critical_point(const type&, const type&);
212 
213 
214     // Missing values methods
215 
216     pair<Tensor<type, 1>, Tensor<type, 1>> filter_missing_values(const Tensor<type, 1>&, const Tensor<type, 1>&);
217     pair<Tensor<type, 2>, Tensor<type, 2>> filter_missing_values(const Tensor<type, 2>&, const Tensor<type, 2>&);
218 
219     Index count_NAN(const Tensor<type, 1>&);
220 
221     // Other methods
222 
223     Tensor<type, 1> scale_minimum_maximum(const Tensor<type, 1>&);
224     Tensor<type, 2> scale_minimum_maximum(const Tensor<type, 2>&);
225 
226     vector<int> get_indices_sorted(Tensor<type, 1>&);
227 }
228 
229 
230 #endif
231 
232 
233 // OpenNN: Open Neural Networks Library.
234 // Copyright(C) 2005-2020 Artificial Intelligence Techniques, SL.
235 //
236 // This library is free software; you can redistribute it and/or
237 // modify it under the terms of the GNU Lesser General Public
238 // License as published by the Free Software Foundation; either
239 // version 2.1 of the License, or any later version.
240 //
241 // This library is distributed in the hope that it will be useful,
242 // but WITHOUT ANY WARRANTY; without even the implied warranty of
243 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
244 // Lesser General Public License for more details.
245 
246 // You should have received a copy of the GNU Lesser General Public
247 // License along with this library; if not, write to the Free Software
248 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
249