Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/similarity.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand All @@ -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 );
}
Expand All @@ -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;
}
}
Expand Down
102 changes: 64 additions & 38 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand All @@ -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);
Expand Down