aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_analyze.c
diff options
context:
space:
mode:
authorLuca Deri <deri@ntop.org>2023-12-27 22:42:37 +0100
committerLuca Deri <deri@ntop.org>2023-12-27 22:42:37 +0100
commit1366518bff88210008159cc385f092bd5cfc6252 (patch)
tree2a4db00c945c178a5636fb39d6d0e6fc0ea30727 /src/lib/ndpi_analyze.c
parent99d48383286fbb865ab58db5e5f768d8ed14f41e (diff)
Implements ndpi_pearson_correlation for measuring how correlated are two series
Diffstat (limited to 'src/lib/ndpi_analyze.c')
-rw-r--r--src/lib/ndpi_analyze.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lib/ndpi_analyze.c b/src/lib/ndpi_analyze.c
index bb0b74fd4..7a2fd495c 100644
--- a/src/lib/ndpi_analyze.c
+++ b/src/lib/ndpi_analyze.c
@@ -66,6 +66,20 @@ struct ndpi_analyze_struct* ndpi_alloc_data_analysis(u_int16_t _max_series_len)
/* ********************************************************************************* */
+struct ndpi_analyze_struct* ndpi_alloc_data_analysis_from_series(const u_int32_t *values, u_int16_t num_values) {
+ u_int16_t i;
+ struct ndpi_analyze_struct *ret = ndpi_alloc_data_analysis(num_values);
+
+ if(ret == NULL) return(NULL);
+
+ for(i=0; i<num_values; i++)
+ ndpi_data_add_value(ret, (const u_int64_t)values[i]);
+
+ return(ret);
+}
+
+/* ********************************************************************************* */
+
void ndpi_free_data_analysis(struct ndpi_analyze_struct *d, u_int8_t free_pointer) {
if(d && d->values) ndpi_free(d->values);
if(free_pointer) ndpi_free(d);
@@ -1670,6 +1684,31 @@ int ndpi_predict_linear(u_int32_t *values, u_int32_t num_values,
/* ********************************************************************************* */
+double ndpi_pearson_correlation(u_int32_t *values_a, u_int32_t *values_b, u_int16_t num_values) {
+ double sum_a = 0, sum_b = 0, sum_squared_diff_a = 0, sum_squared_diff_b = 0, sum_product_diff = 0;
+ u_int16_t i;
+ double mean_a, mean_b, variance_a, variance_b, covariance;
+
+ if(num_values == 0) return(0.0);
+
+ for(i = 0; i < num_values; i++)
+ sum_a += values_a[i], sum_b += values_b[i];
+
+ mean_a = sum_a / num_values, mean_b = sum_b / num_values;
+
+ for(i = 0; i < num_values; i++)
+ sum_squared_diff_a += pow(values_a[i] - mean_a, 2),
+ sum_squared_diff_b += pow(values_b[i] - mean_b, 2),
+ sum_product_diff += (values_a[i] - mean_a) * (values_b[i] - mean_b);
+
+ variance_a = sum_squared_diff_a / (double)num_values, variance_b = sum_squared_diff_b / (double)num_values;
+ covariance = sum_product_diff / (double)num_values;
+
+ return(covariance / sqrt(variance_a * variance_b));
+}
+
+/* ********************************************************************************* */
+
static const u_int16_t crc16_ccitt_table[256] = {
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,