Data are a sample from the S2 dataset of P. Fränti and O. Virmajoki, "Iterative shrinking method for clustering problems", Pattern Recognition, 39 (5), 761-765, May 2006.
Reload to explore local minima.
Data are a sample from the S2 dataset of P. Fränti and O. Virmajoki, "Iterative shrinking method for clustering problems", Pattern Recognition, 39 (5), 761-765, May 2006.
Reload to explore local minima.
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.pt { | |
stroke:black; | |
} | |
#stats { | |
font-family: sans-serif; | |
fill: #4d4d4d; | |
} | |
</style> | |
<body> | |
<!--viz--> | |
<div id="chart"></div> | |
<script src="https://d3js.org/d3.v4.min.js"></script> | |
<script type="text/javascript"> | |
// dims | |
var margin = { top: 20, right: 0, bottom: 50, left: 120 }, | |
svg_dx = 800, | |
svg_dy = 400, | |
plot_dx = svg_dx - margin.right - margin.left, | |
plot_dy = svg_dy - margin.top - margin.bottom; | |
// scales | |
var x = d3.scaleLinear().range([margin.left, plot_dx]), | |
y = d3.scaleLinear().range([plot_dy, margin.top]); | |
var svg = d3.select("#chart") | |
.append("svg") | |
.attr("width", svg_dx) | |
.attr("height", svg_dy); | |
var hulls = svg.append("g") | |
.attr("id", "hulls"); | |
var circles = svg.append("g") | |
.attr("id", "circles"); | |
// synthetic data with 15 known Gaussian clusters | |
// ref: S2 dataset from http://cs.joensuu.fi/sipu/datasets/ | |
var clusters = d3.range(0, 15).map((n) => n.toString()); | |
// costs for each iteration | |
var costs = []; | |
hulls.selectAll("path") | |
.data(clusters) | |
.enter() | |
.append("path") | |
.attr("class", "hull") | |
.attr("id", d => "hull_" + d); | |
// data is 10% sample of original dataset | |
d3.csv("s2_sample.csv", d => { | |
d.forEach(d => { | |
d.x = +d.x; | |
d.y = +d.y; | |
}); | |
setScaleDomains(d); | |
plotCircles(d); | |
// randomly select 15 data points for initial centroids | |
var initialCentroids = clusters.map(() => d[Math.round(d3.randomUniform(0, d.length)())]); | |
assignCluster(initialCentroids); | |
addHull(); | |
costs.push(computeCost()); | |
var iterate = d3.interval(() => { | |
var c = computeCentroids() | |
assignCluster(c) | |
addHull(); | |
var cost = computeCost(); | |
// stop iterating when algorithm coverges to local minimum | |
if (cost == costs[costs.length - 1]) { | |
displayStats(costs); | |
iterate.stop(); | |
} | |
costs.push(cost) | |
}, 500); | |
}); | |
function displayStats(costs) { | |
var stats = svg.append("g") | |
.attr("id", "stats"); | |
var formatMin = d3.format(".4"); | |
var n_iters = stats.append("text") | |
.attr("x", 10) | |
.attr("y", 20); | |
n_iters.append("tspan") | |
.style("font-weight", "bold") | |
.text("Num. Iterations: "); | |
n_iters.append("tspan") | |
.text(costs.length); | |
var cost = stats.append("text") | |
.attr("x", 10) | |
.attr("y", 40); | |
cost.append("tspan") | |
.style("font-weight", "bold") | |
.text("Local Minimum: "); | |
cost.append("tspan") | |
.text(formatMin(costs[costs.length - 1])); | |
} | |
function computeCentroids() { | |
var centroids = clusters.map(cluster => { | |
var d = d3.selectAll(".cluster_" + cluster) | |
.data(), | |
n = d.length; | |
var x_sum = d3.sum(d, d => d.x), | |
y_sum = d3.sum(d, d => d.y); | |
return { x:(x_sum / n), y:(y_sum / n) }; | |
}); | |
return centroids; | |
} | |
function addHull() { | |
clusters.forEach(cluster => { | |
// parse cluster data | |
var d_cluster = d3.selectAll(".cluster_" + cluster) | |
.data() | |
.map((datum) => [x(datum.x), y(datum.y)]); | |
// path given data points for cluster | |
var d_path = d3.polygonHull(d_cluster); | |
var color = d3.schemeCategory20[+cluster]; | |
// ref: https://bl.ocks.org/mbostock/4341699 | |
d3.select("#hull_" + cluster) | |
.attr("id", "hull_" + cluster) | |
.transition() | |
.duration(250) | |
.attr("d", d_path === null ? null : "M" + d_path.join("L") + "Z") | |
.attr("fill", color) | |
.style("stroke", color); | |
}); | |
} | |
function computeCost() { | |
var dists = d3.selectAll("circle") | |
.data() | |
.map(d => d._dist); | |
return d3.sum(dists); | |
} | |
function assignCluster(centroids) { | |
d3.selectAll("circle") | |
.each(function(d) { | |
// distances of data point from all centroids | |
var dists = computeDistances(centroids, d); | |
// min. distance defines cluster number | |
var dist_min = d3.min(dists); | |
var cluster_num = dists.findIndex(dist => dist == dist_min); | |
var color = d3.schemeCategory20[cluster_num]; | |
// stash min. distance to compute cost | |
d._dist = dist_min; | |
// assign data point to cluster of minimum distance | |
d3.select(this) | |
.attr("fill", d3.color(color).brighter(0.5)) | |
.attr("class", "pt cluster_" + cluster_num); | |
}); | |
} | |
function computeDistances(centroids, d_pt) { | |
var dists = centroids.map(centroid => { | |
var dist = Math.sqrt(Math.pow(d_pt.x - centroid.x, 2) + Math.pow(d_pt.y - centroid.y, 2)); | |
return dist; | |
}) | |
return dists; | |
} | |
function setScaleDomains(d) { | |
x.domain(d3.extent(d, d => d.x)); | |
y.domain(d3.extent(d, d => d.y)); | |
} | |
function plotCircles(d) { | |
circles.selectAll("circle") | |
.data(d) | |
.enter() | |
.append("circle") | |
.attr("class", "pt") | |
.attr("r", 5) | |
.attr("cx", (d) => x(d.x)) | |
.attr("cy", (d) => y(d.y)); | |
} | |
</script> | |
</body> |
x | y | |
---|---|---|
868777 | 586944 | |
367020 | 431868 | |
841726 | 800729 | |
176787 | 455252 | |
693716 | 476453 | |
473080 | 838594 | |
362249 | 399055 | |
539611 | 398504 | |
449467 | 594608 | |
446119 | 601343 | |
372307 | 207143 | |
800231 | 232016 | |
557729 | 241086 | |
799944 | 816622 | |
579218 | 185160 | |
644438 | 720614 | |
190767 | 706219 | |
796502 | 510572 | |
805108 | 796673 | |
561853 | 312878 | |
803357 | 779049 | |
298298 | 412540 | |
352868 | 389859 | |
603094 | 315792 | |
868895 | 604801 | |
256255 | 743704 | |
545045 | 424260 | |
129344 | 161493 | |
401212 | 788368 | |
828956 | 617518 | |
210204 | 525598 | |
239399 | 487248 | |
152867 | 264083 | |
677057 | 153715 | |
402472 | 181925 | |
713592 | 135254 | |
193996 | 488095 | |
215615 | 565032 | |
683156 | 477909 | |
443267 | 354086 | |
579813 | 431520 | |
254983 | 731658 | |
690480 | 168208 | |
151352 | 235918 | |
513319 | 442815 | |
833899 | 769899 | |
441050 | 601420 | |
833920 | 273791 | |
370731 | 217636 | |
598498 | 733367 | |
172246 | 511422 | |
231574 | 696781 | |
747199 | 581068 | |
664594 | 695034 | |
806535 | 822224 | |
415598 | 205574 | |
596539 | 376915 | |
811794 | 796546 | |
195166 | 438443 | |
600938 | 632401 | |
180427 | 312249 | |
396190 | 147633 | |
392049 | 421698 | |
239740 | 424128 | |
727112 | 497222 | |
454855 | 338314 | |
321709 | 148954 | |
233496 | 791806 | |
845753 | 636607 | |
672748 | 143913 | |
667783 | 714977 | |
551504 | 163718 | |
850080 | 301694 | |
774427 | 788519 | |
830057 | 593423 | |
435454 | 582389 | |
157863 | 234771 | |
186264 | 695907 | |
624439 | 284325 | |
711441 | 151028 | |
367014 | 393820 | |
802930 | 232758 | |
656341 | 159600 | |
142200 | 219871 | |
384609 | 54012 | |
504986 | 872830 | |
808797 | 782400 | |
659403 | 713194 | |
96693 | 226847 | |
599399 | 491415 | |
197688 | 484429 | |
495770 | 314954 | |
680746 | 200342 | |
486998 | 186575 | |
520952 | 823921 | |
818350 | 787409 | |
712504 | 156892 | |
452060 | 618631 | |
728129 | 500290 | |
124465 | 141723 | |
681528 | 158990 | |
366133 | 381852 | |
836090 | 553666 | |
709537 | 529162 | |
459889 | 378512 | |
145002 | 258062 | |
287834 | 722534 | |
535151 | 429278 | |
55608 | 239370 | |
347695 | 244892 | |
367885 | 392222 | |
241344 | 757443 | |
116999 | 471084 | |
305482 | 426633 | |
429488 | 612140 | |
793835 | 803740 | |
220177 | 221674 | |
262124 | 479518 | |
620515 | 179428 | |
505796 | 823492 | |
72590 | 266630 | |
797349 | 262013 | |
642584 | 700876 | |
720486 | 163061 | |
769904 | 494189 | |
570399 | 302552 | |
839617 | 656945 | |
310836 | 453367 | |
788340 | 235197 | |
216910 | 714147 | |
138455 | 477812 | |
318948 | 427185 | |
685914 | 146709 | |
779163 | 791549 | |
214167 | 475347 | |
577939 | 713682 | |
525885 | 408633 | |
644682 | 714745 | |
862496 | 778936 | |
93554 | 238027 | |
486881 | 821631 | |
639407 | 453570 | |
237599 | 737826 | |
160746 | 461333 | |
526382 | 240215 | |
598696 | 426412 | |
643031 | 711746 | |
715169 | 485793 | |
805067 | 246062 | |
175763 | 259085 | |
450073 | 177505 | |
293378 | 730822 | |
446833 | 618978 | |
188413 | 435252 | |
354488 | 384371 | |
362438 | 399028 | |
199017 | 249218 | |
740262 | 454955 | |
297392 | 837410 | |
78660 | 284471 | |
674937 | 133330 | |
397307 | 123704 | |
610174 | 773555 | |
739547 | 489215 | |
416238 | 192639 | |
840280 | 643770 | |
382235 | 404889 | |
850054 | 775827 | |
690616 | 104291 | |
679826 | 139538 | |
587211 | 212643 | |
650187 | 695637 | |
448826 | 537561 | |
616652 | 307558 | |
327673 | 129969 | |
438100 | 647695 | |
849098 | 786555 | |
666089 | 834004 | |
679675 | 145741 | |
803229 | 246622 | |
837750 | 634132 | |
845361 | 796494 | |
58050 | 223469 | |
562761 | 451747 | |
208417 | 813898 | |
182053 | 420973 | |
564558 | 251534 | |
504920 | 856370 | |
342396 | 391351 | |
422092 | 641107 | |
815014 | 790524 | |
511578 | 477934 | |
841353 | 810185 | |
376199 | 179596 | |
641164 | 670236 | |
641684 | 622495 | |
195311 | 426719 | |
250965 | 638991 | |
589897 | 941206 | |
588052 | 698231 | |
412031 | 164238 | |
581758 | 242967 | |
185554 | 434810 | |
729190 | 580460 | |
452764 | 940358 | |
546863 | 446509 | |
353389 | 370521 | |
582510 | 232791 | |
373227 | 166478 | |
534359 | 410864 | |
802856 | 239801 | |
159080 | 210722 | |
426060 | 229744 | |
370049 | 391721 | |
750522 | 621023 | |
385673 | 169869 | |
676848 | 196504 | |
198303 | 478619 | |
343924 | 394943 | |
543510 | 406511 | |
856835 | 289341 | |
771727 | 481735 | |
839817 | 657140 | |
167454 | 212223 | |
806771 | 696582 | |
173988 | 455711 | |
140450 | 251264 | |
462641 | 873096 | |
404216 | 111800 | |
822815 | 616988 | |
157309 | 236777 | |
516087 | 229278 | |
474946 | 400305 | |
203563 | 488698 | |
770665 | 821201 | |
631587 | 656092 | |
242177 | 789274 | |
277460 | 489953 | |
844586 | 802273 | |
821453 | 779300 | |
823326 | 281490 | |
544848 | 453980 | |
503244 | 848895 | |
366903 | 161264 | |
761897 | 442656 | |
762598 | 815926 | |
484034 | 788380 | |
523254 | 437878 | |
373259 | 425038 | |
219520 | 412301 | |
203424 | 155150 | |
234863 | 467401 | |
400394 | 380796 | |
389161 | 136652 | |
614768 | 433212 | |
167088 | 231235 | |
444738 | 611875 | |
806003 | 241718 | |
812780 | 635276 | |
832359 | 781195 | |
583750 | 440376 | |
898849 | 767378 | |
311758 | 252287 | |
826452 | 774195 | |
219609 | 734441 | |
488127 | 73846 | |
764197 | 149751 | |
587867 | 711394 | |
126009 | 263298 | |
197194 | 481989 | |
596805 | 276457 | |
432770 | 626516 | |
203104 | 552398 | |
612380 | 276270 | |
815736 | 251749 | |
231852 | 300137 | |
149811 | 261597 | |
281780 | 775943 | |
172444 | 256387 | |
595184 | 437458 | |
590610 | 363074 | |
812051 | 780503 | |
705772 | 693959 | |
556204 | 478664 | |
414871 | 690586 | |
812456 | 609760 | |
510223 | 792220 | |
461991 | 549808 | |
681298 | 260543 | |
612291 | 131433 | |
427786 | 615834 | |
250998 | 756247 | |
272708 | 722671 | |
247122 | 715890 | |
642076 | 201050 | |
590381 | 824899 | |
808472 | 241370 | |
844405 | 710620 | |
212929 | 476235 | |
807493 | 241644 | |
691442 | 511116 | |
301060 | 715198 | |
594137 | 703143 | |
439176 | 594910 | |
134197 | 229036 | |
687052 | 186012 | |
782521 | 782691 | |
686639 | 180824 | |
808035 | 798648 | |
502156 | 829132 | |
806678 | 241501 | |
445690 | 614204 | |
842837 | 647272 | |
473518 | 431029 | |
517539 | 835591 | |
235700 | 742331 | |
515997 | 873751 | |
848376 | 221062 | |
420275 | 394734 | |
545421 | 190964 | |
394944 | 157785 | |
514165 | 906736 | |
750835 | 484965 | |
142031 | 499068 | |
167164 | 191976 | |
447370 | 572513 | |
542553 | 222643 | |
560227 | 441363 | |
665597 | 154475 | |
805167 | 195569 | |
380383 | 436027 | |
739447 | 497012 | |
178163 | 282559 | |
180686 | 500459 | |
387305 | 387873 | |
892746 | 564842 | |
702306 | 508607 | |
199114 | 469623 | |
515828 | 956802 | |
557961 | 864098 | |
414615 | 681241 | |
639214 | 723166 | |
239976 | 833889 | |
683348 | 177770 | |
749620 | 446114 | |
484075 | 839356 | |
182210 | 807220 | |
219148 | 671608 | |
796737 | 235100 | |
148258 | 485289 | |
735419 | 521089 | |
538071 | 476262 | |
484168 | 387405 | |
737036 | 156973 | |
706391 | 175549 | |
238601 | 769529 | |
638563 | 721974 | |
533127 | 916539 | |
896024 | 206022 | |
744128 | 491509 | |
506023 | 816501 | |
409604 | 719216 | |
637681 | 686532 | |
211181 | 778052 | |
449808 | 623716 | |
917544 | 625573 | |
303315 | 750320 | |
505676 | 855482 | |
837660 | 211926 | |
270830 | 751681 | |
503413 | 819127 | |
801854 | 795090 | |
756376 | 469701 | |
734376 | 455402 | |
275338 | 518305 | |
733684 | 216569 | |
837545 | 807762 | |
535593 | 143445 | |
852753 | 799139 | |
377224 | 415288 | |
552401 | 833620 | |
561535 | 422869 | |
369117 | 397361 | |
172229 | 208129 | |
871946 | 767622 | |
441676 | 361920 | |
549320 | 462207 | |
362468 | 150201 | |
543279 | 201456 | |
322898 | 707331 | |
400677 | 223791 | |
894943 | 635233 | |
826740 | 617100 | |
118884 | 300452 | |
543185 | 449059 | |
810776 | 255655 | |
617516 | 155138 | |
514390 | 894483 | |
358783 | 228332 | |
280484 | 412725 | |
815671 | 220031 | |
446989 | 611213 | |
553779 | 243274 | |
780635 | 613287 | |
408082 | 859669 | |
572815 | 413163 | |
446211 | 212565 | |
738184 | 129882 | |
657706 | 234370 | |
126749 | 322037 | |
208270 | 463405 | |
268582 | 750393 | |
595870 | 694998 | |
788649 | 794537 | |
368932 | 390922 | |
398572 | 370806 | |
635196 | 471927 | |
836176 | 639066 | |
171329 | 274604 | |
556325 | 411879 | |
350796 | 417352 | |
410652 | 127303 | |
732311 | 143631 | |
683193 | 153585 | |
604791 | 256206 | |
593205 | 453290 | |
144536 | 253350 | |
703914 | 726785 | |
227939 | 492292 | |
170563 | 774573 | |
736648 | 486939 | |
568522 | 412767 | |
437877 | 347481 | |
353798 | 153195 | |
575185 | 935592 | |
581344 | 385622 | |
441417 | 591083 | |
160305 | 394216 | |
787165 | 670018 | |
808336 | 241768 | |
674203 | 723060 | |
826119 | 273742 | |
782953 | 207370 | |
865073 | 661021 | |
416055 | 67530 | |
507531 | 899483 | |
869697 | 240782 | |
792217 | 324106 | |
604067 | 254704 | |
187608 | 800179 | |
810615 | 244983 | |
561290 | 237997 | |
441101 | 632597 | |
849885 | 226831 | |
377351 | 397813 | |
561214 | 239273 | |
431366 | 787771 | |
358829 | 388192 | |
367991 | 414300 | |
179395 | 462021 | |
492219 | 176220 | |
355387 | 401760 | |
256102 | 748634 | |
642061 | 703080 | |
545646 | 813736 | |
854434 | 182273 | |
101403 | 505387 | |
680868 | 731424 | |
332667 | 214384 | |
813142 | 634900 | |
417370 | 195374 | |
158466 | 255685 | |
813657 | 150704 | |
391415 | 152720 | |
488198 | 321077 | |
791155 | 234010 | |
693853 | 483179 | |
640146 | 716376 | |
109749 | 144848 | |
427578 | 177762 | |
367537 | 392135 | |
750750 | 213230 | |
410952 | 118990 | |
801185 | 253763 | |
379846 | 169598 | |
661592 | 678312 | |
698637 | 479409 | |
421081 | 221014 | |
608865 | 760275 | |
134601 | 255747 | |
88506 | 502797 | |
827016 | 648159 | |
752795 | 492722 | |
786184 | 663836 | |
165098 | 235353 | |
210080 | 198044 | |
578789 | 227708 | |
565035 | 407936 | |
188602 | 207706 | |
801229 | 617139 |