diff options
| author | zhuzhenjun <[email protected]> | 2023-10-17 23:37:20 +0800 |
|---|---|---|
| committer | zhuzhenjun <[email protected]> | 2023-10-17 23:37:20 +0800 |
| commit | 1de666a56e3d275de0525b77eb97d30e7719430b (patch) | |
| tree | cdfbd8447a936ccb0c71ceaf24d174f8bece4b07 | |
| parent | 168f931da6704d5918f6f00fd2551eff0bf07b8e (diff) | |
test: print confusion matrixv1.3.1
| -rw-r--r-- | test/test.c | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/test/test.c b/test/test.c index f4e4846..bdce05b 100644 --- a/test/test.c +++ b/test/test.c @@ -18,6 +18,9 @@ #define TEST_FILE_PATH "./test.json" #define LOG_FILE_PATH "./osfp_test.log" +#define OSFP_OS_CLASS_MERGED_MAX (OSFP_OS_CLASS_MAX - 2) +#define EntryWidth 8 + unsigned char *data_file_path = DATA_FILE_PATH; unsigned char *db_file_path; unsigned char *test_file_path; @@ -29,6 +32,101 @@ FILE *log_file_ptr; unsigned int debug_enable; +//enum osfp_os_class_id { +// OSFP_OS_CLASS_UNKNOWN, // 未知 +// OSFP_OS_CLASS_WINDOWS, // Windows +// OSFP_OS_CLASS_LINUX, // Linux +// OSFP_OS_CLASS_MAC_OS, // Mac OS +// OSFP_OS_CLASS_IOS, // iOS +// OSFP_OS_CLASS_ANDROID, // Android +// OSFP_OS_CLASS_OTHERS, // 其他 +// OSFP_OS_CLASS_MAX, +//}; +// merged classes: unknown 0 windows-like 1 unix-like 2 apple-like 3 others 4 + +unsigned int testresult[OSFP_OS_CLASS_MAX][OSFP_OS_CLASS_MAX] = {0}; +unsigned int testresult_merged[OSFP_OS_CLASS_MERGED_MAX][OSFP_OS_CLASS_MERGED_MAX] = {0}; + +static const char *class_to_merged_name(unsigned int class) +{ + switch (class) { + case 0: + return "Unknown"; + case 1: + return "Windows-Like"; + case 2: + return "Unix-Like"; + case 3: + return "Apple-Like"; + case 4: + return "Others"; + } + return NULL; +} +static unsigned int class_to_merged_class(unsigned int class) +{ + switch (class) { + case OSFP_OS_CLASS_UNKNOWN: + return 0; + case OSFP_OS_CLASS_WINDOWS: + return 1; + case OSFP_OS_CLASS_LINUX: + return 2; + case OSFP_OS_CLASS_MAC_OS: + return 3; + case OSFP_OS_CLASS_IOS: + return 3; + case OSFP_OS_CLASS_ANDROID: + return 2; + case OSFP_OS_CLASS_OTHERS: + return 4; + } + return 0; +} + +static void testresult_class_merge() +{ + int i,j; + for (i = 0; i < OSFP_OS_CLASS_MAX; i++) { + for (j = 0; j < OSFP_OS_CLASS_MAX; j++) { + testresult_merged[class_to_merged_class(i)][class_to_merged_class(j)] += testresult[i][j]; + } + } +} + +static void print_confusion_matrix(unsigned int *result, unsigned int os_class_max, const char *(*get_name)(unsigned int)) +{ + int i,j; + int matched = 0, missed = 0; + + for (i = 0; i < os_class_max; i++) { + printf("%*s(%c)", EntryWidth-3, " ", 'a' + i); + } + printf(" <-" " classified as" "\n"); + + for (i = 0; i < os_class_max; i++) { + printf("%*.*s", EntryWidth, EntryWidth-2, "----------"); + } + + printf("\n"); + + + for (i = 0; i < os_class_max; i++) { + for (j = 0; j < os_class_max; j++) { + if (i == j) { + matched += *(result + os_class_max * i + j); + } else { + missed += *(result + os_class_max * i + j); + } + printf(" %*d", EntryWidth-1, *(result + os_class_max * i + j)); + } + printf(" (%c): " "class" " %s\n", 'a' + i, get_name(i)); + } + + printf("miss rate: %u%%\n", 100 * missed / (matched + missed)); +} + + void test_data_prepare() { char *file_buffer; @@ -129,6 +227,8 @@ void test_miss_rate() continue; } + testresult[result->likely_os_class][os_class]++; + if (os_class == result->likely_os_class) { verified_count++; osfp_result_free(result); @@ -161,7 +261,13 @@ void test_miss_rate() printf("total %u, failed %u, pass %u, wrong %u, other %u, unknown %u\n", fingerprint_count, identify_failed_count, verified_count, wrong_count, other_count, unknown_count); - printf("miss rate: %d%%\n", 100 - (verified_count * 100 / fingerprint_count)); + //printf("miss rate: %d%%\n", 100 - (verified_count * 100 / fingerprint_count)); + + testresult_class_merge(); + + print_confusion_matrix((unsigned int *)testresult, OSFP_OS_CLASS_MAX, osfp_os_class_id_to_name); + + print_confusion_matrix((unsigned int *)testresult_merged, OSFP_OS_CLASS_MERGED_MAX, class_to_merged_name); printf("details in: %s\n", LOG_FILE_PATH); |
