// Euclidean distance let euclid = (p, q) => Math.floor(Math.sqrt(Math.pow(q.x - p.x, 2) + Math.pow(q.y - p.y, 2))); // Manhattan distance let manhattan = (p, q) => Math.abs(p.x - q.x) + Math.abs(p.y - q.y); let kMeans = () => { let centreX, centreY, centroids = [], d, E = Number.MAX_VALUE, initialE, minD, zones = [ [], [], [], [] ]; for (let i = 0; i < 4; i++) { centroids.push({ x: d3.randomUniform(-300, 300)(), y: d3.randomUniform(-300, 300)(), }); } let results = d3.json('results.json', res => { res.forEach(p => { minD = 600, d = 0, p.zone = 0; centroids.forEach((k, idx) => { d = euclid(k, p); if (d < minD) { minD = d; p.zone = idx; } zones[p.zone].push(p); }); //console.log(p); }); console.log(zones[0].reduce((acc, val) => { console.log(val.x) })); zones.forEach((zone, idx) => { centreX = 0, centreY = 0; zone.forEach(point => { centreX += point.x; centreY += point.y; }); centroids[idx].x = centreX / zone.length; centroids[idx].y = centreY / zone.length; console.log(centroids[idx]); }); initialE = E; centroids.forEach(k => { zones.forEach(zone => { zone.forEach(p => { E += euclid(k, p); }); }); }); console.log(initialE, E); if (E < initialE) { kMeans(); } }); }; kMeans();