/** * The distance function that is specifically made for Poker Hands data set. * The suit of the cards does not play an important role when finding * the differences in poker hands so it was not used in calculations. * @param {node} source * @param {node} target * @return {number} the distance between source and target nodes. */ function calculateDistancePoker(source, target) { var sumDiff = 0.0, ordDiff = 1.0, ORD_FACTOR = 1.5, cards = ["C1", "C2", "C3", "C4", "C5"], cols = 0; // Iterate through cards for (var i = 0; i < cards.length; i++) { card = cards[i]; if (source.hasOwnProperty(card) && target.hasOwnProperty(card)) { var s = parseInt(source[card]), t = parseInt(target[card]); // Calculate the squared difference. sumDiff += (s-t) * (s-t); } } // Class of poker hands describes the similarities the best // so give it more priority than checking the differences between cards. if (source.hasOwnProperty("CLASS") && target.hasOwnProperty("CLASS")) { var s = parseInt(source["CLASS"]), t = parseInt(target["CLASS"]); // If classes differ, then scale them by a factor. if (s !== t) { ordDiff *= (ORD_FACTOR * (Math.abs(s-t))) } } sumDiff = Math.sqrt(sumDiff); sumDiff *= ordDiff; return sumDiff; }