var SVC = function(nClasses, nRows, vectors, coefficients, intercepts, weights, kernel, gamma, coef0, degree) { this.nClasses = nClasses; this.classes = new Array(nClasses); for (var i = 0; i < nClasses; i++) { this.classes[i] = i; } this.nRows = nRows; this.vectors = vectors; this.coefficients = coefficients; this.intercepts = intercepts; this.weights = weights; this.kernel = kernel.toUpperCase(); this.gamma = gamma; this.coef0 = coef0; this.degree = degree; this.predict = function(features) { var kernels = new Array(vectors.length); var kernel; switch (this.kernel) { case 'LINEAR': // for (var i = 0; i < this.vectors.length; i++) { kernel = 0.; for (var j = 0; j < this.vectors[i].length; j++) { kernel += this.vectors[i][j] * features[j]; } kernels[i] = kernel; } break; case 'POLY': // (y+r)^d for (var i = 0; i < this.vectors.length; i++) { kernel = 0.; for (var j = 0; j < this.vectors[i].length; j++) { kernel += this.vectors[i][j] * features[j]; } kernels[i] = Math.pow((this.gamma * kernel) + this.coef0, this.degree); } break; case 'RBF': // exp(-y|x-x'|^2) for (var i = 0; i < this.vectors.length; i++) { kernel = 0.; for (var j = 0; j < this.vectors[i].length; j++) { kernel += Math.pow(this.vectors[i][j] - features[j], 2); } kernels[i] = Math.exp(-this.gamma * kernel); } break; case 'SIGMOID': // tanh(y+r) for (var i = 0; i < this.vectors.length; i++) { kernel = 0.; for (var j = 0; j < this.vectors[i].length; j++) { kernel += this.vectors[i][j] * features[j]; } kernels[i] = Math.tanh((this.gamma * kernel) + this.coef0); } break; } var starts = new Array(this.nRows); for (var i = 0; i < this.nRows; i++) { if (i != 0) { var start = 0; for (var j = 0; j < i; j++) { start += this.weights[j]; } starts[i] = start; } else { starts[0] = 0; } } var ends = new Array(this.nRows); for (var i = 0; i < this.nRows; i++) { ends[i] = this.weights[i] + starts[i]; } if (this.nClasses == 2) { for (var i = 0; i < kernels.length; i++) { kernels[i] = -kernels[i]; } var decision = 0.; for (var k = starts[1]; k < ends[1]; k++) { decision += kernels[k] * this.coefficients[0][k]; } for (var k = starts[0]; k < ends[0]; k++) { decision += kernels[k] * this.coefficients[0][k]; } decision += this.intercepts[0]; if (decision > 0) { return 0; } return 1; } var decisions = new Array(this.intercepts.length); for (var i = 0, d = 0, l = this.nRows; i < l; i++) { for (var j = i + 1; j < l; j++) { var tmp = 0.; for (var k = starts[j]; k < ends[j]; k++) { tmp += this.coefficients[i][k] * kernels[k]; } for (var k = starts[i]; k < ends[i]; k++) { tmp += this.coefficients[j - 1][k] * kernels[k]; } decisions[d] = tmp + this.intercepts[d]; d++; } } var votes = new Array(this.intercepts.length); for (var i = 0, d = 0, l = this.nRows; i < l; i++) { for (var j = i + 1; j < l; j++) { votes[d] = decisions[d] > 0 ? i : j; d++; } } var amounts = new Array(this.nClasses).fill(0); for (var i = 0, l = votes.length; i < l; i++) { amounts[votes[i]] += 1; } var classVal = -1, classIdx = -1; for (var i = 0, l = amounts.length; i < l; i++) { if (amounts[i] > classVal) { classVal = amounts[i]; classIdx= i; } } return this.classes[classIdx]; } }; if (typeof process !== 'undefined' && typeof process.argv !== 'undefined') { if (process.argv.length - 2 === 6) { // Features: var features = process.argv.slice(2); // Parameters: var vectors = [[17.0, 184.0, 180.0, 144.0, 143.0, 175.0], [25.0, 196.0, 229.0, 207.0, 122.0, 200.0], [17.0, 167.0, 190.0, 156.0, 140.0, 173.0], [25.0, 159.0, 229.0, 210.0, 123.0, 188.0], [18.0, 113.0, 228.0, 200.0, 134.0, 164.0], [21.0, 161.0, 149.0, 133.0, 131.0, 167.0], [21.0, 175.0, 204.0, 177.0, 131.0, 183.0], [24.0, 137.0, 190.0, 179.0, 123.0, 173.0], [37.0, 115.0, 103.0, 106.0, 115.0, 153.0], [44.0, 101.0, 127.0, 128.0, 109.0, 152.0], [40.0, 120.0, 103.0, 105.0, 113.0, 153.0], [26.0, 123.0, 173.0, 169.0, 121.0, 167.0], [26.0, 126.0, 168.0, 164.0, 121.0, 167.0], [40.0, 83.0, 141.0, 144.0, 113.0, 150.0], [78.0, 111.0, 81.0, 80.0, 111.0, 131.0], [79.0, 97.0, 78.0, 79.0, 114.0, 130.0], [68.0, 66.0, 111.0, 113.0, 114.0, 134.0], [79.0, 96.0, 85.0, 85.0, 113.0, 131.0], [79.0, 103.0, 86.0, 86.0, 112.0, 131.0], [80.0, 101.0, 75.0, 75.0, 114.0, 130.0], [80.0, 109.0, 75.0, 74.0, 113.0, 131.0], [78.0, 99.0, 81.0, 81.0, 113.0, 131.0], [80.0, 105.0, 82.0, 82.0, 112.0, 130.0], [78.0, 113.0, 78.0, 77.0, 111.0, 131.0], [78.0, 101.0, 78.0, 78.0, 113.0, 131.0], [78.0, 109.0, 73.0, 72.0, 113.0, 131.0], [76.0, 78.0, 108.0, 109.0, 112.0, 132.0], [79.0, 105.0, 77.0, 77.0, 113.0, 131.0], [79.0, 110.0, 74.0, 73.0, 113.0, 130.0], [78.0, 101.0, 80.0, 80.0, 113.0, 131.0], [76.0, 92.0, 144.0, 142.0, 105.0, 134.0], [79.0, 110.0, 76.0, 75.0, 112.0, 131.0], [48.0, 94.0, 124.0, 125.0, 109.0, 150.0], [80.0, 100.0, 75.0, 75.0, 114.0, 130.0], [63.0, 88.0, 65.0, 64.0, 114.0, 137.0], [78.0, 110.0, 68.0, 67.0, 113.0, 132.0], [77.0, 112.0, 72.0, 71.0, 112.0, 132.0], [80.0, 109.0, 75.0, 75.0, 113.0, 130.0], [79.0, 115.0, 66.0, 65.0, 113.0, 130.0], [78.0, 97.0, 80.0, 80.0, 113.0, 131.0], [76.0, 100.0, 77.0, 77.0, 113.0, 132.0], [78.0, 91.0, 126.0, 125.0, 108.0, 133.0], [79.0, 103.0, 74.0, 74.0, 114.0, 130.0], [79.0, 109.0, 69.0, 69.0, 114.0, 130.0], [79.0, 98.0, 78.0, 78.0, 113.0, 130.0], [79.0, 107.0, 75.0, 75.0, 113.0, 130.0], [76.0, 109.0, 72.0, 71.0, 112.0, 133.0], [76.0, 95.0, 77.0, 77.0, 113.0, 132.0], [80.0, 109.0, 74.0, 73.0, 113.0, 130.0], [79.0, 106.0, 76.0, 75.0, 113.0, 130.0], [79.0, 111.0, 70.0, 69.0, 113.0, 131.0], [79.0, 106.0, 72.0, 72.0, 113.0, 130.0], [62.0, 86.0, 66.0, 65.0, 114.0, 137.0], [80.0, 105.0, 72.0, 72.0, 114.0, 130.0], [78.0, 111.0, 68.0, 67.0, 113.0, 132.0], [76.0, 79.0, 100.0, 101.0, 113.0, 132.0], [82.0, 112.0, 71.0, 71.0, 113.0, 129.0], [78.0, 92.0, 99.0, 99.0, 111.0, 131.0], [80.0, 85.0, 98.0, 99.0, 113.0, 130.0], [79.0, 83.0, 94.0, 95.0, 114.0, 130.0], [77.0, 108.0, 64.0, 63.0, 114.0, 131.0], [78.0, 101.0, 66.0, 66.0, 115.0, 130.0], [77.0, 76.0, 103.0, 104.0, 113.0, 131.0], [77.0, 116.0, 62.0, 61.0, 113.0, 132.0], [75.0, 95.0, 103.0, 103.0, 110.0, 134.0], [77.0, 83.0, 100.0, 101.0, 112.0, 132.0], [78.0, 128.0, 60.0, 58.0, 113.0, 131.0], [77.0, 130.0, 57.0, 54.0, 112.0, 132.0], [76.0, 104.0, 76.0, 76.0, 112.0, 132.0], [79.0, 108.0, 63.0, 62.0, 114.0, 130.0], [78.0, 105.0, 69.0, 68.0, 114.0, 131.0], [78.0, 115.0, 64.0, 63.0, 114.0, 131.0], [77.0, 113.0, 59.0, 58.0, 114.0, 131.0], [78.0, 104.0, 66.0, 65.0, 114.0, 131.0], [87.0, 149.0, 66.0, 65.0, 112.0, 126.0], [75.0, 100.0, 61.0, 60.0, 115.0, 132.0], [79.0, 80.0, 101.0, 102.0, 113.0, 130.0], [82.0, 114.0, 67.0, 67.0, 114.0, 128.0], [77.0, 108.0, 71.0, 70.0, 113.0, 131.0], [77.0, 81.0, 103.0, 104.0, 112.0, 132.0], [77.0, 101.0, 100.0, 100.0, 109.0, 133.0], [76.0, 100.0, 88.0, 88.0, 111.0, 132.0], [92.0, 140.0, 112.0, 107.0, 110.0, 119.0], [78.0, 97.0, 77.0, 77.0, 114.0, 131.0], [77.0, 107.0, 62.0, 61.0, 114.0, 131.0], [76.0, 112.0, 82.0, 82.0, 110.0, 133.0], [77.0, 114.0, 64.0, 62.0, 113.0, 132.0], [78.0, 108.0, 66.0, 65.0, 114.0, 131.0], [77.0, 122.0, 59.0, 57.0, 113.0, 131.0], [78.0, 112.0, 63.0, 62.0, 114.0, 131.0], [77.0, 107.0, 64.0, 63.0, 114.0, 131.0], [79.0, 84.0, 100.0, 101.0, 113.0, 130.0], [76.0, 95.0, 74.0, 74.0, 114.0, 132.0]]; var coefficients = [[0.2565290311483519, 0.05267500339987255, 0.0, 0.20950627599236551, 0.0, -0.0, -0.5187103105405902, -0.0, -0.0, -0.0, -0.0, -0.0010448527083486035, -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.109361749511185e-05, -0.0, -9.426169850730758e-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.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.00011249226615670169, -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.0006409460029816403, 0.0, 0.00040390670536696286, 0.0011432982690014588, 0.0, 0.0030922984943534404, -0.0, -0.0, -0.0, -0.0011043550586939232, -0.0031312417046609723, -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.0003006875411720932, -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, -4.069716877917173e-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.0, -0.0, -0.0, -0.00015614271544448882, -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.0001260324256496354, 0.0, 2.9322890352784018e-05, 0.0002757211950621471, 0.0, 2.4966346109946043e-05, 0.0023995095618217694, 0.0184414720268768, 0.0, 0.0, 0.0, 0.0033456629645900147, -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.02418664455328858, -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.0009819061623307815, -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, -2.720436339513482e-05, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0], [0.00011249226615670169, 0.0, 0.0, 0.0, 0.0, 0.00019683988422366055, 0.0, 0.0, 0.0, 0.0003956772868514533, 0.0006134332388744629, 0.0, 0.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, 0.2123274765620007, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.074040885622322, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.430480712493657, 1.0, 1.0, 1.0, 1.0, 0.5190837451319507, 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, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -0.8416583147905249, -0.3942745050194007, -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]]; var intercepts = [-200.28236685326544, -12.722698747576993, -4.683435298339523, -3.3768490916249503, -23.40674493392091, -5.442900557586231, -3.5410727265396282, -34.786982466028775, -4.81798714325947, 39.73211471522999]; var weights = [5, 3, 6, 41, 38]; // Prediction: var clf = new SVC(5, 5, vectors, coefficients, intercepts, weights, "linear", 0.02, 0.0, 3); var prediction = clf.predict(features); console.log(prediction); } }