All files stats.js

74.69% Statements 62/83
100% Branches 3/3
50% Functions 1/2
74.69% Lines 62/83

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 841x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 17x 17x 17x 17x 17x 17x 17x 34x 34x 17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 17x                                           17x 1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2018 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var sqrt = require( '@stdlib/math/base/special/sqrt' );
 
 
// MAIN //
 
/**
* Returns an accumulator for computing cluster statistics.
*
* @private
* @param {ndarray} out - matrix for storing cluster statistics
* @param {PositiveInteger} k - number of clusters
* @returns {Function} accumulator
*/
function stats( out, k ) {
	var M2;
	var i;
 
	// Create an array for storing second moments:
	M2 = [];
	for ( i = 0; i < k; i++ ) {
		M2.push( 0.0 );
	}
 
	return accumulator;
 
	/**
	* Updates cluster statistics.
	*
	* @private
	* @param {NonNegativeInteger} c - cluster index to which a data point belongs
	* @param {number} dist - a data point's squared distance to its respective centroid
	* @returns {ndarray} matrix containing cluster statistics
	*/
	function accumulator( c, dist ) {
		var delta;
		var mu;
		var N;

		// Update number of data points belonging to a cluster:
		N = out.get( c, 0 ) + 1;
		out.set( c, 0, N );

		// Update the total sum of squared distances within a cluster:
		out.set( c, 1, out.get( c, 1 )+dist );

		// Update the cluster's squared distance mean and standard deviation (using Welford's algorithm):
		mu = out.get( c, 2 );
		delta = dist - mu;
		mu += delta / N;
		M2[ c ] += delta * ( dist-mu );
		out.set( c, 2, mu );
		out.set( c, 3, sqrt( M2[c]/(N-1) ) );

		return out;
	}
}
 
 
// EXPORTS //
 
module.exports = stats;