From a6e2f4a15a52087ff3f2fa16bb990c998c5215a6 Mon Sep 17 00:00:00 2001 From: Luca Deri Date: Mon, 4 Apr 2022 10:02:45 +0200 Subject: Added ndpi_find_outliers() API call using Z-Score --- example/ndpiReader.c | 19 +++++++++++++++++++ src/include/ndpi_api.h.in | 15 +++++++++++++++ src/lib/ndpi_analyze.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/example/ndpiReader.c b/example/ndpiReader.c index b957989e2..2b02a75db 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -5398,6 +5398,24 @@ void compressedBitmapUnitTest() { /* *********************************************** */ +void zscoreUnitTest() { + u_int32_t values[] = { 1, 3, 3, 4, 5, 2, 6, 7, 30, 16 }; + u_int32_t i; + u_int32_t num_outliers, num = sizeof(values) / sizeof(u_int32_t); + bool outliers[num], do_trace = false; + + num_outliers = ndpi_find_outliers(values, outliers, num); + + if(do_trace) { + printf("outliers: %u\n", num_outliers); + + for(i=0; inum_values_array_len) { @@ -1425,3 +1435,35 @@ void ndpi_des_fitting(double *values, u_int32_t num_values, float *ret_alpha, fl *ret_alpha = best_alpha, *ret_beta = best_beta; } + +/* *********************************************************** */ + +/* Z-Score = (Value - Mean) / StdDev */ +u_int ndpi_find_outliers(u_int32_t *values, bool *outliers, u_int32_t num_values) { + u_int i, ret = 0; + float mean, stddev, low_threshold = -2.5, high_threshold = 2.5; + struct ndpi_analyze_struct a; + + ndpi_init_data_analysis(&a, 3 /* this is the window so we do not need to store values and 3 is enough */); + + /* Add values */ + for(i=0; i high_threshold)) ? true : false; + + if(is_outlier) ret++; + outliers[i] = is_outlier; + } + + ndpi_free_data_analysis(&a, 0); + + return(ret); +} + -- cgit v1.2.3