function* meanshift(initial_points) {
const points = initial_points.slice(),
n = points.length;
let delta;
do {
delta = 0;
for (let i = 0; i < n; i++) {
const p = points[i],
q = new Float32Array(p.length);
let weight = 0;
for (let j = 0; j < n; j++) {
const ip = initial_points[j],
d = distance(p, ip),
w = kernel(d);
weight += w;
for (let k = 0; k < q.length; k++) q[k] += w * ip[k];
}
for (let k = 0; k < q.length; k++) q[k] /= weight;
delta = Math.max(delta, distance(p, q));
points[i] = q;
}
yield points;
} while (delta > 1e-3);
}