Files
yola/zaoYun/master/clf/clf_svm_linear_pro.js
coco 85d885e008 a
2026-07-03 16:29:47 +08:00

164 lines
10 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 = [[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]];
var coefficients = [[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]];
var intercepts = [-75.75078006378519, -20.95003189340926, -13.931254429482717, -10.88428749656037, -60.3146600706958, -6.927566866842887, -23.395247507217405, -33.671889415817894, -23.54485078615138, -108.26857343348372];
var weights = [5, 18, 19, 11, 9];
// 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);
}
}