168 lines
6.9 KiB
C
168 lines
6.9 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
#define N_FEATURES 6
|
|
#define N_CLASSES 3
|
|
#define N_VECTORS 48
|
|
#define N_ROWS 3
|
|
#define N_COEFFICIENTS 2
|
|
#define N_INTERCEPTS 3
|
|
#define KERNEL_TYPE 'l'
|
|
#define KERNEL_GAMMA 0.02
|
|
#define KERNEL_COEF 0.0
|
|
#define KERNEL_DEGREE 3
|
|
|
|
double vectors[48][6] = {{36.0, 31.0, 160.0, 166.0, 122.0, 137.0}, {37.0, 31.0, 159.0, 165.0, 122.0, 137.0}, {38.0, 27.0, 165.0, 171.0, 122.0, 136.0}, {110.0, 23.0, 182.0, 178.0, 128.0, 121.0}, {35.0, 29.0, 219.0, 221.0, 121.0, 140.0}, {33.0, 51.0, 221.0, 222.0, 119.0, 149.0}, {43.0, 21.0, 172.0, 177.0, 123.0, 134.0}, {0.0, 0.0, 180.0, 187.0, 128.0, 128.0}, {42.0, 22.0, 170.0, 175.0, 123.0, 134.0}, {105.0, 11.0, 164.0, 168.0, 127.0, 125.0}, {41.0, 42.0, 188.0, 191.0, 119.0, 142.0}, {40.0, 25.0, 197.0, 200.0, 122.0, 137.0}, {50.0, 33.0, 183.0, 185.0, 117.0, 138.0}, {51.0, 34.0, 181.0, 183.0, 117.0, 138.0}, {45.0, 35.0, 174.0, 177.0, 118.0, 139.0}, {40.0, 40.0, 161.0, 166.0, 120.0, 140.0}, {51.0, 32.0, 183.0, 185.0, 117.0, 138.0}, {54.0, 27.0, 178.0, 181.0, 118.0, 136.0}, {74.0, 24.0, 134.0, 140.0, 121.0, 130.0}, {0.0, 0.0, 194.0, 200.0, 128.0, 128.0}, {72.0, 34.0, 204.0, 203.0, 115.0, 133.0}, {41.0, 29.0, 189.0, 192.0, 121.0, 138.0}, {48.0, 34.0, 183.0, 185.0, 117.0, 138.0}, {50.0, 33.0, 186.0, 188.0, 117.0, 138.0}, {74.0, 24.0, 136.0, 142.0, 122.0, 130.0}, {50.0, 34.0, 183.0, 185.0, 117.0, 138.0}, {75.0, 27.0, 133.0, 138.0, 121.0, 130.0}, {49.0, 37.0, 190.0, 191.0, 116.0, 139.0}, {48.0, 36.0, 193.0, 194.0, 116.0, 140.0}, {57.0, 27.0, 176.0, 179.0, 118.0, 135.0}, {49.0, 34.0, 184.0, 186.0, 117.0, 138.0}, {40.0, 44.0, 172.0, 176.0, 119.0, 142.0}, {50.0, 31.0, 165.0, 169.0, 119.0, 137.0}, {52.0, 31.0, 171.0, 174.0, 118.0, 137.0}, {65.0, 33.0, 184.0, 185.0, 116.0, 134.0}, {60.0, 25.0, 195.0, 196.0, 118.0, 135.0}, {50.0, 34.0, 174.0, 177.0, 118.0, 138.0}, {53.0, 32.0, 165.0, 168.0, 118.0, 137.0}, {79.0, 44.0, 203.0, 202.0, 113.0, 130.0}, {52.0, 33.0, 178.0, 180.0, 117.0, 138.0}, {59.0, 30.0, 193.0, 194.0, 116.0, 137.0}, {50.0, 36.0, 175.0, 177.0, 117.0, 138.0}, {50.0, 33.0, 176.0, 179.0, 118.0, 137.0}, {60.0, 27.0, 195.0, 196.0, 116.0, 136.0}, {49.0, 34.0, 173.0, 176.0, 118.0, 138.0}, {52.0, 35.0, 175.0, 177.0, 117.0, 138.0}, {51.0, 33.0, 174.0, 177.0, 117.0, 137.0}, {54.0, 32.0, 164.0, 167.0, 118.0, 136.0}};
|
|
double coefficients[2][48] = {{1.0, 0.5103328849993943, 1.0, 0.18460517859605727, 1.0, 0.0, 0.6794156464884626, 0.22175199029837298, 1.0, 0.0, -0.41406044750531895, -1.0, -0.0, -0.0, -0.0, -1.0, -0.0, -0.0, -0.0, -1.0, -0.0, -1.0, -0.0, -0.0, -1.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.18204525287696996, -0.10220756665810597, -0.0, -0.0, -0.024832739041319236, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0}, {0.0, 0.0775378123102272, 0.0, 0.0, 0.0, 0.02096846829461621, 0.0, 0.0, 0.0, 0.028534025094581875, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.7629692919026765, 0.8615675910756857, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0, -0.90466283661691, -1.0, -1.0, -1.0, -0.4956366212500156, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.5075148620044435, -0.7167225631069957, -1.0}};
|
|
double intercepts[3] = {-384.0006853584271, -57.545497262241824, -277.21709072331515};
|
|
int weights[3] = {10, 22, 16};
|
|
|
|
int predict (double features[]) {
|
|
int i, j, k, d, l;
|
|
|
|
double kernels[N_VECTORS];
|
|
double kernel;
|
|
switch (KERNEL_TYPE) {
|
|
case 'l':
|
|
// <x,x'>
|
|
for (i = 0; i < N_VECTORS; i++) {
|
|
kernel = 0.;
|
|
for (j = 0; j < N_FEATURES; j++) {
|
|
kernel += vectors[i][j] * features[j];
|
|
}
|
|
kernels[i] = kernel;
|
|
}
|
|
break;
|
|
case 'p':
|
|
// (y<x,x'>+r)^d
|
|
for (i = 0; i < N_VECTORS; i++) {
|
|
kernel = 0.;
|
|
for (j = 0; j < N_FEATURES; j++) {
|
|
kernel += vectors[i][j] * features[j];
|
|
}
|
|
kernels[i] = pow((KERNEL_GAMMA * kernel) + KERNEL_COEF, KERNEL_DEGREE);
|
|
}
|
|
break;
|
|
case 'r':
|
|
// exp(-y|x-x'|^2)
|
|
for (i = 0; i < N_VECTORS; i++) {
|
|
kernel = 0.;
|
|
for (j = 0; j < N_FEATURES; j++) {
|
|
kernel += pow(vectors[i][j] - features[j], 2);
|
|
}
|
|
kernels[i] = exp(-KERNEL_GAMMA * kernel);
|
|
}
|
|
break;
|
|
case 's':
|
|
// tanh(y<x,x'>+r)
|
|
for (i = 0; i < N_VECTORS; i++) {
|
|
kernel = 0.;
|
|
for (j = 0; j < N_FEATURES; j++) {
|
|
kernel += vectors[i][j] * features[j];
|
|
}
|
|
kernels[i] = tanh((KERNEL_GAMMA * kernel) + KERNEL_COEF);
|
|
}
|
|
break;
|
|
}
|
|
|
|
int starts[N_ROWS];
|
|
int start;
|
|
for (i = 0; i < N_ROWS; i++) {
|
|
if (i != 0) {
|
|
start = 0;
|
|
for (j = 0; j < i; j++) {
|
|
start += weights[j];
|
|
}
|
|
starts[i] = start;
|
|
} else {
|
|
starts[0] = 0;
|
|
}
|
|
}
|
|
|
|
int ends[N_ROWS];
|
|
for (i = 0; i < N_ROWS; i++) {
|
|
ends[i] = weights[i] + starts[i];
|
|
}
|
|
|
|
if (N_CLASSES == 2) {
|
|
|
|
for (i = 0; i < N_VECTORS; i++) {
|
|
kernels[i] = -kernels[i];
|
|
}
|
|
|
|
double decision = 0.;
|
|
for (k = starts[1]; k < ends[1]; k++) {
|
|
decision += kernels[k] * coefficients[0][k];
|
|
}
|
|
for (k = starts[0]; k < ends[0]; k++) {
|
|
decision += kernels[k] * coefficients[0][k];
|
|
}
|
|
decision += intercepts[0];
|
|
|
|
if (decision > 0) {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
|
|
double decisions[N_INTERCEPTS];
|
|
double tmp;
|
|
for (i = 0, d = 0, l = N_ROWS; i < l; i++) {
|
|
for (j = i + 1; j < l; j++) {
|
|
tmp = 0.;
|
|
for (k = starts[j]; k < ends[j]; k++) {
|
|
tmp += kernels[k] * coefficients[i][k];
|
|
}
|
|
for (k = starts[i]; k < ends[i]; k++) {
|
|
tmp += kernels[k] * coefficients[j - 1][k];
|
|
}
|
|
decisions[d] = tmp + intercepts[d];
|
|
d = d + 1;
|
|
}
|
|
}
|
|
|
|
int votes[N_INTERCEPTS];
|
|
for (i = 0, d = 0, l = N_ROWS; i < l; i++) {
|
|
for (j = i + 1; j < l; j++) {
|
|
votes[d] = decisions[d] > 0 ? i : j;
|
|
d = d + 1;
|
|
}
|
|
}
|
|
|
|
int amounts[N_CLASSES];
|
|
for (i = 0, l = N_CLASSES; i < l; i++) {
|
|
amounts[i] = 0;
|
|
}
|
|
for (i = 0; i < N_INTERCEPTS; i++) {
|
|
amounts[votes[i]] += 1;
|
|
}
|
|
|
|
int classVal = -1;
|
|
int classIdx = -1;
|
|
for (i = 0; i < N_CLASSES; i++) {
|
|
if (amounts[i] > classVal) {
|
|
classVal = amounts[i];
|
|
classIdx= i;
|
|
}
|
|
}
|
|
return classIdx;
|
|
|
|
}
|
|
|
|
int main(int argc, const char * argv[]) {
|
|
|
|
/* Features: */
|
|
double features[argc-1];
|
|
int i;
|
|
for (i = 1; i < argc; i++) {
|
|
features[i-1] = atof(argv[i]);
|
|
}
|
|
|
|
/* Prediction: */
|
|
printf("%d", predict(features));
|
|
return 0;
|
|
|
|
}
|