168 lines
8.8 KiB
C
168 lines
8.8 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
#define N_FEATURES 6
|
|
#define N_CLASSES 7
|
|
#define N_VECTORS 42
|
|
#define N_ROWS 7
|
|
#define N_COEFFICIENTS 6
|
|
#define N_INTERCEPTS 21
|
|
#define KERNEL_TYPE 'l'
|
|
#define KERNEL_GAMMA 0.02
|
|
#define KERNEL_COEF 0.0
|
|
#define KERNEL_DEGREE 3
|
|
|
|
double vectors[42][6] = {{16.0, 170.0, 213.0, 170.0, 144.0, 178.0}, {14.0, 204.0, 179.0, 130.0, 153.0, 177.0}, {14.0, 202.0, 181.0, 132.0, 153.0, 176.0}, {17.0, 168.0, 218.0, 175.0, 143.0, 178.0}, {17.0, 193.0, 250.0, 194.0, 147.0, 193.0}, {15.0, 203.0, 182.0, 135.0, 150.0, 178.0}, {15.0, 212.0, 183.0, 134.0, 152.0, 180.0}, {18.0, 211.0, 165.0, 131.0, 142.0, 179.0}, {17.0, 207.0, 183.0, 142.0, 145.0, 181.0}, {19.0, 232.0, 179.0, 142.0, 142.0, 186.0}, {20.0, 235.0, 186.0, 147.0, 142.0, 189.0}, {20.0, 191.0, 213.0, 177.0, 136.0, 188.0}, {18.0, 216.0, 216.0, 166.0, 147.0, 191.0}, {23.0, 186.0, 165.0, 148.0, 128.0, 179.0}, {23.0, 169.0, 166.0, 152.0, 127.0, 175.0}, {21.0, 188.0, 191.0, 165.0, 132.0, 183.0}, {20.0, 203.0, 161.0, 135.0, 135.0, 178.0}, {21.0, 227.0, 204.0, 168.0, 136.0, 194.0}, {23.0, 215.0, 165.0, 144.0, 130.0, 184.0}, {28.0, 175.0, 112.0, 112.0, 120.0, 167.0}, {26.0, 212.0, 166.0, 156.0, 122.0, 188.0}, {26.0, 171.0, 141.0, 137.0, 121.0, 173.0}, {28.0, 163.0, 123.0, 124.0, 120.0, 168.0}, {28.0, 166.0, 122.0, 123.0, 119.0, 168.0}, {42.0, 132.0, 94.0, 95.0, 110.0, 153.0}, {43.0, 137.0, 92.0, 93.0, 110.0, 153.0}, {34.0, 166.0, 128.0, 130.0, 111.0, 170.0}, {42.0, 133.0, 99.0, 100.0, 109.0, 154.0}, {37.0, 54.0, 140.0, 146.0, 119.0, 142.0}, {36.0, 150.0, 143.0, 145.0, 109.0, 170.0}, {34.0, 161.0, 119.0, 122.0, 113.0, 167.0}, {47.0, 106.0, 112.0, 112.0, 108.0, 151.0}, {48.0, 112.0, 120.0, 119.0, 105.0, 153.0}, {67.0, 117.0, 80.0, 78.0, 107.0, 140.0}, {49.0, 122.0, 110.0, 109.0, 104.0, 153.0}, {48.0, 95.0, 133.0, 133.0, 107.0, 151.0}, {61.0, 80.0, 104.0, 104.0, 108.0, 142.0}, {63.0, 67.0, 129.0, 129.0, 109.0, 140.0}, {65.0, 103.0, 96.0, 95.0, 106.0, 142.0}, {73.0, 149.0, 62.0, 59.0, 109.0, 136.0}, {74.0, 146.0, 87.0, 84.0, 104.0, 137.0}, {61.0, 73.0, 123.0, 123.0, 108.0, 142.0}};
|
|
double coefficients[6][42] = {{0.0, 0.0, 0.0, 0.0, 0.007123731733845719, 0.0, 0.026728670619480987, -0.0, -0.022642062294742756, -0.0, -0.0, -0.0, -0.011210340058583986, -0.0, -0.0, -0.004492810017798028, -0.0, -0.0, -0.0, -0.0, -0.0009822727926227658, -0.00019697324708030917, -0.0, -0.0, -0.0, -0.0, -0.00024315366079156689, -0.0, -0.0, -7.887982104716923e-05, -0.0, -0.0, -0.0001269056378111678, -0.0, -0.0, -0.0, -0.0, -2.224093446634136e-05, -0.0, -0.0, -7.305730597946722e-05, -0.0}, {0.0, 0.0, 0.0, 0.0023541594215438543, 0.0, 0.0021386505962541743, 0.0, 0.0, 0.0, 0.0, 0.04303144632801865, 0.021990515109160533, 0.0, -0.0, -0.0, -0.0, -0.017016118801059996, -0.04800584263611915, -0.0, -0.0, -0.002683681315761449, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0004261666311527815, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.00013782299883790497, -0.0, -0.0, -1.246285746727607e-05, -0.0, -0.0, -9.438411501101229e-05, -0.0}, {0.0, 0.0, 0.0, 3.689360823356543e-05, 0.0, 0.0011423524314695091, 0.0, 0.001430025142535212, 0.0, 0.0005948943046227278, 0.0, 0.000658761868603509, 0.0, 0.008324876468227304, 0.0, 0.0, 0.0, 0.0, 0.007713657530346414, -0.0, -0.011605206592790481, -0.004433327405783237, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0013726835964310295, -0.0, -0.0, -0.0002149116477739606, -0.0, -0.0, -3.402872408940634e-05, -0.0, -7.993845202285296e-05, -0.0, -0.0, -7.21000410116088e-05, -0.0}, {0.0, 0.0, 0.0, 0.0, 0.0, 0.0003220334818387361, 0.0, 0.0004261666311527815, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0013726835964310295, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.009096123618122409, 0.012708095634696546, -0.0, -0.0, -0.006079604041865676, -0.0, -0.0, -0.0, -0.015724615210953283, -0.0, -0.0, -0.0, -0.0006673340006673339, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0003358099684919548, -3.0082337769457922e-05}, {3.13346695773095e-05, 0.0, 9.557096823385828e-05, 0.0, 0.0, 0.0, 0.0, 0.00013782299883790497, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00024894037186336693, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0006673340006673339, 0.0, 0.005440788430323922, 0.00020463528718228497, 0.0, 0.013800715626807585, 0.00911414574180425, 0.0, 0.0, -0.028560285086118048, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0030207789307972795}, {0.0, 9.529824044580858e-05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00010684697247828835, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00015203849303446176, 0.0, 0.0, 0.0, 0.0, 0.0003658923062614127, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0009514754328023643, 0.0, 0.0, 0.002069303497994916, 0.0, 0.0, 0.0, 0.0, 0.3587936835959387, 0.0, 0.024271536378842457, -0.12581162030930793, -0.0, -0.08810534750995824, -0.1691482521555165, -0.0, -0.0}};
|
|
double intercepts[21] = {-6.002192891642206, -3.8628284042206995, -3.333075888643083, -6.954002229759305, -4.416097880179401, -3.6114319594536997, -21.442641474459478, -4.668420984774443, -8.14383123801408, -4.5443688291828215, -3.8049761670220867, -8.128105076816803, -14.037748798901934, -6.013597288024034, -4.323534693677444, -22.78835291091018, -8.33867200533867, -5.1963460012753275, -8.616928192852473, -5.692778997252465, 37.37043070272911};
|
|
int weights[7] = {7, 6, 6, 5, 7, 5, 6};
|
|
|
|
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;
|
|
|
|
}
|