164 lines
13 KiB
JavaScript
164 lines
13 KiB
JavaScript
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':
|
|
// <x,x'>
|
|
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<x,x'>+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<x,x'>+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 = [[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]];
|
|
var coefficients = [[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]];
|
|
var intercepts = [135.44946084187507, 19.061780278345406, 1.7400393672676422, -19.356133000309267, 1.28390685777037, -36.177967480292565];
|
|
var weights = [55, 52, 12, 4];
|
|
|
|
// Prediction:
|
|
var clf = new SVC(4, 4, vectors, coefficients, intercepts, weights, "linear", 0.02, 0.0, 3);
|
|
var prediction = clf.predict(features);
|
|
console.log(prediction);
|
|
|
|
}
|
|
} |