]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Normalize bayes scores
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Dec 2015 14:52:49 +0000 (14:52 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Dec 2015 14:52:49 +0000 (14:52 +0000)
src/libstat/classifiers/bayes.c

index 3d16c05ebfb7eefb389c54a4a147211463592946..180aa465855d0d1d6e3005188916a5e4cbaf53f1 100644 (file)
@@ -169,6 +169,28 @@ bayes_classify_callback (gpointer key, gpointer value, gpointer data)
        return FALSE;
 }
 
+/*
+ * A(x - 0.5)^4 + B(x - 0.5)^3 + C(x - 0.5)^2 + D(x - 0.5)
+ * A = 32,
+ * B = -6
+ * C = -7
+ * D = 3
+ * y = 32(x - 0.5)^4 - 6(x - 0.5)^3 - 7(x - 0.5)^2 + 3(x - 0.5)
+ */
+static gdouble
+bayes_normalize_prob (gdouble x)
+{
+       const gdouble a = 32, b = -6, c = -7, d = 3;
+       gdouble xx, x2, x3, x4;
+
+       xx = x - 0.5;
+       x2 = xx * xx;
+       x3 = x2 * xx;
+       x4 = x3 * xx;
+
+       return a*x4 + b*x3 + c*x2 + d*xx;
+}
+
 struct classifier_ctx *
 bayes_init (rspamd_mempool_t *pool, struct rspamd_classifier_config *cfg)
 {
@@ -269,6 +291,8 @@ bayes_classify (struct classifier_ctx * ctx,
                                }
 
                                rspamd_snprintf (sumbuf, 32, "%.2f%%", final_prob * 100.);
+                               final_prob = bayes_normalize_prob (final_prob);
+
                                cur = g_list_prepend (NULL, sumbuf);
                                rspamd_task_insert_result (task,
                                                selected_st->st->symbol,