#include #include #include #define N_FEATURES 6 #define N_CLASSES 4 #define N_VECTORS 123 #define N_ROWS 4 #define N_COEFFICIENTS 3 #define N_INTERCEPTS 6 #define KERNEL_TYPE 'l' #define KERNEL_GAMMA 0.02 #define KERNEL_COEF 0.0 #define KERNEL_DEGREE 3 double vectors[123][6] = {{10.0, 37.0, 173.0, 168.0, 132.0, 134.0}, {10.0, 35.0, 171.0, 166.0, 132.0, 134.0}, {9.0, 37.0, 153.0, 149.0, 132.0, 133.0}, {7.0, 37.0, 138.0, 135.0, 133.0, 132.0}, {18.0, 36.0, 238.0, 230.0, 128.0, 140.0}, {11.0, 53.0, 173.0, 163.0, 134.0, 138.0}, {10.0, 34.0, 167.0, 163.0, 132.0, 134.0}, {19.0, 34.0, 217.0, 212.0, 129.0, 138.0}, {18.0, 45.0, 221.0, 213.0, 129.0, 142.0}, {11.0, 49.0, 167.0, 160.0, 133.0, 137.0}, {11.0, 49.0, 178.0, 168.0, 133.0, 137.0}, {10.0, 45.0, 164.0, 157.0, 133.0, 136.0}, {20.0, 47.0, 231.0, 222.0, 128.0, 144.0}, {21.0, 40.0, 249.0, 240.0, 127.0, 142.0}, {10.0, 34.0, 175.0, 170.0, 132.0, 134.0}, {20.0, 21.0, 242.0, 239.0, 128.0, 135.0}, {9.0, 26.0, 175.0, 173.0, 131.0, 132.0}, {7.0, 37.0, 142.0, 139.0, 133.0, 133.0}, {11.0, 46.0, 166.0, 159.0, 133.0, 136.0}, {20.0, 38.0, 235.0, 228.0, 128.0, 141.0}, {10.0, 35.0, 171.0, 166.0, 132.0, 134.0}, {20.0, 42.0, 230.0, 222.0, 128.0, 142.0}, {19.0, 45.0, 228.0, 220.0, 128.0, 142.0}, {13.0, 21.0, 213.0, 210.0, 130.0, 133.0}, {11.0, 34.0, 172.0, 168.0, 131.0, 134.0}, {20.0, 36.0, 233.0, 227.0, 128.0, 140.0}, {8.0, 37.0, 151.0, 146.0, 133.0, 133.0}, {18.0, 41.0, 218.0, 211.0, 129.0, 140.0}, {19.0, 47.0, 227.0, 218.0, 128.0, 143.0}, {27.0, 41.0, 226.0, 224.0, 124.0, 145.0}, {9.0, 39.0, 170.0, 164.0, 132.0, 134.0}, {9.0, 36.0, 170.0, 165.0, 132.0, 134.0}, {20.0, 35.0, 235.0, 228.0, 128.0, 140.0}, {0.0, 0.0, 223.0, 226.0, 128.0, 128.0}, {19.0, 45.0, 229.0, 221.0, 128.0, 143.0}, {11.0, 52.0, 172.0, 162.0, 134.0, 138.0}, {11.0, 40.0, 138.0, 135.0, 132.0, 134.0}, {14.0, 25.0, 209.0, 205.0, 130.0, 134.0}, {20.0, 37.0, 237.0, 230.0, 128.0, 140.0}, {7.0, 37.0, 155.0, 150.0, 133.0, 133.0}, {21.0, 33.0, 249.0, 242.0, 127.0, 140.0}, {9.0, 36.0, 170.0, 165.0, 132.0, 134.0}, {10.0, 36.0, 171.0, 166.0, 132.0, 134.0}, {11.0, 34.0, 171.0, 167.0, 131.0, 134.0}, {10.0, 51.0, 172.0, 162.0, 134.0, 137.0}, {9.0, 35.0, 169.0, 164.0, 132.0, 134.0}, {18.0, 42.0, 215.0, 209.0, 129.0, 141.0}, {11.0, 50.0, 176.0, 166.0, 133.0, 138.0}, {19.0, 35.0, 218.0, 213.0, 129.0, 139.0}, {8.0, 36.0, 150.0, 146.0, 132.0, 133.0}, {13.0, 21.0, 213.0, 210.0, 130.0, 133.0}, {9.0, 36.0, 170.0, 165.0, 132.0, 134.0}, {18.0, 34.0, 218.0, 213.0, 129.0, 138.0}, {10.0, 52.0, 172.0, 162.0, 134.0, 137.0}, {10.0, 34.0, 174.0, 170.0, 132.0, 134.0}, {11.0, 40.0, 175.0, 169.0, 132.0, 135.0}, {13.0, 37.0, 194.0, 188.0, 131.0, 137.0}, {13.0, 39.0, 189.0, 183.0, 131.0, 137.0}, {13.0, 34.0, 191.0, 186.0, 131.0, 135.0}, {12.0, 43.0, 174.0, 167.0, 132.0, 137.0}, {12.0, 36.0, 191.0, 185.0, 131.0, 136.0}, {14.0, 32.0, 210.0, 204.0, 130.0, 135.0}, {16.0, 53.0, 205.0, 196.0, 130.0, 143.0}, {12.0, 36.0, 191.0, 185.0, 131.0, 135.0}, {16.0, 51.0, 209.0, 199.0, 130.0, 142.0}, {10.0, 42.0, 170.0, 164.0, 133.0, 135.0}, {13.0, 38.0, 196.0, 189.0, 131.0, 136.0}, {12.0, 35.0, 191.0, 185.0, 131.0, 135.0}, {13.0, 41.0, 189.0, 182.0, 131.0, 137.0}, {14.0, 44.0, 177.0, 172.0, 131.0, 138.0}, {16.0, 37.0, 201.0, 196.0, 130.0, 137.0}, {14.0, 39.0, 190.0, 184.0, 131.0, 137.0}, {17.0, 52.0, 206.0, 197.0, 130.0, 143.0}, {13.0, 38.0, 191.0, 185.0, 131.0, 136.0}, {14.0, 34.0, 201.0, 195.0, 130.0, 136.0}, {13.0, 37.0, 190.0, 184.0, 131.0, 136.0}, {13.0, 41.0, 186.0, 180.0, 131.0, 137.0}, {10.0, 31.0, 189.0, 184.0, 131.0, 134.0}, {13.0, 34.0, 188.0, 184.0, 131.0, 135.0}, {12.0, 35.0, 193.0, 188.0, 131.0, 136.0}, {14.0, 34.0, 188.0, 184.0, 130.0, 136.0}, {12.0, 33.0, 194.0, 188.0, 131.0, 135.0}, {15.0, 42.0, 191.0, 185.0, 130.0, 138.0}, {14.0, 37.0, 199.0, 192.0, 131.0, 137.0}, {14.0, 33.0, 206.0, 200.0, 130.0, 136.0}, {12.0, 43.0, 180.0, 173.0, 132.0, 137.0}, {13.0, 36.0, 191.0, 186.0, 131.0, 136.0}, {16.0, 37.0, 202.0, 196.0, 130.0, 137.0}, {12.0, 33.0, 190.0, 184.0, 131.0, 135.0}, {11.0, 33.0, 183.0, 178.0, 131.0, 134.0}, {12.0, 37.0, 192.0, 186.0, 131.0, 136.0}, {13.0, 32.0, 200.0, 195.0, 131.0, 135.0}, {17.0, 53.0, 205.0, 196.0, 130.0, 143.0}, {11.0, 34.0, 178.0, 174.0, 131.0, 134.0}, {12.0, 34.0, 191.0, 186.0, 131.0, 135.0}, {8.0, 48.0, 203.0, 188.0, 136.0, 137.0}, {10.0, 31.0, 184.0, 179.0, 131.0, 134.0}, {12.0, 35.0, 197.0, 191.0, 131.0, 135.0}, {14.0, 36.0, 196.0, 190.0, 131.0, 137.0}, {12.0, 32.0, 180.0, 176.0, 131.0, 134.0}, {13.0, 38.0, 196.0, 190.0, 131.0, 137.0}, {12.0, 38.0, 189.0, 182.0, 131.0, 136.0}, {13.0, 41.0, 184.0, 178.0, 131.0, 137.0}, {17.0, 52.0, 206.0, 197.0, 130.0, 143.0}, {13.0, 37.0, 189.0, 183.0, 131.0, 136.0}, {13.0, 44.0, 182.0, 175.0, 132.0, 137.0}, {12.0, 34.0, 190.0, 184.0, 131.0, 135.0}, {5.0, 52.0, 195.0, 172.0, 142.0, 133.0}, {178.0, 39.0, 182.0, 169.0, 138.0, 131.0}, {177.0, 49.0, 150.0, 137.0, 139.0, 131.0}, {5.0, 56.0, 160.0, 145.0, 138.0, 135.0}, {175.0, 54.0, 153.0, 137.0, 142.0, 130.0}, {8.0, 58.0, 215.0, 194.0, 138.0, 139.0}, {0.0, 53.0, 190.0, 168.0, 143.0, 134.0}, {134.0, 54.0, 190.0, 168.0, 143.0, 133.0}, {5.0, 42.0, 191.0, 178.0, 136.0, 134.0}, {3.0, 41.0, 183.0, 170.0, 136.0, 133.0}, {6.0, 62.0, 200.0, 178.0, 140.0, 138.0}, {6.0, 54.0, 178.0, 163.0, 137.0, 136.0}, {173.0, 53.0, 167.0, 149.0, 142.0, 129.0}, {177.0, 56.0, 162.0, 144.0, 142.0, 131.0}, {89.0, 52.0, 185.0, 164.0, 142.0, 132.0}, {65.0, 56.0, 183.0, 162.0, 143.0, 133.0}}; double coefficients[3][123] = {{1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9716827715061618, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.6667756371166391, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.24322508243673882, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.15375359197996077, 1.0, 1.0, 0.19761592064765218, 1.0, 0.4632830566327337, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.6963360603198887, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.0, -0.0, -0.002375014975204716, -0.017919312892936287, -0.0, -0.0, -0.0, -0.0, -0.0, -0.016952164233451018, -0.0, -0.04756189131952942, -0.0, -0.0, -0.0, -0.0006992349593536536}, {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.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, 0.0, 0.02676657839945455, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05804180502166685, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0643191768049149, 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.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3714406101740961, 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.005642496651301463, -0.0, -0.0, -0.0, -0.14608356438499645, -0.0, -0.0, -0.2840337259427125, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0006591113864912571}, {0.0, 0.0, 0.0, 0.0, 0.0, 0.0001911164609440949, 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.0, 0.0, 0.00024353373404999634, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00026458476435956257, 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.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0005914158022917513, 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.0, 6.769558419950571e-05, 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.5367543692934408, 0.0, 0.0, 0.0, 1.0, 0.0, 0.1881385664244497, 0.7767465480955688, 0.0, 0.0, 0.21115136958484806, 0.0, -0.1259823349395935, -0.6168327790869625, -1.0, -0.9699757393717575}}; double intercepts[6] = {135.44946084187507, 19.061780278345406, 1.7400393672676422, -19.356133000309267, 1.28390685777037, -36.177967480292565}; int weights[4] = {55, 52, 12, 4}; 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; }