#include #include #include #define N_FEATURES 6 #define N_CLASSES 5 #define N_VECTORS 62 #define N_ROWS 5 #define N_COEFFICIENTS 4 #define N_INTERCEPTS 10 #define KERNEL_TYPE 'l' #define KERNEL_GAMMA 0.02 #define KERNEL_COEF 0.0 #define KERNEL_DEGREE 3 double vectors[62][6] = {{22.0, 141.0, 215.0, 193.0, 128.0, 176.0}, {25.0, 158.0, 224.0, 206.0, 122.0, 187.0}, {23.0, 156.0, 218.0, 196.0, 126.0, 183.0}, {22.0, 165.0, 219.0, 193.0, 129.0, 185.0}, {25.0, 94.0, 226.0, 216.0, 122.0, 164.0}, {26.0, 130.0, 178.0, 172.0, 121.0, 170.0}, {26.0, 131.0, 180.0, 174.0, 121.0, 171.0}, {25.0, 159.0, 220.0, 203.0, 122.0, 187.0}, {26.0, 161.0, 204.0, 192.0, 120.0, 185.0}, {26.0, 111.0, 185.0, 181.0, 121.0, 165.0}, {26.0, 163.0, 180.0, 172.0, 121.0, 180.0}, {26.0, 131.0, 190.0, 184.0, 121.0, 173.0}, {27.0, 162.0, 175.0, 169.0, 120.0, 179.0}, {26.0, 128.0, 183.0, 177.0, 121.0, 170.0}, {26.0, 166.0, 174.0, 165.0, 122.0, 180.0}, {26.0, 98.0, 186.0, 183.0, 122.0, 161.0}, {26.0, 163.0, 178.0, 169.0, 121.0, 179.0}, {26.0, 125.0, 179.0, 175.0, 120.0, 169.0}, {26.0, 116.0, 176.0, 171.0, 122.0, 165.0}, {26.0, 130.0, 182.0, 176.0, 120.0, 171.0}, {26.0, 127.0, 189.0, 183.0, 121.0, 171.0}, {26.0, 159.0, 179.0, 172.0, 120.0, 179.0}, {26.0, 130.0, 183.0, 177.0, 121.0, 171.0}, {26.0, 135.0, 175.0, 170.0, 121.0, 171.0}, {26.0, 133.0, 177.0, 171.0, 121.0, 171.0}, {28.0, 127.0, 205.0, 202.0, 116.0, 176.0}, {26.0, 126.0, 177.0, 173.0, 121.0, 169.0}, {26.0, 126.0, 173.0, 169.0, 121.0, 168.0}, {27.0, 127.0, 177.0, 173.0, 121.0, 169.0}, {27.0, 168.0, 202.0, 192.0, 119.0, 187.0}, {26.0, 132.0, 176.0, 170.0, 121.0, 170.0}, {26.0, 168.0, 201.0, 190.0, 119.0, 187.0}, {26.0, 124.0, 177.0, 172.0, 121.0, 168.0}, {26.0, 133.0, 177.0, 171.0, 121.0, 170.0}, {26.0, 128.0, 174.0, 168.0, 122.0, 168.0}, {29.0, 100.0, 165.0, 168.0, 119.0, 160.0}, {26.0, 128.0, 179.0, 174.0, 120.0, 169.0}, {26.0, 156.0, 192.0, 184.0, 120.0, 181.0}, {29.0, 117.0, 178.0, 179.0, 117.0, 169.0}, {28.0, 125.0, 172.0, 173.0, 117.0, 170.0}, {26.0, 170.0, 198.0, 187.0, 120.0, 186.0}, {26.0, 128.0, 176.0, 170.0, 122.0, 168.0}, {34.0, 96.0, 172.0, 174.0, 113.0, 160.0}, {30.0, 136.0, 175.0, 178.0, 115.0, 175.0}, {35.0, 91.0, 165.0, 168.0, 114.0, 157.0}, {35.0, 102.0, 160.0, 163.0, 113.0, 160.0}, {34.0, 77.0, 165.0, 168.0, 117.0, 153.0}, {32.0, 105.0, 184.0, 186.0, 114.0, 166.0}, {36.0, 88.0, 149.0, 152.0, 115.0, 154.0}, {35.0, 103.0, 160.0, 162.0, 113.0, 160.0}, {30.0, 136.0, 175.0, 178.0, 115.0, 175.0}, {31.0, 137.0, 183.0, 185.0, 113.0, 177.0}, {35.0, 104.0, 155.0, 158.0, 113.0, 160.0}, {35.0, 102.0, 167.0, 169.0, 112.0, 161.0}, {34.0, 106.0, 168.0, 170.0, 113.0, 162.0}, {35.0, 100.0, 176.0, 177.0, 112.0, 162.0}, {36.0, 70.0, 166.0, 169.0, 116.0, 150.0}, {36.0, 90.0, 152.0, 155.0, 114.0, 155.0}, {36.0, 90.0, 152.0, 155.0, 114.0, 155.0}, {36.0, 90.0, 157.0, 160.0, 114.0, 156.0}, {35.0, 101.0, 166.0, 168.0, 113.0, 161.0}, {36.0, 93.0, 152.0, 155.0, 114.0, 155.0}}; double coefficients[4][62] = {{0.0, 0.14840231726321196, 0.039261948690546444, 0.0209412395721969, 0.0, -0.0, -0.0, -0.20860550552595525, -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.0, -0.0, -0.0, -0.0, -0.0031344318169009215, -0.0, -0.0, -0.0, -0.003655675139530277, -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.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.001417434443656989, -0.0, -0.0, -0.0, -0.0005871521377968213, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0}, {0.0030248956801895086, 0.0, 0.0037652112762416898, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.34801591318003544, 0.0, 0.9470322783124342, 1.0, 1.0, 1.0, 0.1190647944888346, 1.0, 1.0, -1.0, -1.0, -0.0, -1.0, -0.9191873143094769, -0.5853053513640583, -0.9096203203077597, -1.0, -1.0, -1.0, -1.0, -1.0, -0.0, -1.0, -1.0, -0.0, -0.0, -1.0, -1.0, -0.0, -0.0, -0.0, -0.0, -0.00214452397132578, -0.0, -0.0, -0.0, -0.024885645069570812, -0.0, -0.0, -0.0, -0.0, -0.008162929283275827, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0}, {0.001417434443656989, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005090581338098007, 0.0, 0.0, 0.0, 0.0, 0.021939587702798583, 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.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15549955595462564, 0.028604873673860467, 0.0, 0.0, -0.0, -0.025227153827495952, -0.0, -0.0, -0.02725948479373349, -0.05283188423037765, -0.0, -0.0, -0.07878590677687888, -0.0, -0.0, -0.0, -0.03368062815080514, -0.0, -0.0021054672852750564, -0.0, -0.0, -0.0, -0.0, -0.0}, {0.0003111058735373569, 0.0, 0.0, 0.0, 0.00027604626425946436, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.005198480088866544, 0.0, 0.0, 0.002964449194409284, 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.0, 0.0, 0.0, 0.027802518595050722, 0.0, 0.0, 0.007983576841029474, 0.0, 0.0, 0.0, 0.8407891498034413, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.7460798959789274, -0.8280132821307199, -1.0, -0.0, -0.0, -0.27542132331031716, -1.0, -0.6321885096378135, -1.0, -0.8512459307035196}}; double intercepts[10] = {-75.75078006378519, -20.95003189340926, -13.931254429482717, -10.88428749656037, -60.3146600706958, -6.927566866842887, -23.395247507217405, -33.671889415817894, -23.54485078615138, -108.26857343348372}; int weights[5] = {5, 18, 19, 11, 9}; int predict (double features[]) { int i, j, k, d, l; double kernels[N_VECTORS]; double kernel; switch (KERNEL_TYPE) { case 'l': // 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+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+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; }