Files
d3-spring-model/examples/js/distances/normalization.js
2018-03-22 16:40:27 +00:00

91 lines
2.5 KiB
JavaScript

/**
* Calculate the values that are used for normalizing the data.
* @param {array} nodes
* @return {object} that contains the normalization parameters.
*/
function calculateNormalization (nodes) {
var STANDARD_DEV = 2.0,
properties = Object.keys(nodes[0]),
sums = calculateSums(nodes, properties),
average = [],
sigma = [];
// For each property, calculate mean and sigma.
for (var i = 0; i < properties.length; i++) {
var avg = sums.sumOfVal[i] / nodes.length;
average[i] = avg;
sigma[i] = Math.sqrt((sums.sumOfSq[i] - (nodes.length * Math.pow(avg, 2))) / nodes.length);
}
return {
avg: average,
sig: sigma,
st_d: standardDevation(nodes, properties, average)
};
}
function standardDevation (nodes, properties, avg) {
var stDev = new Array(properties.length).fill(0);
for (var i = 0; i < properties.length; i++) {
var sum = 0;
nodes.forEach(function (node) {
var val = node[properties[i]];
var parsedDate = Date.parse(val);
var propAvg = avg[i];
if (isNaN(val) && !isNaN(parsedDate)) {
val = parsedDate.valueOf();
} else if (isNumeric(val)) {
val = parseFloat(val);
// Ignore the strings.
} else {
val = 0;
}
sum += Math.pow(val - propAvg, 2);
});
stDev[i] = Math.sqrt(sum / nodes.length);
}
return stDev;
}
// Calculate the sum of values and the squared sum
/**
* Calculate the sums of each property.
* @param {array} nodes
* @param {array} properties - list of properties
* @return {object} that contains arrays with sum of values
* and the squared sums.
*/
function calculateSums (nodes, properties) {
var sumOfValues = new Array(properties.length).fill(0),
sumOfSquares = new Array(properties.length).fill(0);
// Calculate the sums for each node.
nodes.forEach(function (node) {
for (var i = 0; i < properties.length; i++) {
var val = node[properties[i]];
var parsedDate = Date.parse(val);
if (isNaN(val) && !isNaN(parsedDate)) {
sumOfValues[i] += parsedDate.valueOf();
sumOfSquares[i] += Math.pow(parsedDate.valueOf(), 2);
} else if (isNumeric(val)) {
sumOfValues[i] += parseFloat(val);
sumOfSquares[i] += Math.pow(parseFloat(val), 2);
// Ignore the strings.
} else {
sumOfValues[i] += 0;
sumOfSquares[i] += 0;
}
}
});
return {
sumOfVal: sumOfValues,
sumOfSq: sumOfSquares
};
}