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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 96x 96x 96x 96x 96x 96x 96x 96x 96x 96x 96x 96x 192x 192x 192x 96x 96x 96x 12x 12x 12x 12x 3x 3x 3x 3x 3x | /**
* @license Apache-2.0
*
* Copyright (c) 2026 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 logger = require( 'debug' );
// VARIABLES //
var debug = logger( 'ml:dkmeans-init-random-partition' );
// MAIN //
/**
* Initializes centroids by performing the random partition initialization on double-precision floating-point data points.
*
* ## Method
*
* The Random Partition method for choosing initial centroids is as follows:
*
* 1. Assign each data point to a cluster chosen uniformly at random from the `k` available clusters.
* 2. Set each centroid equal to the mean of the data points assigned to its cluster.
*
* ## Notes
*
* - A cluster to which no data point is assigned retains a centroid of all zeros.
* - Because assignments are made uniformly at random, the resulting centroids tend to lie near the global mean of the data set.
*
* ## References
*
* - MacQueen, J. 1967. "Some methods for classification and analysis of multivariate observations." In _Proceedings of the Fifth Berkeley Symposium on Mathematical Statistics and Probability_, 281–97. Berkeley, CA, USA: University of California Press.
*
* @private
* @param {PositiveInteger} M - number of data points
* @param {PositiveInteger} N - number of features
* @param {Float64Array} X - input array
* @param {integer} sx1 - first stride length of `X`
* @param {integer} sx2 - second stride length of `X`
* @param {NonNegativeInteger} ox - starting index of `X`
* @param {Float64Array} out - output array
* @param {integer} so1 - first stride length of `out`
* @param {integer} so2 - second stride length of `out`
* @param {NonNegativeInteger} oo - starting index of `out`
* @param {Int32Array} W - workspace array of size `k` for tracking per-cluster point counts
* @param {integer} sw - stride length of `W`
* @param {NonNegativeInteger} ow - starting index of `W`
* @param {Function} randi - pseudorandom number generator
* @returns {Float64Array} centroids
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
* var Int32Array = require( '@stdlib/array/int32' );
* var factory = require( '@stdlib/random/base/discrete-uniform' ).factory;
*
* var k = 3;
* var M = 5;
* var N = 2;
*
* var out = new Float64Array( k*N );
* var W = new Int32Array( k );
*
* // Specify data points:
* var xbuf = new Float64Array([
* 0.0, 0.0,
* 1.0, 1.0,
* 1.0, -1.0,
* -1.0, -1.0,
* -1.0, 1.0
* ]);
*
* var randi = factory( 0, k-1, { 'seed': 1234 } );
*
* var centroids = dkmeansInitRandomPartition( M, N, xbuf, N, 1, 0, out, N, 1, 0, W, 1, 0, randi );
* // out => <Float64Array>[ 0.0, 0.0, ~0.333, ~0.333, -1.0, -1.0 ]
*/
function dkmeansInitRandomPartition( M, N, X, sx1, sx2, ox, out, so1, so2, oo, W, sw, ow, randi ) { // eslint-disable-line max-len, max-params, id-length
var xidx;
var oo2;
var c;
var i;
var j;
var n;
var d;
debug( 'Starting random partition centroid initialization...' );
debug( 'M = %d, N = %d', M, N );
// Randomly assign each data point to a cluster and update that cluster's running mean...
xidx = ox;
for ( i = 0; i < M; i++ ) {
// Generate a random cluster index in [0, k):
c = randi();
// Increment the cluster's point count:
W[ ow + ( sw*c ) ] += 1;
n = W[ ow + ( sw*c ) ];
// Output offset for cluster c:
oo2 = oo + ( so1*c );
// Incremental mean update: mean += (x - mean) / n
for ( j = 0; j < N; j++ ) {
d = X[ xidx + ( sx2*j ) ] - out[ oo2 + ( so2*j ) ];
out[ oo2 + ( so2*j ) ] += d / n;
}
debug( 'Assigned data point %d of %d to cluster %d (cluster size: %d).', i+1, M, c, n );
xidx += sx1;
}
debug( 'Finished random partition centroid initialization.' );
return out;
}
// EXPORTS //
module.exports = dkmeansInitRandomPartition;
|