📄 winnow.c
字号:
/* Copyright (C) 2001-2002 Mikael Ylikoski * See the accompanying file "README" for the full copyright notice *//** * @file * Winnow learning algorithm. * * @author Mikael Ylikoski * @date 2001-2002 */#include <math.h>#include <stdlib.h>#include "multi.h"#include "utility.h"#include "vector.h"#include "winnow.h"/** * Winnow global data */typedef struct { float a; /**< Promotion rate a > 1 */ float b; /**< Demotion rate 0 < b < 1*/ float f; /**< Bias term */} winnow_db;/** * Winnow class */typedef struct { vector *w; /**< Weight vector */} winnow_class;void *winnow_new_db (const char *opts) { winnow_db *wdb; wdb = my_malloc (sizeof(winnow_class)); wdb->a = 2; wdb->b = wdb->a; wdb->f = 10; return wdb;}void *winnow_new_class (void) { winnow_class *wc; wc = my_malloc (sizeof(winnow_class)); wc->w = vector_new (10); if (!wc->w) { free (wc); return NULL; } return wc;}void *winnow_copy (void *class) { winnow_class *wc; winnow_class *nc; wc = (winnow_class *)class; nc = my_malloc (sizeof(winnow_class)); nc->w = vector_copy (wc->w); if (!nc->w) { free (nc); return NULL; } return nc;}/** * Free memory used by winnow class. */voidwinnow_free (void *class) { winnow_class *wc; wc = (winnow_class *)class; vector_free (wc->w); free (wc);}/** * Winnow classifier function. */doublewinnow_classify (void *db, void *data, vector *v) { winnow_class *wc; winnow_db *wdb; wc = (winnow_class *)data; wdb = (winnow_db *)db; return vector_dot_product_nonzero (wc->w, v, 1) - wdb->f;}/** * Winnow learning function. */intwinnow_learn (void *db, void *data, vector *v, int class) { double d; winnow_class *wc; winnow_db *wdb; wc = (winnow_class *)data; wdb = (winnow_db *)db; d = (class + 1) * 0.5 - winnow_classify (db, data, v); //printf (":: %f ", d); if (class > 0) d = pow (wdb->a, d); else d = pow (wdb->b, d); //printf ("%f\n", d); vector_exp_mul (wc->w, v, d); //vector_set_min_value (wc->w, wdb->min); return 0;}void *winnow_load_db (FILE *file) { int i; winnow_db *ndb; ndb = my_malloc (sizeof(winnow_db)); i = fscanf (file, "a %f\n", &ndb->a); i = fscanf (file, "b %f\n", &ndb->b); i = fscanf (file, "bias %f\n", &ndb->f); return ndb;}void *winnow_load_class (FILE *file) { winnow_class *ncl; ncl = my_malloc (sizeof(winnow_class)); fscanf (file, "weights "); ncl->w = vector_load (file); if (!ncl->w) { free (ncl); return NULL; } fscanf (file, "\n"); return ncl;}intwinnow_save_db (FILE *file, void *db) { winnow_db *ndb; ndb = (winnow_db *)db; fprintf (file, "a %f\n", ndb->a); fprintf (file, "b %f\n", ndb->b); fprintf (file, "bias %f\n", ndb->f); return 0;}intwinnow_save_class (FILE *file, void *data) { winnow_class *ncl; ncl = (winnow_class *)data; fprintf (file, "weights "); vector_save (ncl->w, file); fprintf (file, "\n"); return 0;}/** * Keep cygwin happy. */intmain (void) { return 0;}/** * Winnow classifier name. */const char *my_classifier_name = "Winnow";/** * Winnow classifier functions. */const multi_functions my_functions = { .new_db = winnow_new_db, .new = winnow_new_class, .copy = winnow_copy, .free = winnow_free, .learn = winnow_learn, .classify = winnow_classify, .load_db = winnow_load_db, .load_class = winnow_load_class, .save_db = winnow_save_db, .save_class = winnow_save_class, .option = OPTION_BINARY | OPTION_MISTAKE};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -