43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
/**
|
|
* Created by joonkukang on 2014. 1. 16..
|
|
*/
|
|
var utils = require('./utils');
|
|
var math = utils.math;
|
|
let nmf = module.exports;
|
|
|
|
nmf.factorize = function(options) {
|
|
var fc = options['features'];
|
|
var matrix = options['matrix'];
|
|
var epochs = options['epochs'];
|
|
var row = math.shape(matrix)[0], col = math.shape(matrix)[1];
|
|
var a = math.randMat(row,fc,0,1);
|
|
var b = math.randMat(fc,col,0,1);
|
|
|
|
var i;
|
|
for(i=0 ; i<epochs; i++) {
|
|
var ab = math.mulMat(a,b)
|
|
// cost = difcost(ab,matrix);
|
|
// if(i % 10 ==0) console.log("cost ",cost);
|
|
// if(cost == 0) break;
|
|
var bn = math.mulMat(math.transpose(a),matrix);
|
|
var bd = math.mulMat(math.mulMat(math.transpose(a),a),b);
|
|
|
|
b = math.activateTwoMat(math.mulMatElementWise(b,bn),bd,function(x,y){return x/y});
|
|
|
|
var an = math.mulMat(matrix, math.transpose(b));
|
|
var ad = math.mulMat(math.mulMat(a,b), math.transpose(b));
|
|
|
|
a = math.activateTwoMat(math.mulMatElementWise(a,an),ad,function(x,y){return x/y});
|
|
}
|
|
return [a,b];
|
|
}
|
|
|
|
function difcost(mat1,mat2) {
|
|
var row = math.shape(mat1)[0], col = math.shape(mat1)[1];
|
|
var i , j, difcost=0;
|
|
for(i=0;i<row;i++)
|
|
for(j=0;j<col;j++)
|
|
difcost += Math.pow(mat1[i][j] - mat2[i][j],2);
|
|
return difcost;
|
|
}
|