summaryrefslogtreecommitdiffstats
path: root/src/classifiers
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2010-08-03 20:37:49 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2010-08-03 20:37:49 +0400
commit4680a3fb136ade8bb3a38f0a7837fa0cfe5466c3 (patch)
tree081b2e576d94aa30a33b48521b131eec120df1c2 /src/classifiers
parent83b9ccb751758c4d6a8f11c769e641ec3a7c670a (diff)
downloadrspamd-4680a3fb136ade8bb3a38f0a7837fa0cfe5466c3.tar.gz
rspamd-4680a3fb136ade8bb3a38f0a7837fa0cfe5466c3.zip
* Fix some logic errors in learning
Diffstat (limited to 'src/classifiers')
-rw-r--r--src/classifiers/winnow.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/classifiers/winnow.c b/src/classifiers/winnow.c
index 481d3717d..41cb48e89 100644
--- a/src/classifiers/winnow.c
+++ b/src/classifiers/winnow.c
@@ -75,6 +75,9 @@ classify_callback (gpointer key, gpointer value, gpointer data)
cd->sum += v;
cd->in_class++;
}
+ else {
+ cd->sum += 1.0;
+ }
cd->count++;
@@ -88,8 +91,7 @@ learn_callback (gpointer key, gpointer value, gpointer data)
struct winnow_callback_data *cd = data;
double v, c;
- c = (cd->in_class) ? WINNOW_PROMOTION : WINNOW_DEMOTION;
- c *= cd->multiplier;
+ c = (cd->in_class) ? WINNOW_PROMOTION * cd->multiplier : WINNOW_DEMOTION / cd->multiplier;
/* Consider that not found blocks have value 1 */
v = statfile_pool_get_block (cd->pool, cd->file, node->h1, node->h2, cd->now);
@@ -120,7 +122,7 @@ learn_callback (gpointer key, gpointer value, gpointer data)
statfile_pool_set_block (cd->pool, cd->file, node->h1, node->h2, cd->now, 0.);
node->value = 0.;
}
- else if (node->value > WINNOW_PROMOTION) {
+ else if (node->value > WINNOW_PROMOTION * cd->multiplier) {
/* Try to decrease its value */
/* XXX: it is more intelligent to add some adaptive filter here */
if (cd->file == cd->learn_file) {
@@ -133,11 +135,11 @@ learn_callback (gpointer key, gpointer value, gpointer data)
* statfiles, may be statistic error, so decrease it
* slightly
*/
- node->value *= WINNOW_DEMOTION * cd->multiplier;
+ node->value *= WINNOW_DEMOTION;
}
}
else {
- node->value = sqrt (node->value);
+ node->value = WINNOW_DEMOTION / cd->multiplier;
}
statfile_pool_set_block (cd->pool, cd->file, node->h1, node->h2, cd->now, node->value);
}
@@ -155,7 +157,7 @@ learn_callback (gpointer key, gpointer value, gpointer data)
}
else if (cd->do_demote) {
/* Demote blocks in file */
- node->value *= WINNOW_DEMOTION * cd->multiplier;
+ node->value *= WINNOW_DEMOTION / cd->multiplier;
statfile_pool_set_block (cd->pool, cd->file, node->h1, node->h2, cd->now, node->value);
}
}