Comparing version 0.9.4 to 1.0.0
@@ -6,3 +6,3 @@ /* Implementation of Decision Tree classifier, ID3 implementation | ||
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; // for explanations | ||
var sprintf = require("sprintf-js").sprintf; // for explanations | ||
@@ -9,0 +9,0 @@ function DecisionTree(opts) { |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -7,3 +7,4 @@ var fs = require('fs'); | ||
var crypto = require('crypto') | ||
var execSync = require('child_process').execSync | ||
var child_process = require('child_process') | ||
/** | ||
@@ -42,3 +43,3 @@ * Adaptive Boosting (Adaboost) is a greedy search for a linear combination of | ||
try { | ||
var result = execSync("icsiboost"); | ||
child_process.execFileSync("icsiboost"); | ||
return true; | ||
@@ -104,3 +105,5 @@ } catch (err) { | ||
var result = execSync("icsiboost -S ./"+this.folder+"/"+this.assigner+" -n "+this.iterations) | ||
var command = "icsiboost" | ||
var args = ["-S", "./"+this.folder+"/"+this.assigner, "-n", this.iterations] | ||
var result = child_process.execFileSync(command, args) | ||
console.log(result) | ||
@@ -115,3 +118,12 @@ }, | ||
fs.writeFileSync("./"+this.folder+"/"+this.assigner+".test", sample+"\n") | ||
var result = execSync("icsiboost -S ./"+this.folder+"/"+this.assigner +" -W "+this.ngram_length+" -N "+this.text_expert+" -C < ./"+this.folder+"/"+this.assigner+".test > ./"+this.folder+"/"+this.assigner+".output") | ||
var command = "icsiboost" | ||
var args = ["-S", "./"+this.folder+"/"+this.assigner, | ||
"-W", this.ngram_length, | ||
"-N", this.text_expert, | ||
"-C", | ||
"<", | ||
"./"+this.folder+"/"+this.assigner+".test", | ||
">", | ||
"./"+this.folder+"/"+this.assigner+".output"] | ||
var result = child_process.execFileSync(command, args) | ||
var stats = fs.readFileSync("./"+this.folder+"/"+this.assigner+".output", "utf8"); | ||
@@ -118,0 +130,0 @@ |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ var multilabelutils = require('./multilabelutils'); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ var ftrs = require('../../features'); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ var util = require("util"); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ var util = require('util'); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ |
var hash = require("../../utils/hash"); | ||
var FeaturesUnit = require("../../features"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -5,0 +5,0 @@ |
@@ -1,2 +0,2 @@ | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -3,0 +3,0 @@ var multilabelutils = require('./multilabelutils'); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -4,0 +4,0 @@ var util = require("util"); |
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var multilabelutils = require('./multilabelutils'); | ||
@@ -4,0 +4,0 @@ var _ = require("underscore")._; |
@@ -13,3 +13,3 @@ /** | ||
* @param opts options: <ul> | ||
* <li>learn_args - a string with arguments for liblinear_train | ||
* <li>learn_args - an array with arguments for liblinear_train | ||
* <li>model_file_prefix - prefix to path to model file (optional; the default is to create a temporary file in the system temp folder). | ||
@@ -20,5 +20,3 @@ * <li>bias - constant (bias) factor (default: 1). | ||
var util = require('util') | ||
, child_process = require('child_process') | ||
, exec = require('child_process').exec | ||
var child_process = require('child_process') | ||
, fs = require('fs') | ||
@@ -32,3 +30,3 @@ , svmcommon = require('./svmcommon') | ||
function SvmLinear(opts) { | ||
this.learn_args = opts.learn_args || ""; | ||
this.learn_args = opts.learn_args || []; | ||
this.model_file_prefix = opts.model_file_prefix || null; | ||
@@ -51,3 +49,3 @@ this.bias = opts.bias || 1.0; | ||
try { | ||
var result = child_process.execSync('liblinear_train .'); | ||
child_process.execFileSync('liblinear_train .'); | ||
} catch (err) { | ||
@@ -92,9 +90,4 @@ return false | ||
// dataset = _.map(dataset, function(datum){ | ||
// datum.output = this.allLabels.indexOf(datum.output) | ||
// return datum }); | ||
if (this.allLabels.length==1) // a single label | ||
return; | ||
//console.log(util.inspect(dataset,{depth:1})); | ||
if (this.debug) console.log("trainBatch start"); | ||
@@ -105,6 +98,7 @@ var learnFile = svmcommon.writeDatasetToFile( | ||
var command = this.train_command+" "+this.learn_args+" "+learnFile + " "+modelFile; | ||
console.log("running "+command); | ||
var command = this.train_command | ||
var args = this.learn_args.concat([learnFile, modelFile]) | ||
console.log("running "+command+" "+args.join(" ")); | ||
var result = child_process.execSync(command); | ||
var result = child_process.execFileSync(command, args); | ||
if (result.code>0) { | ||
@@ -152,5 +146,6 @@ console.dir(result); | ||
var command = this.test_command+" "+testFile + " " + this.modelFileString + " /tmp/out_" + this.timestamp; | ||
var command = this.test_command | ||
var args = [testFile, this.modelFileString, "/tmp/out_" + this.timestamp]; | ||
var output = child_process.execSync(command) | ||
var output = child_process.execFileSync(command, args) | ||
console.log(command) | ||
@@ -157,0 +152,0 @@ |
@@ -19,4 +19,3 @@ /** | ||
var fs = require('fs') | ||
, util = require('util') | ||
, execSync = require('child_process').execSync | ||
, child_process = require('child_process') | ||
, svmcommon = require('./svmcommon') | ||
@@ -42,3 +41,3 @@ , _ = require("underscore")._; | ||
try { | ||
var result = execSync("svm_perf_learn"); | ||
child_process.execFileSync("svm_perf_learn"); | ||
} catch (err) { | ||
@@ -69,7 +68,7 @@ return false; | ||
var modelFile = learnFile.replace(/[.]learn/,".model"); | ||
var command = "svm_perf_learn "+this.learn_args+" "+learnFile + " "+modelFile; | ||
if (this.debug) console.log("running "+command); | ||
console.log(command) | ||
var command = "svm_perf_learn" | ||
var args = this.learn_args.concat([learnFile, modelFile]); | ||
if (this.debug) console.log("running "+command + args.join(" ")); | ||
var result = execSync(command); | ||
var result = child_process.execFileSync(command, args); | ||
if (result.code>0) { | ||
@@ -76,0 +75,0 @@ console.dir(result); |
@@ -17,3 +17,3 @@ /** | ||
var hash = require("../../utils/hash"); | ||
var sprintf = require("sprintf").sprintf; // for explanations | ||
var sprintf = require("sprintf-js").sprintf; // for explanations | ||
@@ -20,0 +20,0 @@ function WinnowHash(opts) { |
{ | ||
"name": "limdu", | ||
"description": "A machine learning framework for Node.js. Supports multi-level classification and online learning.", | ||
"version": "0.9.4", | ||
"version": "1.0.0", | ||
"author": "Erel Segal-haLevi <erelsgl@gmail.com>", | ||
@@ -14,10 +14,13 @@ "repository": { | ||
"dependencies": { | ||
"async": "*", | ||
"brain.js": "^1.0.5", | ||
"async": "^3.2.4", | ||
"brain.js": "^1.6.1", | ||
"diff": "^5.1.0", | ||
"graph-paths": "latest", | ||
"languagemodel": "latest", | ||
"sprintf": "*", | ||
"lodash": ">=4.17.12", | ||
"minimist": "^1.2.8", | ||
"sprintf-js": "^1.1.2", | ||
"svm": "*", | ||
"temp": "*", | ||
"underscore": "*", | ||
"temp": "^0.9.4", | ||
"underscore": "^1.13.6", | ||
"wordsworth": "*" | ||
@@ -27,3 +30,9 @@ }, | ||
"mocha": ">=1.0.0", | ||
"should": ">=0.6.0" | ||
"should": "^13.2.3", | ||
"@semantic-release/changelog": "^6.0.3", | ||
"@semantic-release/commit-analyzer": "^9.0.2", | ||
"@semantic-release/git": "^10.0.1", | ||
"@semantic-release/github": "^8.0.7", | ||
"@semantic-release/npm": "^10.0.3", | ||
"@semantic-release/release-notes-generator": "^11.0.1" | ||
}, | ||
@@ -47,2 +56,6 @@ "scripts": { | ||
"name": "junchaowu" | ||
}, | ||
{ | ||
"name": "Maximilian Berkmann", | ||
"email": "maxieberkmann@gmail.com" | ||
} | ||
@@ -70,3 +83,3 @@ ], | ||
], | ||
"license": "LGPL" | ||
"license": "LGPL-2.0-or-later" | ||
} |
@@ -13,6 +13,8 @@ # Limdu.js | ||
<!--a href="https://tracking.gitads.io/?repo=limdu"> <img src="https://images.gitads.io/limdu" alt="GitAds"/> </a--> | ||
## Demos | ||
You can run the demos from this project: [limdu-demo](https://github.com/erelsgl/limdu-demo). | ||
**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* | ||
@@ -19,0 +21,0 @@ |
@@ -0,1 +1,3 @@ | ||
#!mocha | ||
var ulist = require('../../utils/list'); | ||
@@ -2,0 +4,0 @@ var should = require('should'); |
@@ -0,1 +1,3 @@ | ||
#!mocha | ||
/** | ||
@@ -2,0 +4,0 @@ * a unit-test for Partitions unit (creating partitions for train and test) |
@@ -0,1 +1,3 @@ | ||
#!mocha | ||
/** | ||
@@ -29,46 +31,32 @@ * a unit-test for PrecisionRecall unit | ||
var pr = new mlutils.PrecisionRecall(); | ||
var expl = pr.addCasesHash([1,2,3,4,5], [1,3,5,7], true) | ||
var expl = pr.addCases(/*expectedClasses=*/[1,2,3,4,5], /*actualClasses=*/[1,3,5,7], /*log true positives=*/true) | ||
_.isEqual(expl.TP, ["1","3","5"]).should.be.true | ||
_.isEqual(expl.FP, ["7"]).should.be.true | ||
_.isEqual(expl.FN, ["2","4"]).should.be.true | ||
pr.labels["1"]["TP"].should.equal(1) | ||
pr.labels["4"]["FN"].should.equal(1) | ||
pr.labels["7"]["FP"].should.equal(1) | ||
_.isEqual(pr.TP, 3).should.be.true // ["1","3","5"] | ||
_.isEqual(pr.FP, 1).should.be.true // ["7"] | ||
_.isEqual(pr.FN, 2).should.be.true // ["2","4"] | ||
var expl = pr.addCasesHash([1,3,4,5], [1,2,8],true) | ||
_.isEqual(expl.TP, ["1"]).should.be.true | ||
_.isEqual(expl.FP, ["2","8"]).should.be.true | ||
_.isEqual(expl.FN, ["3","4","5"]).should.be.true | ||
var expl = pr.addCases([1,3,4,5], [1,2,8],true) | ||
pr.labels["1"]["TP"].should.equal(2) | ||
pr.labels["8"]["FP"].should.equal(1) | ||
_.isEqual(pr.TP, 1).should.be.true // ["1"] | ||
_.isEqual(pr.FP, 2).should.be.true // ["2","8"] | ||
_.isEqual(pr.FN, 3).should.be.true // ["3","4","5"] | ||
pr.calculateStats(); | ||
pr.labels["1"]["F1"].should.equal(1) | ||
pr.labels["3"]["Recall"].should.equal(1/2) | ||
pr.labels["3"]["Precision"].should.equal(1) | ||
pr.labels["3"]["Recall"].should.equal(0.5) | ||
pr.Accuracy.should.equal(0); | ||
pr.microPrecision.should.equal(4/(4+3)); | ||
pr.microRecall.should.equal(4/(4+5)); | ||
pr.microF1.should.equal(2*pr.microPrecision*pr.microRecall/(pr.microPrecision+pr.microRecall)); | ||
pr.Precision.should.equal(4/(4+3)); // microPrecision | ||
pr.Recall.should.equal(4/(4+5)); // microRecall | ||
pr.F1.should.equal(2*pr.Precision*pr.Recall/(pr.Precision+pr.Recall)); | ||
pr.macroRecall.should.equal((0.5 + 0 + 0.5 + 0 + 1)/7) | ||
pr.macroPrecision.should.equal(3/7) | ||
pr.macroF1.should.equal((1+2/3+2/3)/7) | ||
// pr.macroRecall.should.equal((0.5 + 0 + 0.5 + 0 + 1)/7.0) | ||
// pr.macroPrecision.should.equal(3/7) | ||
// pr.macroF1.should.equal((1+2/3+2/3)/7) | ||
var expl = pr.addCasesHash([5,2,7,8], [2,3,7,4,8],true) | ||
pr.labels["2"]["TP"].should.equal(1) | ||
pr.calculateStats(); | ||
pr.macroF1.should.equal((2/3+2/3+0.5+0.5+0.5+1)/7) | ||
pr.macroPrecision.should.equal((1+0.5+0.5+0+1+0.5+0.5)/7) | ||
pr.macroRecall.should.equal((1+0.5+0.5+0+1/3+1+1)/7) | ||
// pr.macroF1.should.equal((2/3+2/3+0.5+0.5+0.5+1)/7) | ||
// pr.macroPrecision.should.equal((1+0.5+0.5+0+1+0.5+0.5)/7) | ||
// pr.macroRecall.should.equal((1+0.5+0.5+0+1/3+1+1)/7) | ||
}); | ||
@@ -89,4 +77,4 @@ | ||
pr.Accuracy.should.equal(1/3) | ||
pr.microPrecision.should.equal(7/9) | ||
pr.microRecall.should.equal(7/9) | ||
pr.Precision.should.equal(7/9) | ||
pr.Recall.should.equal(7/9) | ||
}) | ||
@@ -105,4 +93,4 @@ | ||
pr.macroF1.should.equal(0.8/3) | ||
pr.microF1.should.equal(1/3) | ||
// pr.macroF1.should.equal(0.8/3) | ||
pr.F1.should.equal(1/3) | ||
@@ -113,4 +101,4 @@ pr.addCasesHash([2], [2], 1); | ||
pr.macroF1.should.equal((0.8+0.4)/3) | ||
pr.microF1.should.equal(0.42857142857142855) | ||
// pr.macroF1.should.equal((0.8+0.4)/3) | ||
pr.F1.should.equal(0.42857142857142855) | ||
@@ -126,117 +114,16 @@ pr.addCasesHash([1], [1], 1); | ||
// it.skip('uniqueaggregate', function() { | ||
// var pr = new mlutils.PrecisionRecall(); | ||
// var ac = [['Greet',[1,5]], ['Offer',[0,5]], ['Greet',[0,6]], ['Offer',[9,15]], ['Greet',[0,9]]] | ||
// var output = pr.uniqueaggregate(ac) | ||
// output.length.should.equal(3) | ||
// var actual = pr.uniquecandidate(output) | ||
// _.isEqual(actual[0], ['Greet',[0,9]]).should.be.true | ||
// }) | ||
// it.skip('correctly calculates precision, recall, accuracy in sequence format.', function() { | ||
// var pr = new mlutils.PrecisionRecall(); | ||
// var expected = | ||
// [ | ||
// ["Offer", [13,26]], | ||
// ["Working Hours", [6,9]], | ||
// ["8 hours", [3,12]], | ||
// ["10 hours", []] | ||
// ] | ||
// var actual = | ||
// [ | ||
// ['Offer',[13,25]], | ||
// ['Salary', [3,6]], | ||
// ['8 hours', [3,5]], | ||
// ['10 hours', [9,15]], | ||
// ] | ||
// var stats = pr.addCasesHashSeq(expected, actual, 1); | ||
// _.isEqual(stats['TP'], ['10 hours', '8 hours', 'Offer']).should.equal(true) | ||
// _.isEqual(stats['FP'], ['Salary']).should.equal(true) | ||
// _.isEqual(stats['FN'], ['Working Hours']).should.equal(true) | ||
// var results = pr.retrieveStats() | ||
// var stats = pr.addCasesHashSeq(expected, actual, 1); | ||
// }); | ||
// it.skip('intersection', function() { | ||
// var pr = new mlutils.PrecisionRecall(); | ||
// var actual = [5,10] | ||
// var expected = [8,15] | ||
// var stats = pr.intersection(actual, expected) | ||
// stats.should.be.true | ||
// var actual = [5,10] | ||
// var expected = [12,15] | ||
// var stats = pr.intersection(actual, expected) | ||
// stats.should.be.false | ||
// }) | ||
// it.skip('repetitions in sequence format', function() { | ||
// var pr = new mlutils.PrecisionRecall(); | ||
// var expected = [[]] | ||
// var actual = | ||
// [ | ||
// ['Offer',[13,25], 'i offer'], | ||
// ['Offer', [14,27], 'ok'], | ||
// ] | ||
// var stats = pr.addCasesHashSeq(expected, actual, 1); | ||
// _.isEqual(stats, { TP: [], FP: [ 'Offer' ], FN: [] }).should.be.true | ||
// }) | ||
it('correctly calculates precision, recall, accuracy in hash format.', function() { | ||
var pr = new mlutils.PrecisionRecall(); | ||
var stats = pr.addCasesHash([1,2,3,4,5], [1,3,5,7], 1); | ||
_.isEqual(pr.labels['1'],{ TP: 1, FP: 0, FN: 0 }).should.equal(true) | ||
// _.isEqual(pr.labels['1'],{ TP: 1, FP: 0, FN: 0 }).should.equal(true) | ||
var stats = pr.addCasesHash([1,5,9,2], [7,4], 1); | ||
_.isEqual(pr.labels['1'],{ TP: 1, FP: 0, FN: 1 }).should.equal(true) | ||
_.isEqual(pr.labels['7'],{ TP: 0, FP: 2, FN: 0 }).should.equal(true) | ||
_.isEqual(pr.labels['9'],{ TP: 0, FP: 0, FN: 1 }).should.equal(true) | ||
// _.isEqual(pr.labels['1'],{ TP: 1, FP: 0, FN: 1 }).should.equal(true) | ||
// _.isEqual(pr.labels['7'],{ TP: 0, FP: 2, FN: 0 }).should.equal(true) | ||
// _.isEqual(pr.labels['9'],{ TP: 0, FP: 0, FN: 1 }).should.equal(true) | ||
var stats = pr.addCasesHash([19,4,7], [12,7,4,2,76,19,1], 1); | ||
_.isEqual(pr.labels['7'],{ TP: 1, FP: 2, FN: 0 }).should.equal(true) | ||
// _.isEqual(pr.labels['7'],{ TP: 1, FP: 2, FN: 0 }).should.equal(true) | ||
pr.calculateStats() | ||
pr.labels['1']['F1'].should.equal(2*0.5*0.5/(1)) | ||
pr.labels['7']['F1'].should.equal((2*1/3)/(4/3)) | ||
}) | ||
// it.skip('correctly calculates dependencies between labels', function() { | ||
// var pr = new mlutils.PrecisionRecall(); | ||
// var expected = [[]] | ||
// var actual = | ||
// [ | ||
// ['Offer',[13,25], 'i offer'], | ||
// ['Accept', [10,27], 'offer'], | ||
// ['Reject', [30,45], 'reject'], | ||
// ] | ||
// var stats = pr.addCasesHashSeq(expected, actual, 1); | ||
// var actual = | ||
// [ | ||
// ['Offer',[13,25], 'i offer'], | ||
// ['Offer',[14,25], 'offer'], | ||
// ['Accept', [60,70], 'agree'], | ||
// ['Reject', [90,100], 'decline'] | ||
// ] | ||
// var stats = pr.addCasesHashSeq(expected, actual, 1); | ||
// pr.calculateStats() | ||
// var gold = {"Offer": { "Offer": [ "i offer", "i offer" ], "Accept": [ "offer" ] }, | ||
// "Accept": { "Accept": [ "offer", "agree" ], "Offer": [ "i offer" ] }, | ||
// "Reject": { "Reject": [ "reject", "decline" ] }} | ||
// _.isEqual(pr.retrieveStats()['interdep'], gold).should.be.true | ||
// }) | ||
}) | ||
var hash = require("./hash"); | ||
var sprintf = require('sprintf').sprintf; | ||
var _ = require('underscore')._; | ||
var sprintf = require("sprintf-js").sprintf; | ||
var _ = require("underscore")._; | ||
@@ -20,12 +20,12 @@ /** | ||
var PrecisionRecall = function() { | ||
this.count = 0; | ||
this.TP = 0; | ||
this.TN = 0; | ||
this.FP = 0; | ||
this.FN = 0; | ||
this.TRUE = 0; | ||
this.startTime = new Date(); | ||
this.count = 0; // total count | ||
this.TP = 0; // True Positive count | ||
this.TN = 0; // True Negative count | ||
this.FP = 0; // False Positive count | ||
this.FN = 0; // False Negative count | ||
this.TRUE = 0; // Total true count (TP+TN) | ||
this.startTime = new Date(); | ||
this.labels = {} | ||
this.dep = {} | ||
this.confusion = {} | ||
this.confusion = {} // confusion matrix | ||
} | ||
@@ -57,21 +57,20 @@ | ||
*/ | ||
addCasesLabels: function (expectedClasses, actualClasses ) { | ||
var explanations = []; | ||
actualClasses = hash.normalized(actualClasses); | ||
actualClasses = hash.normalized(actualClasses); // converts e.g. ['a', 'b', 'c'..] to a hash {'a': true, 'b': true, 'c': true}; | ||
expectedClasses = hash.normalized(expectedClasses); | ||
var allTrue = true; | ||
actualClassesList = Object.keys(actualClasses) | ||
expectedClassesList = Object.keys(expectedClasses) | ||
if (!(Object.keys(expectedClasses)[0] in this.confusion)) | ||
this.confusion[Object.keys(expectedClasses)[0]] = {} | ||
if (!(expectedClassesList[0] in this.confusion)) | ||
this.confusion[expectedClassesList[0]] = {} | ||
if (!(Object.keys(actualClasses)[0] in this.confusion[Object.keys(expectedClasses)[0]])) | ||
this.confusion[Object.keys(expectedClasses)[0]][Object.keys(actualClasses)[0]] = 0 | ||
if (!(Object.keys(actualClasses)[0] in this.confusion[expectedClassesList[0]])) | ||
this.confusion[expectedClassesList[0]][Object.keys(actualClasses)[0]] = 0 | ||
this.confusion[Object.keys(expectedClasses)[0]][Object.keys(actualClasses)[0]] += 1 | ||
this.confusion[expectedClassesList[0]][Object.keys(actualClasses)[0]] += 1 | ||
for (var actualClass in actualClasses) { | ||
if (!(actualClass in this.confusion)) | ||
@@ -85,3 +84,3 @@ this.confusion[actualClass]={} | ||
this.labels[actualClass]['FN']=0 | ||
} | ||
} | ||
@@ -111,6 +110,5 @@ if (actualClass in expectedClasses) { | ||
/* intented to calculate macro and micro average */ | ||
addPredicition: function(expected, actual) | ||
{ | ||
this.addCasesHash(expected, actual, 1) | ||
this.addCasesLabels(expected, actual) | ||
addPredicition: function(expectedClasses, actualClasses) { | ||
this.addCasesHash(expectedClasses, actualClasses, 1) | ||
this.addCasesLabels(expectedClasses, actualClasses) | ||
}, | ||
@@ -157,5 +155,5 @@ | ||
/** | ||
/** | ||
* Record the result of a new classes experiment in a hash manner. | ||
* Doesn't allowed to do a inner output, all stats are put in hash | ||
* Does not do external output -- all stats are put in hash. | ||
* @param expectedClasses - the expected set of classes (as an array or a hash). | ||
@@ -167,4 +165,2 @@ * @param actualClasses - the actual set of classes (as an array or a hash). | ||
*/ | ||
// micro - average | ||
addCasesHash: function (expectedClasses, actualClasses, logTruePositives ) { | ||
@@ -196,3 +192,2 @@ var explanations = {}; | ||
if (allTrue) { | ||
// if ((logTruePositives)&& (!only_false_cases)) explanations.push("\t\t*** ALL TRUE!"); | ||
this.TRUE++; | ||
@@ -203,3 +198,2 @@ } | ||
_.each(explanations, function(value, key, list){ | ||
// explanations[key] = _.sortBy(explanations[key], function(num){ num }); | ||
explanations[key].sort() | ||
@@ -206,0 +200,0 @@ }, this) |
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 4 instances in 1 package
Misc. License Issues
License(Experimental) A package's licensing information has fine-grained problems.
Found 1 instance in 1 package
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
108
0
1
3
478
3
394162
12
8
9096
+ Addeddiff@^5.1.0
+ Addedlodash@>=4.17.12
+ Addedminimist@^1.2.8
+ Addedsprintf-js@^1.1.2
+ Addeddiff@5.2.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedsprintf-js@1.1.3(transitive)
- Removedsprintf@*
- Removedsprintf@0.1.5(transitive)
Updatedasync@^3.2.4
Updatedbrain.js@^1.6.1
Updatedtemp@^0.9.4
Updatedunderscore@^1.13.6