From 885a68384b15c43d162fa68b00afb221847b7036 Mon Sep 17 00:00:00 2001 From: yoel-zeldes Date: Sun, 16 Aug 2015 23:45:13 +0300 Subject: [PATCH] add tests to getDistance --- lib/similarity.js | 6 +-- test/test.js | 102 +++++++++++++++++++++++++++++----------------- 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/lib/similarity.js b/lib/similarity.js index 7cf112a..5938a4e 100644 --- a/lib/similarity.js +++ b/lib/similarity.js @@ -12,7 +12,7 @@ exports.getDistance = function(dataSet, key1, key2) { // get the list of shared_items var sharedItems = {}; for (var itemKey in dataSet[key1]) { - if (typeof(dataSet[key2][itemKey]) !== 'undefined') { + if (dataSet[key2][itemKey] !== undefined) { sharedItems[itemKey] = 1; } } @@ -25,7 +25,7 @@ exports.getDistance = function(dataSet, key1, key2) { // add up the squares of all the differences var squares = []; for (var itemKey in dataSet[key1]) { - if (typeof(dataSet[key2][itemKey]) !== 'undefined') { + if (dataSet[key2][itemKey] !== undefined) { var square = Math.pow( dataSet[key1][itemKey] - dataSet[key2][itemKey], 2 ); squares.push( square ); } @@ -39,7 +39,7 @@ exports.getPearson = function(dataSet, key1, key2) { // get the list of mutially rated items var sharedItems = {}; for (var itemKey in dataSet[key1]) { - if (typeof(dataSet[key2][itemKey]) !== 'undefined') { + if (dataSet[key2][itemKey] !== undefined) { sharedItems[itemKey] = 1; } } diff --git a/test/test.js b/test/test.js index c7d1127..b890b8e 100644 --- a/test/test.js +++ b/test/test.js @@ -6,50 +6,45 @@ var similarity = require('../lib/similarity'); var Recommend = require('../lib/recommend'); -var getRandomInteger = function(min, max) { - return Math.floor( Math.random() * max ) + min; -}; - -var getRandomKey = function(dataSet) { - var keys = Object.keys(dataSet); - var rand = getRandomInteger(0, keys.length); - return keys[rand]; -}; - - describe('Recommend', function() { - var recommend = undefined; - var key = undefined; - var key1 = undefined; - var key2 = undefined; - - before( function(done) { - recommend = new Recommend(dataSet); - key = getRandomKey(dataSet); - key1 = getRandomKey(dataSet); - key2 = getRandomKey(dataSet); - - should.exist(recommend); - should.exist(recommend.dataSet); - should.exist(recommend.reversedDataSet); - should.exist(key); - should.exist(key1); - should.exist(key2); - - done(); - }); - describe('similarity', function() { - it('#getDistance()', function(done) { - var distance = similarity.getDistance(dataSet, key1, key2); - should.exist(distance); - // console.log( 'similarity.getDistance(dataSet, ' + key1 + ', ' + key2 + ') === ' + distance ); + function createDataSet() { + return Array.prototype.reduce.call(arguments, function addUserToDataSet(dataSet, arg, index) { + dataSet[index] = {}; + arg.forEach(function copyDefinedItems(score, item) { + if (score !== undefined) { + dataSet[index][item] = score; + } + }); + return dataSet; + }, {}); + } + + describe('#getDistance()', function() { + + it('should be 1 for the same user', function () { + var distance = similarity.getDistance(createDataSet([1], [1]), 0, 0); + should.equal(distance, 1); + }); - done(); + it('should be 0 for users with no shared items', function () { + var distance = similarity.getDistance(createDataSet([1, undefined], [undefined, 1]), 0, 1); + should.equal(distance, 0); + }); + + it('should be 1 for users if the shared items have the same score', function () { + var distance = similarity.getDistance(createDataSet([1, 1, undefined], [undefined, 1, 3]), 0, 1); + should.equal(distance, 1); + }); + + it('should be 0.5 for users if there is one shared item but the scores differ by 1', function () { + var distance = similarity.getDistance(createDataSet([1], [2]), 0, 1); + should.equal(distance, 0.5); + }); }); it('#getPearson()', function(done) { - var pearsonScore = similarity.getPearson(dataSet, key1, key2); + var pearsonScore = similarity.getPearson(createDataSet([1], [2]), 0, 1); should.exist(pearsonScore); // console.log( 'similarity.getPearson(dataSet, ' + key1 + ', ' + key2 + ') === ' + pearsonScore ); @@ -58,6 +53,37 @@ describe('Recommend', function() { }); describe('recommend', function() { + var recommend = undefined; + var key = undefined; + var key1 = undefined; + var key2 = undefined; + + var getRandomInteger = function(min, max) { + return Math.floor( Math.random() * max ) + min; + }; + + var getRandomKey = function(dataSet) { + var keys = Object.keys(dataSet); + var rand = getRandomInteger(0, keys.length); + return keys[rand]; + }; + + before( function(done) { + recommend = new Recommend(dataSet); + key = getRandomKey(dataSet); + key1 = getRandomKey(dataSet); + key2 = getRandomKey(dataSet); + + should.exist(recommend); + should.exist(recommend.dataSet); + should.exist(recommend.reversedDataSet); + should.exist(key); + should.exist(key1); + should.exist(key2); + + done(); + }); + it('#getTopMatches()', function(done) { recommend.getTopMatches(key, function(err, topMatches) { should.not.exist(err);