diff --git a/src/ckmeans.js b/src/ckmeans.js index ba8d539b..a92961b8 100644 --- a/src/ckmeans.js +++ b/src/ckmeans.js @@ -106,14 +106,14 @@ function ckmeans(data, nClusters) { var squaredDifference = Math.pow( sorted[sortedIdx] - firstClusterMean, 2); matrix[cluster][sortedIdx] = matrix[cluster][sortedIdx - 1] + - ((sortedIdx - 1) / sortedIdx) * squaredDifference; + (sortedIdx / (sortedIdx + 1)) * squaredDifference; // We're computing a running mean by taking the previous // mean value, multiplying it by the number of elements // seen so far, and then dividing it by the number of // elements total. var newSum = sortedIdx * firstClusterMean + sorted[sortedIdx]; - firstClusterMean = newSum / sortedIdx; + firstClusterMean = newSum / (sortedIdx + 1); } else { diff --git a/test/ckmeans.test.js b/test/ckmeans.test.js index 701197af..3e3a379e 100644 --- a/test/ckmeans.test.js +++ b/test/ckmeans.test.js @@ -21,11 +21,13 @@ test('C k-means', function(t) { t.deepEqual(example, [[-1, -1, -1, -1], [2, 2, 2], [4, 5, 6]]); t.deepEqual(cK([1, 2, 3], 3), [[1], [2], [3]]); - // is this right? - t.deepEqual(cK([1, 2, 2, 3], 3), [[1, 2], [2], [3]]); - t.deepEqual(cK([1, 2, 2, 3, 3], 3), [[1, 2], [2], [3, 3]]); - t.deepEqual(cK([1, 2, 3, 2, 3], 3), [[1, 2], [2], [3, 3]]); - t.deepEqual(cK([3, 2, 3, 2, 1], 3), [[1, 2], [2], [3, 3]]); + t.deepEqual(cK([0, 3, 4], 2), [[0], [3, 4]]), + t.deepEqual(cK([-3, 0, 4], 2), [[-3, 0], [4]]), + + t.deepEqual(cK([1, 2, 2, 3], 3), [[1], [2, 2], [3]]); + t.deepEqual(cK([1, 2, 2, 3, 3], 3), [[1], [2, 2], [3, 3]]); + t.deepEqual(cK([1, 2, 3, 2, 3], 3), [[1], [2, 2], [3, 3]]); + t.deepEqual(cK([3, 2, 3, 2, 1], 3), [[1], [2, 2], [3, 3]]); t.deepEqual(cK([3, 2, 3, 5, 2, 1], 3), [[1, 2, 2], [3, 3], [5]]); t.deepEqual(cK([0, 1, 2, 100, 101, 103], 2), [[0, 1, 2], [100, 101, 103]]);