New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

limdu

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

limdu - npm Package Compare versions

Comparing version 0.9.4 to 1.0.0

.github/workflows/publish.yml

2

classifiers/decisiontree/DecisionTree.js

@@ -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)

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc