node_t* perceptron_get_code(dataset_t*d, perceptron_t*p) { int i; START_CODE(program) if(d->desired_response->num_classes == 2) { /* two classes */ int class0 = 0; int class1 = 1; BLOCK IF GT ADD for(i=0;i<d->num_columns;i++) { if(p->disabled[i]) continue; MUL PARAM(i); FLOAT_CONSTANT(p->weights[class0][i]) END; } END; FLOAT_CONSTANT(-p->weights[class0][p->intercept]); END; THEN GENERIC_CONSTANT(d->desired_response->classes[class0]); ELSE GENERIC_CONSTANT(d->desired_response->classes[class1]); END; END; } else {
static model_t*perceptron_train(perceptron_model_factory_t*factory, dataset_t*d) { int num_iterations = d->num_rows*100; double base_eta = 0.1; double lastperf = 1.0; double currentperf = -1; int t; double*weights = calloc(sizeof(double), d->num_columns); if(dataset_has_categorical_columns(d)) return NULL; if(d->desired_response->num_classes > 2) return NULL; double class_to_level[2] = {-1, 1}; for(t=1;t<num_iterations;t++) { int i = lrand48() % d->num_rows; double eta = base_eta / t; if(predict(d, weights, i) != d->desired_response->entries[i].c) { update_weights(weights, d, i, eta); } } expanded_columns_t*expanded_columns = expanded_columns_new(d); START_CODE(program) BLOCK IF LT ADD for(t=0;t<d->num_columns;t++) { MUL INSERT_NODE(expanded_columns_parameter_code(expanded_columns, t)) FLOAT_CONSTANT(weights[t]) END; } END; FLOAT_CONSTANT(0.0); END; THEN GENERIC_CONSTANT(d->desired_response->classes[0]); ELSE GENERIC_CONSTANT(d->desired_response->classes[1]); END; END_CODE; expanded_columns_destroy(expanded_columns); model_t*m = model_new(d); m->code = program; return m; }
node_t* get_program() const { expanded_columns_t*expanded_columns = expanded_columns_new(dataset); assert(kernel); assert(params.svm_type == CvSVM::C_SVC); assert(params.kernel_type == CvSVM::LINEAR); int var_count = get_var_count(); int class_count = this->dataset->desired_response->num_classes; assert(var_count == expanded_columns->num); assert(class_labels->cols == class_count); START_CODE(program) BLOCK INSERT_NODE(expanded_columns_parameter_init(expanded_columns)); if(class_count == 2) { IF GT INSERT_NODE(compare_classes(0,1,expanded_columns)); FLOAT_CONSTANT(0.0); END; THEN GENERIC_CONSTANT(dataset->desired_response->classes[0]); ELSE GENERIC_CONSTANT(dataset->desired_response->classes[1]); END; } else { int vote_offset = 0; int i; for(i = 0; i < class_count; i++) { SETLOCAL(vote_offset+i) INT_CONSTANT(0); END; } for(i=0; i<class_count; i++) { int j; for(j=i+1; j<class_count; j++) { IF GT INSERT_NODE(compare_classes(i,j,expanded_columns)); FLOAT_CONSTANT(0.0); END; THEN INCLOCAL(vote_offset + i) ELSE INCLOCAL(vote_offset + j) END; } } ARRAY_AT_POS ARRAY_CONSTANT(dataset_classes_as_array(dataset)); ARG_MAX_I int j; for(j=0; j<class_count; j++) { GETLOCAL(vote_offset+j); } END; END; } END; END_CODE; expanded_columns_destroy(expanded_columns); return program; }