⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winnow.c

📁 使用具有增量学习的监控式学习方法。包括几个不同的分类算法。
💻 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 + -