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