-
Notifications
You must be signed in to change notification settings - Fork 0
/
KMeansClustering.html
5617 lines (5212 loc) · 811 KB
/
KMeansClustering.html
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="K-Means-Clustering-Intuition-and-Python-Implementation">K-Means Clustering Intuition<a class="anchor-link" href="#K-Means-Clustering-Intuition-and-Python-Implementation">¶</a></h1>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="nn">sns</span><span class="p">;</span> <span class="n">sns</span><span class="o">.</span><span class="n">set</span><span class="p">()</span>
<span class="kn">import</span> <span class="nn">cv2</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Let's explain how K-means clustering works. Since we do not have a dataset, we are basically creating a dataset using numpy. So:</p>
<ul>
<li><p><strong>np.array[x,y]</strong> will create a numpy array with with elements [x,y]</p>
</li>
<li><p><strong>np.random.randn(x,y)</strong> will generate random floats from a univariate "Guassian" distribution with mean 0 and variance 1. It will create an x-by-y array of samples. We can generalize to any random samples from <em>N(mu, sigma^2)</em> by doing the formula <strong>sigma * np.random.randn(...) + mu</strong>. This is exactly what we are doing below.</p>
</li>
<li><p><strong>np.vstack</strong> will stack the arrays together, so that we get a single point cloud made of random numbers generated from normal distributions around different means with different variances.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [134]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">points</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">(((</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">150</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.75</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">])),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.25</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">])),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">]))))</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>I will print the first 10 points to show that they have been stacked.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [135]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="n">points</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">])</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>[[ 1.33250804 0.03053182]
[ 0.95275129 -0.20448093]
[ 0.12589225 -0.78702211]
[ 0.86814487 0.34994417]
[ 0.12320414 0.95261583]
[ 2.49905182 -0.31815691]
[ 1.47762516 -0.22439388]
[-0.46729998 -1.24634161]
[ 1.13192344 -0.19012131]]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Now we plot x and y coordinates, and visualize the cluster centers. To do this, we use <strong>plt.gca()</strong> which will get the current instance of the axes object.</p>
<p>The <strong>ax.add_artist</strong> method creates an artist object. The artist object knows how to use the renderer to draw onto the canvas. We then plot using the <strong>plt.Circle()</strong> method. Note we are centering the circles at the mean, with the radius being half the variance.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [136]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">points</span><span class="p">[:,</span><span class="mi">0</span><span class="p">],</span> <span class="n">points</span><span class="p">[:,</span><span class="mi">1</span><span class="p">])</span>
<span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">gca</span><span class="p">()</span>
<span class="n">ax</span><span class="o">.</span><span class="n">add_artist</span><span class="p">(</span><span class="n">plt</span><span class="o">.</span><span class="n">Circle</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]),</span> <span class="mf">0.75</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">lw</span><span class="o">=</span><span class="mi">3</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">add_artist</span><span class="p">(</span><span class="n">plt</span><span class="o">.</span><span class="n">Circle</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]),</span> <span class="mf">0.25</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">lw</span><span class="o">=</span><span class="mi">3</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">add_artist</span><span class="p">(</span><span class="n">plt</span><span class="o">.</span><span class="n">Circle</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">]),</span> <span class="mf">0.5</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">lw</span><span class="o">=</span><span class="mi">3</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt output_prompt">Out[136]:</div>
<div class="output_text output_subarea output_execute_result">
<pre><matplotlib.patches.Circle at 0x1eaf2fcc860></pre>
</div>
</div>
<div class="output_area">
<div class="prompt"></div>
<div class="output_png output_subarea ">
<img src="data:image/png;base64,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
RU5ErkJggg==
"
>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Now we will use the existing dataset to initialize k centroids. This is done by first copying all the points using <strong>points.copy()</strong>. Then we will use <strong>np.random.shuffle(X)</strong> to shuffle along the first axis of X. So the x,y pairs will be retained, just shuffled.</p>
<p>Then we will select the first k rows <strong>X[:k]</strong> to initialize the centroids, and return that spliced array.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [137]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">initialize_centroids</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
<span class="n">centroids</span> <span class="o">=</span> <span class="n">points</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">shuffle</span><span class="p">(</span><span class="n">centroids</span><span class="p">)</span>
<span class="k">return</span> <span class="n">centroids</span><span class="p">[:</span><span class="n">k</span><span class="p">]</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Then we can see the output of this function</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [138]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">initialize_centroids</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt output_prompt">Out[138]:</div>
<div class="output_text output_subarea output_execute_result">
<pre>array([[-0.5578764 , -0.23435869],
[-0.64311141, 0.42860356],
[-0.33660195, -0.85984704]])</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>As before, we will plot all of the points in the scatter plot, and we will also plot the centroids. <strong>s</strong> is area, and <strong>c</strong> is color.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [139]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">points</span><span class="p">[:,</span><span class="mi">0</span><span class="p">],</span> <span class="n">points</span><span class="p">[:,</span><span class="mi">1</span><span class="p">])</span>
<span class="n">centroids</span> <span class="o">=</span> <span class="n">initialize_centroids</span><span class="p">(</span><span class="n">points</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">centroids</span><span class="p">[:,</span><span class="mi">0</span><span class="p">],</span> <span class="n">centroids</span><span class="p">[:,</span><span class="mi">1</span><span class="p">],</span> <span class="n">c</span> <span class="o">=</span> <span class="s1">'r'</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">100</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt output_prompt">Out[139]:</div>
<div class="output_text output_subarea output_execute_result">
<pre><matplotlib.collections.PathCollection at 0x1eaf305f4e0></pre>
</div>
</div>
<div class="output_area">
<div class="prompt"></div>
<div class="output_png output_subarea ">
<img src="data:image/png;base64,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
"
>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Broadcasting-arrays-for-efficiency">Broadcasting arrays for efficiency<a class="anchor-link" href="#Broadcasting-arrays-for-efficiency">¶</a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>We now want to find the 2 norm of the distance between the distances between each of the points and the corresponding centroids. In this way, we will cluster the points to the centroids.</p>
<p>Now how can we efficiently find the 2 norm for each of these centroids? We do this using array broadcasting. <a href="https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html">Broadcasting Documentation</a>, and a good <a href="http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc">visualization</a> are linked.</p>
<p>Firstly, we know that the size of the points will be <strong>[x, 2]</strong>, and the size of the centroids will be <strong>[k, 2]</strong>. We want the final array to be of size <strong>[k,x,2]</strong>. This means we can split the final array into <strong>k</strong> centroids each containing the 2 dimensional differences for the <strong>x</strong> points.</p>
<p>So we will add a new axis to the centroids, making the size <strong>[k,1,2]</strong>. Then we can subtract all of the points. I have given a small example below.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [140]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">centroids</span><span class="o">.</span><span class="n">shape</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt output_prompt">Out[140]:</div>