This repository has been archived by the owner on Sep 1, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
566 lines (430 loc) · 50.8 KB
/
index.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
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-W5TJ6Q8');</script>
<!-- End Google Tag Manager -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Think and Make | Heaplinker</title>
<meta name="twitter:image" content="assets/images/official_logo_black.png">
<link type="application/atom+xml" rel="alternate" href="https://blog.heaplinker.com/feed.xml" title="Heaplinker" />
<!-- Begin Jekyll SEO tag v2.7.1 -->
<title>Think and Make | Heaplinker</title>
<meta name="generator" content="Jekyll v4.2.0" />
<meta property="og:title" content="Think and Make" />
<meta property="og:locale" content="en" />
<meta name="description" content="Heaplinker Blog is a platform that spreads multilingual digital writings with the motto of “think and make”. It has been made in a very similar way to Medium. Just as Medium is an open platform of writings on many subjects, here Heaplinker Blog is also a platform where contains a variety of topics, especially technical ones for digital publishing. Special emphasis will be given on technical issues here. Its main purpose is to spread ideas, information, and deepen understanding of technical knowledge, and to publish posts in both English and Bengali language." />
<meta property="og:description" content="Heaplinker Blog is a platform that spreads multilingual digital writings with the motto of “think and make”. It has been made in a very similar way to Medium. Just as Medium is an open platform of writings on many subjects, here Heaplinker Blog is also a platform where contains a variety of topics, especially technical ones for digital publishing. Special emphasis will be given on technical issues here. Its main purpose is to spread ideas, information, and deepen understanding of technical knowledge, and to publish posts in both English and Bengali language." />
<link rel="canonical" href="https://blog.heaplinker.com/" />
<meta property="og:url" content="https://blog.heaplinker.com/" />
<meta property="og:site_name" content="Heaplinker" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Think and Make" />
<script type="application/ld+json">
{"@type":"WebSite","url":"https://blog.heaplinker.com/","headline":"Think and Make","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://blog.heaplinker.com/assets/images/official_logo_black.png"}},"description":"Heaplinker Blog is a platform that spreads multilingual digital writings with the motto of “think and make”. It has been made in a very similar way to Medium. Just as Medium is an open platform of writings on many subjects, here Heaplinker Blog is also a platform where contains a variety of topics, especially technical ones for digital publishing. Special emphasis will be given on technical issues here. Its main purpose is to spread ideas, information, and deepen understanding of technical knowledge, and to publish posts in both English and Bengali language.","name":"Heaplinker","@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->
<meta property="og:image" content="assets/images/official_logo_black.png">
<meta name="twitter:description" content="Heaplinker Blog is a platform that spreads multilingual digital writings with the motto of "think and make". It has been made in a very similar way to Medium. Just as Medium is an open platform of writings on many subjects, here Heaplinker Blog is also a platform where contains a variety of topics, especially technical ones for digital publishing. Special emphasis will be given on technical issues here. Its main purpose is to spread ideas, information, and deepen understanding of technical knowledge, and to publish posts in both English and Bengali language.">
<meta name="image" content="assets/images/official_logo_black.png">
<meta itemprop="name" content="Heaplinker">
<meta itemprop="description" content="Heaplinker Blog is a platform that spreads multilingual digital writings with the motto of "think and make". It has been made in a very similar way to Medium. Just as Medium is an open platform of writings on many subjects, here Heaplinker Blog is also a platform where contains a variety of topics, especially technical ones for digital publishing. Special emphasis will be given on technical issues here. Its main purpose is to spread ideas, information, and deepen understanding of technical knowledge, and to publish posts in both English and Bengali language.">
<meta itemprop="image" content="assets/images/official_logo_black.png">
<meta name="image" property="og:image" content="assets/images/official_logo_black.png">
<meta name="author" content="Rafsun Jany Arman">
<meta name="twitter:image" content="assets/images/official_logo_black.png">
<!-- Schema.org for Google -->
<!-- Twitter -->
<meta name="twitter:site" content="@_rjarman">
<meta name="twitter:creator" content="@_rjarman">
<!-- Open Graph general (Facebook, Pinterest & Google+) -->
<meta property="fb:admins" content="https://www.facebook.com/rafsunjany.arman.1/">
<link rel="shortcut icon" type="image/x-icon" href="/assets/images/favicon.ico">
<!-- Font Awesome Icons -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
<!-- Google Fonts-->
<link href="https://fonts.googleapis.com/css?family=Lora:400,400i,700" rel="stylesheet">
<!-- Bootstrap Modified -->
<link rel="stylesheet" href="/assets/css/main.css">
<!-- Theme Stylesheet -->
<link rel="stylesheet" href="/assets/css/theme.css">
<link href="/assets/css/syntax_gruvbox.light.css" rel="stylesheet">
<!-- Jquery on header to make sure everything works, the rest of the scripts in footer for fast loading -->
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<!-- This goes before </head> closing tag, Google Analytics can be placed here -->
<script
type="text/javascript"
src="https://app.mailjet.com/statics/js/iframeResizer.min.js"
></script>
</head>
<body class=" homefirstpage ">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W5TJ6Q8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<!-- Navbar -->
<nav id="MagicMenu" class="topnav navbar navbar-expand-lg navbar-light bg-white fixed-top">
<div class="container">
<a class="navbar-brand navbar-logo" href="/">
<img src="/assets/images/official_logo_black.png" alt="Official Logo(black)">
</a>
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="navbarColor02">
<ul class="navbar-nav mr-auto d-flex align-items-center">
<!-- Replace menu links here -->
<li class="nav-item">
<a class="nav-link caption-font-en" href="">Home</a>
</li>
<li class="nav-item">
<a class="nav-link caption-font-en" href="/authors">Authors</a>
</li>
<li class="nav-item">
<a class="nav-link caption-font-en" href="/contact">Contact</a>
</li>
<li class="nav-item">
<a target="_blank" class="nav-link caption-font-en" href="https://www.patreon.com/rafsun"
>Donate</i
></a>
</li>
<li class="nav-item">
<!-- Adds links to other languages on the post -->
<a class="nav-link caption-font-bn" href="/bn/" >বাংলা</a>
</li>
</ul>
<ul class="navbar-nav ml-auto d-flex align-items-center">
<script src="/assets/js/lunr.js"></script>
<script>
$(function() {
$("#lunrsearchresults").on('click', '#btnx', function () {
$('#lunrsearchresults').hide( 1000 );
$( "body" ).removeClass( "modal-open" );
});
});
var documents = [{
"id": 0,
"url": "https://blog.heaplinker.com/404/",
"title": "",
"body": ""
}, {
"id": 1,
"url": "https://blog.heaplinker.com/authors",
"title": "Authors",
"body": " {{page. title}}: {% for author in site. authors %} {{ author[1]. name }}: (View Posts) {% for tag in author[1]. tags %} {{ tag[1] }} {% endfor %} {{ author[1]. bio }} {% endfor %} "
}, {
"id": 2,
"url": "https://blog.heaplinker.com/categories",
"title": "Categories",
"body": " Categories {% for category in site. categories %} {{ category[0] }} : {% assign pages_list = category[1] %} {% for post in pages_list %} {% if post. title != null %} {% if group == null or group == post. group %} {% include main-loop-card. html %} {% endif %} {% endif %} {% endfor %} {% assign pages_list = nil %} {% assign group = nil %} {% endfor %} {% include sidebar-featured. html %} "
}, {
"id": 3,
"url": "https://blog.heaplinker.com/contact",
"title": "Contact",
"body": " Please send your message to {{site. name}}. We will reply as soon as possible! "
}, {
"id": 4,
"url": "https://blog.heaplinker.com/",
"title": "Think and Make",
"body": " {% if page. url == / %} {% assign latest_post = site. posts[0] %} <div class= topfirstimage style= background-image: url({% if latest_post. image contains :// %}{{ latest_post. image }}{% else %}/{{ latest_post. image}}{% endif %}); height: 200px; background-size: cover; background-repeat: no-repeat; ></div> {{ latest_post. title }} : {% if site. lang== en %} {{ latest_post. excerpt | strip_html | strip_newlines | truncate: 136 }} {% else %} {{ latest_post. excerpt | strip_html | strip_newlines | truncate: 200 }} {% endif %} {% for category in latest_post. categories %} @{{ category }} {% endfor %} {{ latest_post. date | date: '%b %d, %Y' }} {%- assign second_post = site. posts[1] -%} {% if second_post. image %} <img class= w-100 src= {% if second_post. image contains :// %}{{ second_post. image }}{% else %}{{ second_post. image | absolute_url }}{% endif %} alt= {{ second_post. title }} > {% endif %} {{ second_post. title }} : {% for category in second_post. categories %} @{{ category }} {% endfor %} {{ second_post. date | date: '%b %d, %Y' }} {%- assign third_post = site. posts[2] -%} {% if third_post. image %} <img class= w-100 src= {% if third_post. image contains :// %}{{ third_post. image }}{% else %}/{{ third_post. image }}{% endif %} alt= {{ third_post. title }} > {% endif %} {{ third_post. title }} : {% for category in third_post. categories %} @{{ category }} {% endfor %} {{ third_post. date | date: '%b %d, %Y' }} {%- assign fourth_post = site. posts[3] -%} {% if fourth_post. image %} <img class= w-100 src= {% if fourth_post. image contains :// %}{{ fourth_post. image }}{% else %}/{{ fourth_post. image }}{% endif %} alt= {{ fourth_post. title }} > {% endif %} {{ fourth_post. title }} : {% for category in fourth_post. categories %} @{{ category }} {% endfor %} {{ fourth_post. date | date: '%b %d, %Y' }} {% for post in site. posts %} {% if post. tags contains sticky %} {{post. title}} {{ post. excerpt | strip_html | strip_newlines | truncate: 136 }} Read More {% endif %}{% endfor %} {% endif %} All Stories: {% for post in paginator. posts %} {% include main-loop-card. html %} {% endfor %} {% if paginator. total_pages > 1 %} {% if paginator. previous_page %} « Prev {% else %} « {% endif %} {% for page in (1. . paginator. total_pages) %} {% if page == paginator. page %} {{ page }} {% elsif page == 1 %} {{ page }} {% else %} {{ page }} {% endif %} {% endfor %} {% if paginator. next_page %} Next » {% else %} » {% endif %} {% endif %} {% include sidebar-featured. html %} "
}, {
"id": 5,
"url": "https://blog.heaplinker.com/jane",
"title": "Jane",
"body": " {{page. title}} Follow : {{ site. authors. jane. site }} {{ site. authors. jane. bio }} Posts by {{page. title}} : {% assign posts = site. posts | where: author , jane %} {% for post in posts %} {% include main-loop-card. html %} {% endfor %} "
}, {
"id": 6,
"url": "https://blog.heaplinker.com/privacy-policy",
"title": "Privacy Policy",
"body": "”{{site. name}}” takes your privacy seriously. To better protect your privacy we provide this privacy policy notice explaining the way your personal information is collected and used. Collection of Routine Information: This website track basic information about their visitors. This information includes, but is not limited to, IP addresses, browser details, timestamps and referring pages. None of this information can personally identify specific visitor to this website. The information is tracked for routine administration and maintenance purposes. Cookies: Where necessary, this website uses cookies to store information about a visitor’s preferences and history in order to better serve the visitor and/or present the visitor with customized content. Advertisement and Other Third Parties: Advertising partners and other third parties may use cookies, scripts and/or web beacons to track visitor activities on this website in order to display advertisements and other useful information. Such tracking is done directly by the third parties through their own servers and is subject to their own privacy policies. This website has no access or control over these cookies, scripts and/or web beacons that may be used by third parties. Learn how to opt out of Google’s cookie usage. Links to Third Party Websites: We have included links on this website for your use and reference. We are not responsible for the privacy policies on these websites. You should be aware that the privacy policies of these websites may differ from our own. Security: The security of your personal information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage, is 100% secure. While we strive to use commercially acceptable means to protect your personal information, we cannot guarantee its absolute security. Changes To This Privacy Policy: This Privacy Policy is effective and will remain in effect except with respect to any changes in its provisions in the future, which will be in effect immediately after being posted on this page. We reserve the right to update or change our Privacy Policy at any time and you should check this Privacy Policy periodically. If we make any material changes to this Privacy Policy, we will notify you either through the email address you have provided us, or by placing a prominent notice on our website. Contact Information: For any questions or concerns regarding the privacy policy, please contact us here. "
}, {
"id": 7,
"url": "https://blog.heaplinker.com/rafsun-jany-arman",
"title": "Rafsun Jany Arman",
"body": " {{page. title}} Follow : {{ site. authors. rafsun. site }} {{ site. authors. rafsun. bio }} Posts by {{page. title}} : {% assign posts = site. posts | where: author , rafsun %} {% for post in posts %} {% include main-loop-card. html %} {% endfor %} "
}, {
"id": 8,
"url": "https://blog.heaplinker.com/tags",
"title": "Tags",
"body": " Tags {% for tag in site. tags %} {{ tag[0] }} : {% assign pages_list = tag[1] %} {% for post in pages_list %} {% if post. title != null %} {% if group == null or group == post. group %} {% include main-loop-card. html %} {% endif %} {% endif %} {% endfor %} {% assign pages_list = nil %} {% assign group = nil %} {% endfor %} {% include sidebar-featured. html %} "
}, {
"id": 9,
"url": "https://blog.heaplinker.com/robots.txt",
"title": "",
"body": " Sitemap: {{ “sitemap. xml” absolute_url }} "
}, {
"id": 10,
"url": "https://blog.heaplinker.com/How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation-2021070218326405004/",
"title": "How to make a custom confusion matrix on matplotlib with heatmap and annotation",
"body": "2021/07/02 - A confusion matrix is also known as an error matrix or matching matrix1. Each row and each column of this matrix represents the actual class and the predicted class respectively. Here in this post, I have discussed how we can build a custom confusion matrix for multi-class classification with matplotlib in python. Here is the post outline: Characteristics of the custom confusion matrix Generate random data Configure matplotlib Generate confusion_matrix Some necessary calculation Make annotation Make customized confusion matrix Make DataFrame Show heatmap EvaluationCharacteristics of the custom confusion matrix: This matrix will contain six different classes and every cell contains two different data one is the total number of being truly or falsely predicted and another one is the percentage(prediction rate per class). 1 to 6th cell of the seventh row contains precision 1 to 6th cell of the seventh column contains recall, and support Remaining one contains the accuracy Generated matrix will show the heatmap depending on the total numbers of true_positive, true_negative, false_positive, and false_negative or percentagesGenerate random data: Import some necessary modules: import numpy as npimport pandas as pdimport matplotlib. pyplot as pltimport matplotlib. pylab as pylabimport seaborn as snsfrom sklearn. metrics import confusion_matrixFor the visualization purpose we have to generate some random data like this: np. random. seed(46) # for consistent result# generate random true data for 6 classesy_true = np. random. randint(0, 6, 1000) # generate random predicted data for 6 classesy_pred = np. random. randint(0, 6, 1000) # labeling the classes as followslabels = [ 'Potato__Early_blight', 'Potato__Late_blight', 'Potato__healthy', 'Tomato__Early_blight', 'Tomato__Late_blight', 'Tomato__healthy']print(y_true[:10])print(y_pred[:10])Output first 10 digits: [2 2 2 1 0 1 0 4 4 1][4 3 4 1 4 4 3 5 2 1]Configure matplotlib: Set the necessary design parameters for the matplotlib: params = { 'figure. figsize': (10, 10), 'axes. titleweight': 'bold', 'axes. labelsize': '16', 'axes. titlesize':'20', 'axes. labelweight':'bold', 'xtick. labelsize':'14', 'ytick. labelsize':'14', 'font. size': '14'}pylab. rcParams. update(params)Generate confusion_matrix: Now generate the confusion matrix by sklearn. metrics. confusion_matrix module: c_m = confusion_matrix(y_true, y_pred, labels=list(range(0, len(labels))))print(c_m)Output: [[37 38 28 21 24 24] [22 19 22 30 23 31] [20 38 30 19 32 34] [19 30 39 29 32 24] [25 17 27 26 28 29] [21 34 27 31 35 35]]Some necessary calculation: For multi-class classification let’s calculate the sum of true_positive(TP) and false_positive(FP) of every class: axis = 1 because of column-wise calculation, for example:37 + 38 + 28 + 21 + 24 + 24 = 172To preserve the previous dimension of the array, keepdims = True c_m_sum = np. sum(c_m, axis=1, keepdims=True)print(c_m_sum)Output: [[172] [147] [173] [173] [152] [183]]Calculate the element-wise probability for every cell along with that we have to calculate row-wise, column-wise and diagonal (total number of true_positive) sum for every row and column of the matrix. prediction_rate = c_m / c_m_sum. astype(float) * 100row_wise_sum = c_m. sum(axis=0)col_wise_sum = c_m. sum(axis=1)total_true_pos = c_m. diagonal()print(prediction_rate, row_wise_sum, col_wise_sum, total_true_pos, sep='\n')Output: [[21. 51162791 22. 09302326 16. 27906977 12. 20930233 13. 95348837 13. 95348837] [14. 96598639 12. 92517007 14. 96598639 20. 40816327 15. 6462585 21. 08843537] [11. 56069364 21. 96531792 17. 34104046 10. 98265896 18. 49710983 19. 65317919] [10. 98265896 17. 34104046 22. 5433526 16. 76300578 18. 49710983 13. 87283237] [16. 44736842 11. 18421053 17. 76315789 17. 10526316 18. 42105263 19. 07894737] [11. 47540984 18. 57923497 14. 75409836 16. 93989071 19. 12568306 19. 12568306]][144 176 173 156 174 177][172 147 173 173 152 183][37 19 30 29 28 35]Calculate the precision, recall and accuracy percentages according to these formulas: accuracy = total_true_pos. sum() / len(y_true) * 100precision = total_true_pos / col_wise_sum * 100recall = total_true_pos / row_wise_sum * 100print(accuracy, precision, recall, sep='\n')Output: 17. 8[21. 51162791 12. 92517007 17. 34104046 16. 76300578 18. 42105263 19. 12568306][25. 69444444 10. 79545455 17. 34104046 18. 58974359 16. 09195402 19. 7740113 ]Make annotation: Take an empty numpy. ndarray like the shape of the confusion matrix: annotation = np. empty_like(c_m). astype(str)rows, cols = c_m. shapeprint(rows, cols)Output: 6 6Fill the empty annotation matrix: for i in range(rows): for j in range(cols): count = c_m[i, j] pre = prediction_rate[i, j] annotation[i, j] = '%d\n%. 1f%%' % (count, pre)print(annotation)Output: [['37\n21. 5%' '38\n22. 1%' '28\n16. 3%' '21\n12. 2%' '24\n14. 0%' '24\n14. 0%'] ['22\n15. 0%' '19\n12. 9%' '22\n15. 0%' '30\n20. 4%' '23\n15. 6%' '31\n21. 1%'] ['20\n11. 6%' '38\n22. 0%' '30\n17. 3%' '19\n11. 0%' '32\n18. 5%' '34\n19. 7%'] ['19\n11. 0%' '30\n17. 3%' '39\n22. 5%' '29\n16. 8%' '32\n18. 5%' '24\n13. 9%'] ['25\n16. 4%' '17\n11. 2%' '27\n17. 8%' '26\n17. 1%' '28\n18. 4%' '29\n19. 1%'] ['21\n11. 5%' '34\n18. 6%' '27\n14. 8%' '31\n16. 9%' '35\n19. 1%' '35\n19. 1%']]To add the accuracy and the total number of true_positive to the matrix, we need to append those to precision and col_wise_sum array respectively. col_wise_sum = np. append(col_wise_sum, total_true_pos. sum())precision = np. append(precision, accuracy)print(col_wise_sum, precision, sep='\n')Output: [172 147 173 173 152 183 178][21. 51162791 12. 92517007 17. 34104046 16. 76300578 18. 42105263 19. 12568306 17. 8]Make tuple of (total_num, percentage) to make annotation for both recall and precision. recall = np. array([[i, j] for i,j in zip(row_wise_sum, recall)])precision = np. array([[i, j] for i,j in zip(col_wise_sum, precision)])print(recall, precision, sep='\n')Output: [[144. 25. 69444444] [176. 10. 79545455] [173. 17. 34104046] [156. 18. 58974359] [174. 16. 09195402] [177. 19. 7740113 ]][[172. 21. 51162791] [147. 12. 92517007] [173. 17. 34104046] [173. 16. 76300578] [152. 18. 42105263] [183. 19. 12568306] [178. 17. 8 ]]Add newly created annotation (from recall) to the previous annotation. annotation = np. concatenate((annotation, [list(map(lambda data: '%d\n%. 1f%%' % (data[0], data[1]), recall))]), axis=0)print(annotation)Output: [['37\n21. 5%' '38\n22. 1%' '28\n16. 3%' '21\n12. 2%' '24\n14. 0%' '24\n14. 0%'] ['22\n15. 0%' '19\n12. 9%' '22\n15. 0%' '30\n20. 4%' '23\n15. 6%' '31\n21. 1%'] ['20\n11. 6%' '38\n22. 0%' '30\n17. 3%' '19\n11. 0%' '32\n18. 5%' '34\n19. 7%'] ['19\n11. 0%' '30\n17. 3%' '39\n22. 5%' '29\n16. 8%' '32\n18. 5%' '24\n13. 9%'] ['25\n16. 4%' '17\n11. 2%' '27\n17. 8%' '26\n17. 1%' '28\n18. 4%' '29\n19. 1%'] ['21\n11. 5%' '34\n18. 6%' '27\n14. 8%' '31\n16. 9%' '35\n19. 1%' '35\n19. 1%'] ['144\n25. 7%' '176\n10. 8%' '173\n17. 3%' '156\n18. 6%' '174\n16. 1%' '177\n19. 8%']]Add newly created annotation (from precision) to the previous annotation. annotation = np. concatenate((annotation, np. array([list(map(lambda data: '%d\n%. 1f%%' % (data[0], data[1]), precision))]). T), axis=1)print(annotation)Output: [['37\n21. 5%' '38\n22. 1%' '28\n16. 3%' '21\n12. 2%' '24\n14. 0%' '24\n14. 0%' '172\n21. 5%'] ['22\n15. 0%' '19\n12. 9%' '22\n15. 0%' '30\n20. 4%' '23\n15. 6%' '31\n21. 1%' '147\n12. 9%'] ['20\n11. 6%' '38\n22. 0%' '30\n17. 3%' '19\n11. 0%' '32\n18. 5%' '34\n19. 7%' '173\n17. 3%'] ['19\n11. 0%' '30\n17. 3%' '39\n22. 5%' '29\n16. 8%' '32\n18. 5%' '24\n13. 9%' '173\n16. 8%'] ['25\n16. 4%' '17\n11. 2%' '27\n17. 8%' '26\n17. 1%' '28\n18. 4%' '29\n19. 1%' '152\n18. 4%'] ['21\n11. 5%' '34\n18. 6%' '27\n14. 8%' '31\n16. 9%' '35\n19. 1%' '35\n19. 1%' '183\n19. 1%'] ['144\n25. 7%' '176\n10. 8%' '173\n17. 3%' '156\n18. 6%' '174\n16. 1%' '177\n19. 8%' '178\n17. 8%']]Previously I have added extra row and column so that we have to add another label name as precision_recall_accuracy labels. append('precision_recall_accuracy')print(labels)Output: ['Potato__Early_blight', 'Potato__Late_blight', 'Potato__healthy', 'Tomato__Early_blight', 'Tomato__Late_blight', 'Tomato__healthy', 'precision_recall_accuracy']Make customized confusion matrix: Change the structure of the previously created confusion matrix to add precision and recall to the row and column respectively. So that here I have created a new c_m_1 matrix with the total numbers of recall and precision from c_m. c_m_1 = np. concatenate((c_m, [recall[:, 0]]), axis=0)c_m_1 = np. concatenate((c_m_1, np. array([precision[:, 0]]). T), axis=1)print(c_m)print(c_m_1)Output: [[37 38 28 21 24 24] [22 19 22 30 23 31] [20 38 30 19 32 34] [19 30 39 29 32 24] [25 17 27 26 28 29] [21 34 27 31 35 35]][[ 37. 38. 28. 21. 24. 24. 172. ] [ 22. 19. 22. 30. 23. 31. 147. ] [ 20. 38. 30. 19. 32. 34. 173. ] [ 19. 30. 39. 29. 32. 24. 173. ] [ 25. 17. 27. 26. 28. 29. 152. ] [ 21. 34. 27. 31. 35. 35. 183. ] [144. 176. 173. 156. 174. 177. 178. ]]Create another matrix named c_m_2 which will contain the prediction rate and precision-recall percentage from prediction_rate matrix. c_m_2 = np. concatenate((prediction_rate, [recall[:, 1]]), axis=0)c_m_2 = np. concatenate((c_m_2, np. array([precision[:, 1]]). T), axis=1)print(prediction_rate)print(c_m_2)Output: [[21. 51162791 22. 09302326 16. 27906977 12. 20930233 13. 95348837 13. 95348837] [14. 96598639 12. 92517007 14. 96598639 20. 40816327 15. 6462585 21. 08843537] [11. 56069364 21. 96531792 17. 34104046 10. 98265896 18. 49710983 19. 65317919] [10. 98265896 17. 34104046 22. 5433526 16. 76300578 18. 49710983 13. 87283237] [16. 44736842 11. 18421053 17. 76315789 17. 10526316 18. 42105263 19. 07894737] [11. 47540984 18. 57923497 14. 75409836 16. 93989071 19. 12568306 19. 12568306]][[21. 51162791 22. 09302326 16. 27906977 12. 20930233 13. 95348837 13. 95348837 21. 51162791] [14. 96598639 12. 92517007 14. 96598639 20. 40816327 15. 6462585 21. 08843537 12. 92517007] [11. 56069364 21. 96531792 17. 34104046 10. 98265896 18. 49710983 19. 65317919 17. 34104046] [10. 98265896 17. 34104046 22. 5433526 16. 76300578 18. 49710983 13. 87283237 16. 76300578] [16. 44736842 11. 18421053 17. 76315789 17. 10526316 18. 42105263 19. 07894737 18. 42105263] [11. 47540984 18. 57923497 14. 75409836 16. 93989071 19. 12568306 19. 12568306 19. 12568306] [25. 69444444 10. 79545455 17. 34104046 18. 58974359 16. 09195402 19. 7740113 17. 8 ]]Make DataFrame: We need to create DataFrame for both c_m_1 and c_m_2 and set their index or column name as follows: c_m_1 = pd. DataFrame(c_m_1, index=labels, columns=labels)c_m_1. index. name = 'Output Class'c_m_1. columns. name = 'Target Class'c_m_2 = pd. DataFrame(c_m_2, index=labels, columns=labels)c_m_2. index. name = 'Output Class'c_m_2. columns. name = 'Target Class'c_m_1. info()Output: <class 'pandas. core. frame. DataFrame'>Index: 7 entries, Potato__Early_blight to precision_recall_accuracyData columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Potato__Early_blight 7 non-null float64 1 Potato__Late_blight 7 non-null float64 2 Potato__healthy 7 non-null float64 3 Tomato__Early_blight 7 non-null float64 4 Tomato__Late_blight 7 non-null float64 5 Tomato__healthy 7 non-null float64 6 precision_recall_accuracy 7 non-null float64dtypes: float64(7)memory usage: 448. 0+ bytesShow heatmap: Let’s show a heatmap depending on the number of classes. color intensities varies yellow(low) to green(high) heatmap_1 = sns. heatmap(c_m_1, annot=annotation, fmt='', cbar=True, cmap='YlGn')heatmap_1. set_xticklabels(heatmap_1. get_xticklabels(), rotation=45, horizontalalignment='right')plt. title('Confusion Matrix(number of classes)')plt. show()Output:Showing a heatmap depending on percentages: heatmap_2 = sns. heatmap(c_m_2, annot=annotation, fmt='', cbar=True, cmap='YlGn')heatmap_2. set_xticklabels(heatmap_2. get_xticklabels(), rotation=45, horizontalalignment='right')plt. title('Confusion Matrix(percentages)')plt. show()Output: Let’s eliminate the color map for better view: heatmap = sns. heatmap(c_m_2, annot=annotation, fmt='', cbar=False, cmap='YlGn')heatmap. set_xticklabels(heatmap. get_xticklabels(), rotation=45, horizontalalignment='right')plt. title('Confusion Matrix')plt. show()Output: Evaluation: Now we can evaluate our accuracy, precision, recall and support scores with sklearn. metrics module as follows: from sklearn. metrics import classification_reportprint(classification_report(y_true, y_pred, labels=list(range(len(labels[:-1]))), target_names=labels[:-1]))Output: precision recall f1-score supportPotato__Early_blight 0. 26 0. 22 0. 23 172 Potato__Late_blight 0. 11 0. 13 0. 12 147 Potato__healthy 0. 17 0. 17 0. 17 173Tomato__Early_blight 0. 19 0. 17 0. 18 173 Tomato__Late_blight 0. 16 0. 18 0. 17 152 Tomato__healthy 0. 20 0. 19 0. 19 183 accuracy 0. 18 1000 macro avg 0. 18 0. 18 0. 18 1000 weighted avg 0. 18 0. 18 0. 18 1000Accuracy, Precision, Recall and Support scores are matched with ours. This is the full code:A github repository can be found on this link. "
}];
var idx = lunr(function () {
this.ref('id')
this.field('title')
this.field('body')
documents.forEach(function (doc) {
this.add(doc)
}, this)
});
function lunr_search(term) {
$('#lunrsearchresults').show( 1000 );
$( "body" ).addClass( "modal-open" );
document.getElementById('lunrsearchresults').innerHTML = '<div id="resultsmodal" class="modal fade show d-block" tabindex="-1" role="dialog" aria-labelledby="resultsmodal"> <div class="modal-dialog shadow-lg" role="document"> <div class="modal-content"> <div class="modal-header" id="modtit"> <button type="button" class="close" id="btnx" data-dismiss="modal" aria-label="Close"> × </button> </div> <div class="modal-body"> <ul class="mb-0"> </ul> </div> <div class="modal-footer"><button id="btnx" type="button" class="btn btn-secondary btn-sm caption-font-en heap-btn-col" style="font-weight: bold;" data-dismiss="modal">Close</button></div></div> </div></div>';
if(term) {
document.getElementById('modtit').innerHTML = "<h5 class='modal-title caption-font-en'>Search results for '" + term + "'</h5>" + document.getElementById('modtit').innerHTML;
//put results on the screen.
var results = idx.search(term);
if(results.length>0){
//console.log(idx.search(term));
//if results
for (var i = 0; i < results.length; i++) {
// more statements
var ref = results[i]['ref'];
var url = documents[ref]['url'];
var title = documents[ref]['title'];
var body = documents[ref]['body'].substring(0,160)+'...';
// document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML = document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML + "<li class='lunrsearchresult'><a href='" + url + "'><span class='title heading-font-en' style='color: black;'>" + title + "</span><br /><small><span class='body caption-font-en'>"+ body +"</span><br /><span class='url'>"+ url +"</span></small></a></li>";
document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML = document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML + "<li class='lunrsearchresult'><a href='" + url + "'><span class='title heading-font-en' style='color: black;'>" + title + "</span><br /><small><span class='body caption-font-en'>"+ body +"</span><br /></small></a></li>";
}
} else {
document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML = "<li class='lunrsearchresult caption-font-en'>Sorry, no results found. Close & try a different search!</li>";
}
}
return false;
}
</script>
<style>
.lunrsearchresult .title {
color: #d9230f;
}
.lunrsearchresult .url {
color: silver;
}
.lunrsearchresult a {
display: block;
color: #777;
}
.lunrsearchresult a:hover,
.lunrsearchresult a:focus {
text-decoration: none;
}
.lunrsearchresult a:hover .title {
text-decoration: underline;
}
</style>
<form
class="bd-search hidden-sm-down"
onSubmit="return lunr_search(document.getElementById('lunrsearch').value);"
>
<input
style="width: 220px"
type="text"
class="form-control text-small caption-font-en"
id="lunrsearch"
name="q"
value=""
placeholder="Type keyword and enter..."
/>
</form>
</ul>
</div>
</div>
</nav>
<!-- Search Results -->
<div id="lunrsearchresults">
<ul class="mb-0"></ul>
</div>
<!-- Content -->
<main role="main" class="site-content">
<div class="container">
<!-- Begin post excerpts, let's highlight the first 4 posts on top -->
<div class="row remove-site-content-margin">
<!-- latest post -->
<div class="col-md-6">
<div class="card border-0 mb-4 box-shadow">
<a href="/How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation-2021070218326405004/">
<div class="topfirstimage" style="background-image: url(/assets/images/2021-07-01-How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation/1.png); height: 200px; background-size: cover; background-repeat: no-repeat;"></div>
</a>
<div class="card-body px-0 pb-0 d-flex flex-column align-items-start">
<h2 class="h4 font-weight-bold">
<a class="text-dark heap-head-hov heading-font-en" href="/How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation-2021070218326405004/">How to make a custom confusion matrix on matplotlib with heatmap and annotation</a>
</h2>
<p class="excerpt article-font-en">
A confusion matrix is also known as an error matrix or matching matrix1. Each row and each column of this matrix represents the actua...
</p>
<div>
<small class="d-block text-muted">
<span class="catlist">
<a class="text-capitalize text-muted smoothscroll heap-cap-hov" href="/categories#machine learning">@Machine Learning</a><span class="sep"> </span>
<a class="text-capitalize text-muted smoothscroll heap-cap-hov" href="/categories#visualization">@Visualization</a><span class="sep"> </span>
</span>
</small>
<small class="text-muted heading-font-en">
Jul 02, 2021
</small>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<!-- second latest post --><div class="mb-3 d-flex align-items-center">
<div>
<h2 class="mb-2 h6 font-weight-bold">
<a class="text-dark heap-head-hov heading-font-en" href=""></a>
</h2>
<small class="d-block text-muted">
<span class="catlist">
</span>
</small>
<small class="text-muted heading-font-en">
</small>
</div>
</div>
<!-- third latest post --><div class="mb-3 d-flex align-items-center">
<div>
<h2 class="mb-2 h6 font-weight-bold">
<a class="text-dark heap-head-hov heading-font-en" href=""></a>
</h2>
<small class="d-block text-muted">
<span class="catlist">
</span>
</small>
<small class="text-muted heading-font-en">
</small>
</div>
</div>
<!-- fourth latest post --><div class="mb-3 d-flex align-items-center">
<div>
<h2 class="mb-2 h6 font-weight-bold">
<a class="text-dark heap-head-hov heading-font-en" href=""></a>
</h2>
<small class="d-block text-muted">
<span class="catlist">
</span>
</small>
<small class="text-muted heading-font-en">
</small>
</div>
</div>
</div>
</div>
<!-- Sticky - add sticky tag to the post you want to highlight here - tags: [sticky] -->
<!--endif page url is / -->
<!-- Now the rest of the posts with the usual loop but with an offset:4 on the first page so we can skeep the first 4 posts displayed above -->
<div class="row mt-3">
<div class="col-md-8 main-loop">
<h4 class="font-weight-bold spanborder"><span>All Stories</span></h4>
<div class="mb-5 d-flex justify-content-between main-loop-card">
<div class="pr-3">
<h2 class="mb-1 h4 font-weight-bold heading-font-en">
<a class="text-dark heap-head-hov" href="/How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation-2021070218326405004/"
>How to make a custom confusion matrix on matplotlib with heatmap and annotation</a
>
</h2>
<p class="excerpt caption-font-en">
A confusion matrix is also known as an error matrix or matching matrix1. Each row and each column of this matrix represents the actual class and the predicted class respectively. Here...
</p>
<small class="d-block text-muted caption-font-en">
<span class="catlist">
<a
class="text-capitalize text-muted smoothscroll heap-cap-hov"
href="/categories#machine learning"
>@Machine Learning</a
><span class="sep"> </span>
<a
class="text-capitalize text-muted smoothscroll heap-cap-hov"
href="/categories#visualization"
>@Visualization</a
><span class="sep"> </span>
</span>
</small>
<!--
<small class="text-muted caption-font-en">Jul 02, 2021</small> -->
<small class="text-muted heading-font-en"> Jul 02, 2021 </small>
</div>
<div class="col-md-3 pr-0 text-right">
<a href="/How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation-2021070218326405004/">
<img class="w-100" src="/assets/images/2021-07-01-How-to-make-a-custom-confusion-matrix-on-matplotlib-with-heatmap-and-annotation/1.png" alt="How to make a custom confusion matrix on matplotlib with heatmap and annotation">
</a>
</div>
</div>
<div class="mt-5">
<!-- Pagination links -->
</div>
</div>
<div class="col-md-4">
<div class="sticky-top sticky-top-offset">
<h4 class="font-weight-bold spanborder"><span>Featured</span></h4>
<ol class="list-featured">
</ol>
</div>
</div>
</div>
</div>
</main>
<!-- Scripts: popper, bootstrap, theme, lunr -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<script src="/assets/js/theme.js"></script>
<!-- Footer -->
<!-- <footer class="bg-white border-top p-3 text-muted small">
<div class="container">
<div class="row align-items-center justify-content-between">
<div>
<span class="navbar-brand mr-2 mb-0"><strong>Heaplinker</strong></span>
<span>Copyright © <script>document.write(new Date().getFullYear())</script>.</span>
</div>
<div>
<a class="text-dark ml-75rem" target="_blank" href="https://github.com/rjarman"><i class="fab fa-lg fa-github"></i></a>
<a class="text-dark ml-75rem" target="_blank" href="https://www.linkedin.com/in/rafsun-jany-arman/"><i class="fab fa-lg fa-linkedin"></i></a>
<a class="text-dark ml-75rem" target="_blank" href="https://www.facebook.com/rafsunjany.arman.1/"><i class="fab fa-lg fa-facebook"></i></a>
<a class="text-dark ml-75rem" target="_blank" href="https://twitter.com/_rjarman"><i class="fab fa-lg fa-twitter"></i></a>
</div>
</div>
</div>
</footer> -->
<footer>
<div>© 2021 - Heaplinker all rights reserved <a href="/privacy-policy">privacy-policy</a></div>
<div>
<a href="https://github.com/heaplinker" target="_blank">
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="github" class="svg-inline--fa fa-github fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="#707070" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>
</a>
<a href="https://discord.gg/faGt2AgDXj" target="_blank">
<svg width="71" height="55" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z" fill="#707070"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="71" height="55" fill="white"/>
</clipPath>
</defs>
</svg>
</a>
<a href="">
<svg enable-background="new 0 0 48 48" id="Layer_1" version="1.1" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="24" cy="24" fill="#707070" r="24"/><g><g><path d="M36.8,15.4c-0.9,0.5-2,0.8-3,0.9c1.1-0.7,1.9-1.8,2.3-3.1c-1,0.6-2.1,1.1-3.4,1.4c-1-1.1-2.3-1.8-3.8-1.8 c-2.9,0-5.3,2.5-5.3,5.7c0,0.4,0,0.9,0.1,1.3c-4.4-0.2-8.3-2.5-10.9-5.9c-0.5,0.8-0.7,1.8-0.7,2.9c0,2,0.9,3.7,2.3,4.7 c-0.9,0-1.7-0.3-2.4-0.7c0,0,0,0.1,0,0.1c0,2.7,1.8,5,4.2,5.6c-0.4,0.1-0.9,0.2-1.4,0.2c-0.3,0-0.7,0-1-0.1 c0.7,2.3,2.6,3.9,4.9,3.9c-1.8,1.5-4.1,2.4-6.5,2.4c-0.4,0-0.8,0-1.3-0.1c2.3,1.6,5.1,2.6,8.1,2.6c9.7,0,15-8.6,15-16.1 c0-0.2,0-0.5,0-0.7C35.2,17.6,36.1,16.6,36.8,15.4z" fill="#071324"/></g></g></svg>
</a>
<a href="" target="_blank">
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="instagram" class="svg-inline--fa fa-instagram fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="#707070" d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"></path></svg>
</a>
<a href="" target="_blank">
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="facebook" class="svg-inline--fa fa-facebook fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#707070" d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"></path></svg>
</a>
<!-- <a href="" target="_blank">
<svg width="67" height="67" viewBox="0 0 67 67" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.837 48.137V36.425C50.837 30.15 47.487 27.23 43.021 27.23C39.417 27.23 37.802 29.213 36.902 30.604V27.71H30.112C30.202 29.627 30.112 48.137 30.112 48.137H36.902V36.729C36.902 36.12 36.946 35.51 37.126 35.074C37.616 33.854 38.733 32.591 40.608 32.591C43.066 32.591 44.048 34.464 44.048 37.209V48.138L50.837 48.137ZM22.959 24.922C25.326 24.922 26.801 23.352 26.801 21.391C26.757 19.388 25.326 17.863 23.004 17.863C20.682 17.863 19.163 19.387 19.163 21.391C19.163 23.352 20.637 24.922 22.916 24.922H22.959ZM34 64C17.432 64 4 50.568 4 34C4 17.431 17.432 4 34 4C50.568 4 64 17.431 64 34C64 50.568 50.568 64 34 64ZM26.354 48.137V27.71H19.565V48.137H26.354Z" fill="#707070"/>
</svg>
</a> -->
</div>
</footer>
<!-- All this area goes before </body> closing tag -->
</body>
</html>