From 6a4d4115e875e0e438aa60015a28f5a961a9e863 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:07:28 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/ml/lr.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 js/ml/lr.js diff --git a/js/ml/lr.js b/js/ml/lr.js new file mode 100644 index 0000000..f4c0b82 --- /dev/null +++ b/js/ml/lr.js @@ -0,0 +1,66 @@ +/** + * Created by joonkukang on 2014. 1. 12.. + */ +var math = require('./utils').math; +let LogisticRegression = module.exports = function (settings) { + var self = this; + self.x = settings['input']; + self.y = settings['label']; + self.W = math.zeroMat(settings['n_in'],settings['n_out']); + self.b = math.zeroVec(settings['n_out']); + self.settings = { + 'log level' : 1 // 0 : nothing, 1 : info, 2: warn + }; +}; + +LogisticRegression.prototype.train = function (settings) { + var self = this; + var lr = 0.1, epochs = 200; + if(typeof settings['input'] !== 'undefined') + self.x = settings['input']; + if(typeof settings['lr'] !== 'undefined') + lr = settings['lr']; + if(typeof settings['epochs'] !== 'undefined') + epochs = settings['epochs']; + var i; + var currentProgress = 1; + for(i=0;i 0) { + var progress = (1.*i/epochs)*100; + if(progress > currentProgress) { + console.log("LogisticRegression",progress.toFixed(0),"% Completed."); + currentProgress++; + } + } + } + if(self.settings['log level'] > 0) + console.log("LogisticRegression Final Cross Entropy : ",self.getReconstructionCrossEntropy()); +}; + +LogisticRegression.prototype.getReconstructionCrossEntropy = function () { + var self = this; + var probYgivenX = math.softmaxMat(math.addMatVec(math.mulMat(self.x,self.W),self.b)); + var a = math.mulMatElementWise(self.y, math.activateMat(probYgivenX,Math.log)); + var b = math.mulMatElementWise(math.mulMatScalar(math.addMatScalar(self.y,-1),-1), + math.activateMat(math.mulMatScalar(math.addMatScalar(probYgivenX,-1),-1),Math.log)); + var crossEntropy = -math.meanVec(math.sumMatAxis(math.addMat(a,b),1)); + return crossEntropy; +}; + +LogisticRegression.prototype.predict = function (x) { + var self = this; + return math.softmaxMat(math.addMatVec(math.mulMat(x,self.W),self.b)); +}; + +LogisticRegression.prototype.set = function(property,value) { + var self = this; + self.settings[property] = value; +}