UNPKG

qminer

Version:

A C++ based data analytics platform for processing large-scale real-time streams containing structured and unstructured data

214 lines (205 loc) 10 kB
/** * Copyright (c) 2015, Jozef Stefan Institute, Quintelligence d.o.o. and contributors * All rights reserved. * * This source code is licensed under the FreeBSD license found in the * LICENSE file in the root directory of this source tree. */ // JavaScript source code var la = require('../../index.js').la; var analytics = require('../../index.js').analytics; var assert = require("../../src/nodejs/scripts/assert.js"); // Recommender System Unit Tests describe("RecommenderSys tests", function () { describe("Constructor tests", function () { it("should not throw an exception", function () { assert.doesNotThrow(function () { var recSys = new analytics.RecommenderSys(); }); }) it("should create the object with the default parameters", function () { var recSys = new analytics.RecommenderSys(); var params = recSys.getParams(); assert.strictEqual(params.iter, 10000); assert.strictEqual(params.tol, 1e-3); assert.strictEqual(params.k, 2); assert.strictEqual(params.verbose, false); }) it("should create the object with the given parameters", function () { var recSys = new analytics.RecommenderSys({ iter: 100, tol: 1e-3, k: 20, verbose: true }); var params = recSys.getParams(); assert.strictEqual(params.iter, 100); assert.eqtol(params.tol, 1e-3); assert.strictEqual(params.k, 20); assert.strictEqual(params.verbose, true); }) it("should create the object with the given parameters, even when the given parameters doesn't have the correct key-values", function () { var recSys = new analytics.RecommenderSys({ fruit: 100, blouse: 20, house: true }); var params = recSys.getParams(); assert.strictEqual(params.iter, 10000); assert.strictEqual(params.k, 2); assert.strictEqual(params.verbose, false); }) }); describe("GetParams tests", function () { it("should not throw an exception", function () { var recSys = new analytics.RecommenderSys(); assert.doesNotThrow(function () { var params = recSys.getParams(); }); }) it("should return the parameters of the object", function () { var recSys = new analytics.RecommenderSys(); var params = recSys.getParams(); assert.strictEqual(params.iter, 10000); assert.eqtol(params.tol, 1e-3); assert.strictEqual(params.k, 2); assert.strictEqual(params.verbose, false); }) it("should throw an exception if parameters are given to the function", function () { var recSys = new analytics.RecommenderSys({ iter: 100, k: 20, verbose: true }); assert.throws(function () { var params = recSys.getParams(1); }); }) it("should return the parameters in the same format for constructing a new object", function () { var recSys = new analytics.RecommenderSys({ iter: 100, k: 20, verbose: true }); var params = recSys.getParams(); var recSys2 = new analytics.RecommenderSys(params); var params2 = recSys2.getParams(); assert.strictEqual(params.iter, params2.iter); assert.strictEqual(params.tol, params2.tol); assert.strictEqual(params.k, params2.k); assert.strictEqual(params.verbose, params.verbose); }) }); describe("SetParams tests", function () { it("should not throw an exception", function () { var recSys = new analytics.RecommenderSys(); var params = { iter: 100, k: 20, verbose: true }; assert.doesNotThrow(function () { recSys.setParams(params); }); }) it("should set the parameters of the object", function () { var recSys = new analytics.RecommenderSys(); var params = { iter: 100, k: 20, tol: 1e-6, verbose: true }; recSys.setParams(params); var params2 = recSys.getParams(); assert.strictEqual(params.iter, params2.iter); assert.strictEqual(params.k, params2.k); assert.strictEqual(params.tol, params2.tol); assert.strictEqual(params.verbose, params2.verbose); }) it("should throw an exception if no parameter is given", function () { var recSys = new analytics.RecommenderSys(); assert.throws(function () { recSys.setParams(params); }); }) }); describe("Fit tests", function () { it("should not throw an exception", function () { var recSys = new analytics.RecommenderSys(); var mat = new la.Matrix([[1, 0.5, 0, 1], [0, 3, 0, 0], [0, 0.5, 0, 3], [0, 0, 0.4, 1]]); assert.doesNotThrow(function () { recSys.fit(mat); }); }) it("should fit the model, dense matrix", function () { var recSys = new analytics.RecommenderSys(); var mat = new la.Matrix([[1, 0.5, 0, 1], [0, 3, 0, 0], [0, 0.5, 0, 3], [0, 0, 0.4, 1]]); recSys.fit(mat); var model = recSys.getModel(); assert.strictEqual(model.U.rows, 4); assert.strictEqual(model.U.cols, 2); assert.strictEqual(model.V.rows, 2); assert.strictEqual(model.V.cols, 4); }) it('should fit the model, sparse matrix', function () { var recSys = new analytics.RecommenderSys(); var mat = new la.SparseMatrix([[[0, 1]], [[0, 5], [1, 3], [2, 5]], [[3, 4]], [[0, 1], [2, 3], [3, 1]]]); recSys.fit(mat); var model = recSys.getModel(); assert.strictEqual(model.U.rows, 4); assert.strictEqual(model.U.cols, 2); assert.strictEqual(model.V.rows, 2); assert.strictEqual(model.V.cols, 4); }) it("should throw an exception, if the parameter k is greater of the min dimension of matrix, dense matrix", function () { var recSys = new analytics.RecommenderSys({ k: 10 }); var mat = new la.Matrix([[1, 0.5, 0, 1], [0, 3, 0, 0], [0, 0.5, 0, 3], [0, 0, 0.4, 1]]); assert.throws(function () { recSys.fit(mat); }); }) it("should throw an exception, if the parameter k is greater of the min dimension of matrix, sparse matrix", function () { var recSys = new analytics.RecommenderSys({ k: 10 }); var mat = new la.SparseMatrix([[[0, 1]], [[0, 5], [1, 3], [2, 5]], [[3, 4]], [[0, 1], [2, 3], [3, 1]]]); assert.throws(function () { recSys.fit(mat); }); }) }); describe("GetModel tests", function () { it("should not throw an exception", function () { var recSys = new analytics.RecommenderSys(); assert.doesNotThrow(function () { var model = recSys.getModel(); }); }) it("should return an empty matrices of the model", function () { var recSys = new analytics.RecommenderSys(); var model = recSys.getModel(); assert.strictEqual(model.U.rows, 0); assert.strictEqual(model.U.cols, 0); assert.strictEqual(model.V.rows, 0); assert.strictEqual(model.V.cols, 0); }) it("should return the model of the fitted data, dense matrix", function () { var recSys = new analytics.RecommenderSys(); var mat = new la.Matrix([[1, 0.5, 0, 1], [0, 3, 0, 0], [0, 0.5, 0, 3], [0, 0, 0.4, 1]]); recSys.fit(mat); var model = recSys.getModel(); assert.strictEqual(model.U.rows, 4); assert.strictEqual(model.U.cols, 2); assert.strictEqual(model.V.rows, 2); assert.strictEqual(model.V.cols, 4); }) it("should return the model of the fitted data, sparse matrix", function () { var recSys = new analytics.RecommenderSys(); var mat = new la.SparseMatrix([[[0, 1]], [[0, 5], [1, 3], [2, 5]], [[3, 4]], [[0, 1], [2, 3], [3, 1]]]); recSys.fit(mat); var model = recSys.getModel(); assert.strictEqual(model.U.rows, 4); assert.strictEqual(model.U.cols, 2); assert.strictEqual(model.V.rows, 2); assert.strictEqual(model.V.cols, 4); }) it("should throw an exception, if some parameters are given to the function", function () { var recSys = new analytics.RecommenderSys(); assert.throws(function () { var model = recSys.getModel(1); }); }) }); describe("Save and load test", function () { it("should serialize and deserialize the model", function () { var recSys = new analytics.RecommenderSys({ tol: 1e-6, iter: 101, verbose: false, k: 2 }); var matrix = new la.Matrix([[0, 1], [1, 0]]); recSys.fit(matrix); var params = recSys.getParams(); var model = recSys.getModel(); recSys.save(require('../../index.js').fs.openWrite('recommenderSys_test.bin')).close(); var recSys2 = new analytics.RecommenderSys(require('../../index.js').fs.openRead('recommenderSys_test.bin')); var params2 = recSys2.getParams(); var model2 = recSys2.getModel(); assert.strictEqual(params.iter, params2.iter); assert.strictEqual(params.k, params2.k); assert.strictEqual(params.tol, params2.tol); assert.strictEqual(params.verbose, params2.verbose); assert.eqtol(model.U.minus(model2.U).frob(), 0); assert.eqtol(model.V.minus(model2.V).frob(), 0); }); }); })