Cel projektu

Celem niniejszego projektu było dokładne zapoznanie się z metodą k najbliższych sąsiadów wraz z algorytmem poszukiwania najefektywniejszego parametru k dla tej metody. Do jego realizacji potrzebne będzie kilka bibliotek które załaduję już na samym jego początku. Będzie to przede wszystkim biblioteka tidyverse a także ggrepel oraz ggpubr pomocne przy tworzeniu bardziej efektownych wykresów, biblioteka kableExtra do prezentowania danych w formie wygodnych tabelek, biblioteka rlang która umożliwia pisanie funkcji działających w potoku %>% z bezpośrednim użyciem nazw zmiennych (podobnie jak w przypadku funkcji z pakietu dplyr) oraz biblioteki caret i class z których wykorzystuję głównie funkcje knn i confusionMatrix.

Zdaję sobie sprawę, że używanie macierzy konfuzji ma sens w zasadzie tylko dla zmiennej przyjmującej tylko dwie wartości (binarnej) podczas gdy metodę k najbliższych sąsiadów z powodzeniem można stosować także dla zmiennych kategorialnych przyjmujących wartości z zbiorów większego niż dwuelementowe. Chciałem jednak przekonać się na ile przydatna może być ta metoda w przypadku predykcji zmiennych binarnych, a przez to nieco szerzej “wniknąć w jej zakamarki”.

library(tidyverse)
library(ggrepel)
library(ggpubr)
library(kableExtra)
library(rlang)
library(caret)
library(class)
source("knn plots.R", encoding = 'UTF-8')

kable1 = function(data) data %>% kbl() %>% 
  kable_styling(bootstrap_options = 
                  c("striped", "hover", "condensed", "responsive"))

kable2 = function(data, height="240px") data %>% kable1 %>% 
  scroll_box(width = "100%", height = height)

Zbiór danych

W projekcie tym będę pracował na ramce danych pochodzących ze zbioru diabetes. Po wczytaniu danych zostaną one sprawdzone pod kątem obecności wartości NA a nastąpienie przeskalowane przy użyciu funkcji mutate_at oraz scale.

cukrzyca = read.csv("http://web.ue.katowice.pl/woali/Rdane/diabetes.csv") %>% 
  as_tibble()

#Test braku wartości NA
(cukrzyca |> nrow())==(cukrzyca |> na.omit() |> nrow())
## [1] TRUE
#Normalizacja atrybutów
cukrzyca = cukrzyca %>% mutate_at(vars(-Outcome), ~as.numeric(scale(.)))
cukrzyca %>% kable2
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
0.6395305 0.8477713 0.1495433 0.9066791 -0.6924393 0.2038799 0.4681869 1.4250667 1
-0.8443348 -1.1226647 -0.1604412 0.5305558 -0.6924393 -0.6839762 -0.3648230 -0.1905477 0
1.2330766 1.9424580 -0.2637694 -1.2873733 -0.6924393 -1.1025370 0.6040037 -0.1055154 1
-0.8443348 -0.9975577 -0.1604412 0.1544326 0.1232213 -0.4937213 -0.9201630 -1.0408711 0
-1.1411079 0.5037269 -1.5037073 0.9066791 0.7653372 1.4088275 5.4813370 -0.0204831 1
0.3427574 -0.1530851 0.2528715 -1.2873733 -0.6924393 -0.8108128 -0.8175458 -0.2755801 0
-0.2507887 -1.3416021 -0.9870665 0.7186174 0.0711579 -0.1258952 -0.6756927 -0.6157094 1
1.8266227 -0.1843619 -3.5702706 -1.2873733 -0.6924393 0.4195021 -1.0197620 -0.3606124 0
-0.5475618 2.3803327 0.0462151 1.5335512 4.0193026 -0.1893135 -0.9473263 1.6801637 1
1.2330766 0.1284058 1.3894813 -1.2873733 -0.6924393 -4.0578295 -0.7239831 1.7651961 1
0.0459844 -0.3407457 1.1828249 -1.2873733 -0.6924393 0.7112263 -0.8477273 -0.2755801 0
1.8266227 1.4733066 0.2528715 -1.2873733 -0.6924393 0.7619609 0.1965532 0.0645493 1
1.8266227 0.5662805 0.5628560 -1.2873733 -0.6924393 -0.6205579 2.9249624 2.0202931 0
-0.8443348 2.1301186 -0.4704257 0.1544326 6.6485067 -0.2400482 -0.2229699 2.1903578 1
0.3427574 1.4107531 0.1495433 -0.0963163 0.8260779 -0.7854455 0.3474608 1.5100991 1
0.9363036 -0.6535133 -3.5702706 -1.2873733 -0.6924393 -0.2527318 0.0365912 -0.1055154 1
-1.1411079 -0.0905316 0.7695123 1.6589256 1.3033261 1.7512863 0.2388073 -0.1905477 1
0.9363036 -0.4345760 0.2528715 -1.2873733 -0.6924393 -0.3034664 -0.6575838 -0.1905477 1
-0.8443348 -0.5596830 -2.0203481 1.0947407 0.0277717 1.4341948 -0.8718725 -0.0204831 0
-0.8443348 -0.1843619 0.0462151 0.5932430 0.1405758 0.3307165 0.1724080 -0.1055154 1
-0.2507887 0.1596825 0.9761686 1.2828023 1.3467123 0.9268485 0.7005846 -0.5306771 0
1.2330766 -0.6847901 0.7695123 -1.2873733 -0.6924393 0.4321858 -0.2531514 1.4250667 0
0.9363036 2.3490559 1.0794968 -1.2873733 -0.6924393 0.9902668 -0.0630078 0.6597757 1
1.5298497 -0.0592548 0.5628560 0.9066791 -0.6924393 -0.3795684 -0.6304204 -0.3606124 1
2.1233958 0.6913875 1.2861531 0.7813046 0.5744379 0.5843897 -0.6575838 1.5100991 1
1.8266227 0.1284058 0.0462151 0.3424942 0.3054434 -0.1132116 -0.8054732 0.6597757 1
0.9363036 0.8164946 0.3561996 -1.2873733 -0.6924393 0.9395321 -0.6485293 0.8298403 1
-0.8443348 -0.7473436 -0.1604412 -0.3470651 0.5223744 -1.1152206 0.0456456 -0.9558388 0
2.7169419 0.7539410 0.6661841 -0.0963163 0.2620572 -1.2420572 -0.6847471 2.0202931 0
0.3427574 -0.1218083 1.1828249 -1.2873733 -0.6924393 0.2672982 -0.4070772 0.4046786 0
0.3427574 -0.3720224 0.3045355 0.3424942 -0.6924393 0.5082877 0.2237166 2.2753901 0
-0.2507887 1.1605390 0.3561996 0.9693663 1.4334848 -0.0497933 1.1442529 -0.4456447 1
-0.2507887 -1.0288345 -0.5737538 -0.5978140 -0.2238683 -0.9122821 -0.6183478 -0.9558388 0
0.6395305 -0.9037274 1.1828249 -1.2873733 -0.6924393 -1.5337814 -0.8567818 -0.4456447 0
1.8266227 0.0345755 0.4595278 0.6559302 -0.6924393 -0.5571396 0.1210994 0.9999050 0
0.0459844 -0.5596830 -0.4704257 0.7813046 0.9735910 -1.0137513 1.4913403 -0.0204831 0
2.1233958 0.5350037 0.3561996 -1.2873733 -0.6924393 0.1531453 -0.1565706 0.1495816 0
1.5298497 -0.5909598 0.3561996 1.0320535 -0.6924393 0.1150943 0.5828766 1.0849374 1
-0.5475618 -0.9662809 -0.0571130 1.3454895 -0.6924393 0.7873282 0.0939360 -0.5306771 1
0.0459844 -0.3094689 0.1495433 1.6589256 1.1037496 0.6478080 2.7710367 1.9352608 1
-0.2507887 1.8486277 -0.2637694 0.2798070 -0.0850324 0.2546145 -0.6062752 -0.6157094 0
0.9363036 0.3786199 0.7695123 -1.2873733 -0.6924393 1.0410014 0.6764393 0.3196463 0
0.9363036 -0.4658527 1.1828249 -0.1590035 -0.6924393 -1.1786389 -0.7149286 1.2550020 0
1.5298497 1.5671369 2.1127784 0.2171198 1.3900986 1.7005517 0.7518931 1.7651961 1
0.9363036 1.1918157 -0.2637694 -1.2873733 -0.6924393 -0.5825069 -0.5368577 0.5747433 0
-1.1411079 1.8486277 -0.1604412 1.1574279 -0.6924393 1.2693073 4.2891671 -0.7007418 1
-0.8443348 0.7852178 -0.6770820 -1.2873733 -0.6924393 -0.2907828 0.2780433 -0.3606124 0
-0.5475618 -1.5605394 0.0462151 0.4051814 -0.6924393 -0.5064050 0.3444426 -0.9558388 0
0.9363036 -0.5596830 -0.1604412 0.7186174 -0.6924393 0.9014811 -0.3859501 -0.1905477 1
0.9363036 -0.4971295 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.5036580 -0.7857741 0
-0.8443348 -0.5596830 0.5628560 -0.5978140 0.0190944 -1.5971997 0.0577182 -0.9558388 0
-0.8443348 -0.6222365 -0.9870665 -0.3470651 -0.3800586 -0.9883840 0.1633535 -0.6157094 0
0.3427574 -1.0288345 -0.1604412 0.0290581 -0.4928628 -0.9630167 -0.3919864 -0.2755801 0
1.2330766 1.7235207 1.0794968 0.8439919 1.9107330 0.2165636 -0.0147174 2.1053254 1
0.9363036 0.9103248 -0.1604412 1.3454895 2.2751772 0.3434002 0.7428387 0.7448080 0
-0.8443348 -1.4979859 -0.9870665 -0.6605012 -0.6924393 -1.1405879 -0.6756927 -1.0408711 0
0.9363036 2.0675651 -0.0571130 1.1574279 1.9454420 0.7239099 -0.6575838 0.6597757 1
-1.1411079 -0.6535133 0.9761686 2.4738593 0.2620572 1.8781229 1.4792677 -0.1905477 0
-1.1411079 0.7852178 0.6661841 -1.2873733 -0.6924393 1.0790524 3.9511341 0.9148727 0
-1.1411079 -0.4971295 -0.2637694 1.2828023 0.5397289 1.2058890 -0.9020541 -0.9558388 0
-0.5475618 -1.1539415 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.5066762 -1.0408711 0
1.2330766 0.3786199 0.1495433 -1.2873733 -0.6924393 0.1150943 -0.6092933 0.4897110 1
0.3427574 -2.4050120 -0.3670975 -1.2873733 -0.6924393 -0.8869148 0.3474608 0.2346140 0
-0.5475618 0.6288340 -0.5737538 0.8439919 0.4182475 -0.8361801 0.6854938 -0.7857741 0
0.9363036 -0.2156386 -0.1604412 -1.2873733 -0.6924393 0.1024106 -0.6455111 0.7448080 1
0.3427574 -0.6847901 0.2528715 0.4051814 -0.6924393 -0.3795684 -0.8115095 -0.1055154 0
-1.1411079 -0.3720224 0.9761686 0.5932430 -0.6924393 0.0643597 1.1563255 0.4046786 1
-0.5475618 -0.3720224 1.1828249 -1.2873733 -0.6924393 1.3580929 1.1261440 1.7651961 0
-0.8443348 -0.8098971 -0.1604412 -0.4724395 -0.3627042 -1.5718323 -0.4161316 -0.7007418 0
0.0459844 0.7852178 0.8211764 0.4051814 0.1752848 -0.3922521 -0.8537636 -0.5306771 0
-0.5475618 -0.6535133 -0.1604412 -0.0336291 0.0885124 0.1150943 1.1925433 -0.4456447 1
0.3427574 0.5662805 -0.2637694 0.9066791 0.5223744 -0.4303030 -0.1837339 -0.6157094 0
2.7169419 0.1596825 1.0794968 -1.2873733 -0.6924393 1.4468785 0.3353882 0.7448080 1
0.0459844 0.2535128 0.8728404 -0.0336291 1.6504158 0.3941348 -0.7270012 -0.8708064 0
-0.8443348 -1.3103253 0.3045355 0.5932430 -0.6924393 0.0009414 -0.2290062 -0.9558388 0
-0.8443348 -3.7811896 -1.0903947 -0.0336291 -0.6924393 -0.9249657 -1.0016531 -0.9558388 0
0.9363036 -1.8420303 0.4595278 -1.2873733 -0.6924393 0.0770433 -0.2440970 0.6597757 0
0.3427574 -0.8098971 0.1495433 0.7813046 -0.6924393 0.7239099 -0.3074781 -0.5306771 0
-1.1411079 0.3160664 -3.5702706 -1.2873733 -0.6924393 1.4215112 -0.6092933 -0.6157094 1
-0.5475618 -0.2781921 -0.1604412 0.0917453 -0.6924393 -0.8869148 -0.4976217 -0.7857741 0
-0.2507887 -0.2469154 -1.2970510 -0.4724395 -0.6924393 -1.2166899 -1.0016531 -0.9558388 0
-0.5475618 -1.4667091 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -1.1163428 -0.9558388 0
0.9363036 -1.1852183 0.4595278 0.3424942 -0.0763552 -0.3415174 0.8907281 0.2346140 0
-1.1411079 -0.6222365 -0.2121053 0.4678686 -0.6924393 -0.9376494 -0.7088923 -0.9558388 0
0.3427574 0.5037269 2.0094502 -1.2873733 -0.6924393 2.1317961 -0.7390739 0.3196463 1
-0.5475618 -0.3407457 0.2528715 0.5305558 0.3922158 0.0516760 0.6824756 -0.5306771 0
2.7169419 -0.4658527 0.1495433 2.0977360 -0.6924393 0.5843897 -0.8869633 0.9999050 0
-0.5475618 -0.6535133 -0.0571130 0.2798070 -0.0763552 0.8253792 -0.4463131 -0.6157094 0
3.3104881 0.4724502 0.0462151 0.7186174 0.2620572 0.6478080 -0.9624171 0.8298403 1
-0.8443348 -0.4345760 -0.0571130 -0.0963163 -0.6924393 -0.6966599 -0.9261993 -0.7857741 0
-0.8443348 -1.2790486 -0.7287461 -1.2873733 -0.6924393 -1.6352506 -0.6455111 -1.0408711 0
0.0459844 0.0658522 0.5628560 -0.3470651 0.8347551 0.0009414 -0.0871531 0.0645493 0
0.9363036 -1.2477718 0.4595278 1.2201151 -0.2759317 1.8654392 -0.6364567 0.7448080 0
0.0459844 0.4098966 0.1495433 -1.2873733 -0.6924393 -1.0391187 -0.5881663 2.2753901 1
-0.5475618 0.6601107 0.6661841 -0.1590035 -0.1370959 -0.9249657 0.8726192 -1.0408711 0
0.6395305 0.7226643 0.1495433 0.4051814 1.2859717 0.2419309 -0.6545656 0.5747433 0
-0.5475618 -0.9037274 -0.3670975 0.4678686 -0.6924393 -0.0497933 -1.0318346 -0.7857741 0
-0.8443348 -1.5605394 -1.0903947 -0.1590035 -0.0329690 -1.4703631 -0.4493313 -0.9558388 0
0.6395305 -0.8724506 -0.9870665 0.5932430 -0.1370959 -0.4176194 -0.3497323 -0.8708064 0
-0.8443348 0.0345755 1.0794968 1.9096744 1.2165537 2.2459490 -0.4432950 -0.1905477 1
-0.8443348 1.3169228 0.1495433 -1.2873733 -0.6924393 0.8887975 2.2639872 -0.0204831 1
-0.8443348 0.9416016 -0.4704257 -1.2873733 -0.6924393 -0.7473945 -0.8839451 -0.9558388 0
-1.1411079 0.1284058 1.3894813 -1.2873733 -0.6924393 -1.2040062 -0.6334385 -1.0408711 0
-0.8443348 -1.2477718 0.1495433 -0.1590035 -0.3453497 -0.6839762 -0.5700574 -0.7857741 0
-0.5475618 -1.1226647 -0.2121053 -1.2873733 -0.6924393 0.9648994 1.3826869 -0.5306771 0
-0.8443348 0.1596825 -0.6770820 0.5305558 0.6265013 -0.4176194 0.9933453 -1.0408711 0
-0.8443348 -0.7786204 2.7327474 -1.2873733 -0.6924393 -1.2166899 -0.7994369 -0.5306771 0
0.0459844 0.7226643 -0.5737538 0.4678686 0.5223744 -0.3161501 -0.5579847 0.3196463 0
-0.2507887 -1.1852183 -0.5737538 0.6559302 -0.5362490 0.2926655 -0.4100953 -0.7007418 0
-1.1411079 -0.8098971 0.8211764 0.2798070 -0.3800586 0.6858589 -0.6787108 -0.7857741 1
-0.2507887 1.5671369 0.1495433 0.7813046 0.4789882 0.1658289 -0.8235821 -0.7857741 1
1.2330766 1.0667087 -0.3670975 0.3424942 3.6027950 0.2546145 0.2146621 1.0849374 1
-0.8443348 -0.9975577 0.3561996 0.8439919 -0.3713814 -0.1005279 -0.8447092 -0.8708064 0
0.0459844 -1.4041556 -0.3670975 -1.2873733 -0.6924393 0.2546145 -0.2440970 -0.7007418 0
0.9363036 1.2230925 -0.7804102 0.7186174 0.8260779 -0.1893135 0.3504789 0.4897110 1
0.0459844 0.7852178 1.1828249 -1.2873733 -0.6924393 -0.1005279 0.2025895 2.3604225 1
0.3427574 0.0971290 0.2528715 -1.2873733 -0.6924393 0.2546145 -0.7602009 0.4046786 1
0.3427574 -1.3416021 -1.0903947 -1.2873733 -0.6924393 0.2165636 0.5496770 -0.7007418 0
0.0459844 -0.7473436 -0.4704257 0.1544326 -0.6924393 -0.4810377 -0.0871531 -0.9558388 0
0.0459844 -0.6847901 0.3561996 -0.3470651 -0.2499000 -1.1152206 -0.7511465 -1.0408711 0
-1.1411079 1.2856460 0.3561996 2.2231105 0.1752848 2.6898770 0.8665829 -0.7007418 1
0.6395305 -0.3094689 -0.2637694 1.1574279 -0.6924393 0.2799819 -0.6394748 -0.7857741 0
-0.5475618 -0.4345760 0.2528715 0.5932430 0.1752848 0.2038799 -0.2048610 -0.8708064 0
0.3427574 0.3473431 0.5628560 -1.2873733 -0.6924393 -0.6586089 -0.8628181 3.0406812 0
-1.1411079 -0.2469154 0.3561996 -1.2873733 -0.6924393 0.1658289 -0.5851481 -0.8708064 1
-0.8443348 -1.0288345 -2.0203481 1.3454895 0.1666075 2.9181829 0.0728090 -0.6157094 1
-0.2507887 -0.0279780 0.0462151 0.5932430 0.4789882 1.3834602 -0.0599897 -0.2755801 0
-0.8443348 -0.0905316 -0.5737538 0.9693663 0.1232213 0.1658289 -0.6364567 -0.8708064 0
-0.8443348 -0.1218083 0.9761686 0.2171198 0.5657606 0.3180328 -0.2078791 0.5747433 1
-1.1411079 -0.4971295 0.7695123 -1.2873733 -0.6924393 -0.5190886 0.8122562 2.4454548 1
0.0459844 1.6296904 0.0462151 -0.4097523 0.7653372 -0.2907828 -0.3346415 -0.0204831 1
1.5298497 0.0345755 -0.6770820 -1.2873733 -0.6924393 0.1658289 1.9380268 -0.0204831 1
-0.2507887 1.5358601 -0.2637694 1.0320535 1.2599399 0.3180328 -0.3497323 -0.2755801 1
1.2330766 -1.1539415 0.2528715 0.6559302 -0.6924393 0.8000119 -0.0448989 0.4897110 0
-0.5475618 -0.7786204 -0.0571130 -0.4724395 -0.2672545 -1.3815775 0.5285499 -0.6157094 0
-0.5475618 0.1284058 -0.4704257 -0.0336291 0.5223744 0.2292472 -1.1585970 -0.1905477 0
-1.1411079 -0.6535133 0.0462151 0.3424942 -0.2585773 -0.1512625 0.3776423 -1.0408711 0
-1.1411079 -0.8724506 -0.4704257 0.2798070 0.1058669 -0.4176194 0.1814624 -0.9558388 0
-1.1411079 0.2535128 0.5628560 -1.2873733 -0.6924393 -0.1005279 0.6975664 -0.3606124 0
0.3427574 -0.4971295 0.1495433 0.5305558 2.1276641 0.6224407 -0.9443082 -0.4456447 0
-0.2507887 0.2222361 0.4595278 -1.2873733 -0.6924393 -1.3815775 -0.6153296 1.8502284 0
0.3427574 -0.4658527 0.6661841 0.5932430 -0.6924393 0.9522158 -0.5610029 0.4046786 0
-0.5475618 -0.4032992 -0.8837383 0.3424942 -0.1457731 0.0643597 -0.4644220 -0.9558388 0
1.8266227 -0.4032992 -0.1604412 -1.2873733 -0.6924393 0.0516760 -0.6032570 0.7448080 1
0.0459844 1.0354319 -0.3670975 0.6559302 1.7718972 0.1024106 -0.7088923 -0.8708064 0
-1.1411079 -0.5909598 0.3045355 0.1544326 -0.6924393 -4.0578295 0.3021885 -1.0408711 0
1.5298497 -1.9984141 0.5628560 1.0320535 -0.6924393 0.1024106 -1.1344517 0.6597757 0
-0.5475618 -0.4658527 -0.2637694 0.9066791 0.3401524 -0.1893135 2.8012182 0.0645493 0
0.3427574 0.8164946 0.4595278 -1.2873733 -0.6924393 0.2165636 -0.7662372 2.7005518 0
-0.5475618 -0.9662809 0.0462151 -0.2216907 -0.6924393 -0.5951906 -1.1676514 -0.9558388 0
-0.8443348 0.4724502 0.2528715 1.8469872 1.0777179 0.6858589 -0.2199517 -0.7857741 0
0.0459844 -0.2156386 -0.2121053 -1.2873733 -0.6924393 -1.2801082 -0.1203527 0.3196463 0
1.5298497 1.0979854 0.8728404 0.4678686 0.6525331 0.2926655 2.1643882 0.7448080 1
-0.8443348 1.0041551 0.6661841 1.3454895 3.5160226 1.0917360 0.6492760 -0.8708064 0
1.2330766 2.0988418 0.4595278 -1.2873733 -0.6924393 2.0176431 -1.0107075 0.8298403 1
0.9363036 0.9728784 0.9761686 1.4708639 -0.6924393 2.2840000 -0.4070772 0.2346140 1
-0.5475618 -0.6847901 -0.8837383 -0.3470651 0.1232213 -0.9376494 0.4983684 -1.0408711 0
-0.8443348 -0.3720224 -0.6770820 0.0290581 0.4789882 -0.8615474 1.0899261 -0.8708064 0
-0.5475618 -1.0288345 0.2528715 -0.0963163 -0.2325455 -0.3795684 -0.7330376 -0.9558388 0
3.9040342 1.3169228 0.1495433 1.2828023 0.2967662 1.1297870 1.0416357 1.1699697 1
0.0459844 0.9416016 1.0794968 1.0947407 -0.6924393 -0.2907828 -0.5368577 0.2346140 0
0.9363036 -0.5909598 0.2528715 1.2201151 0.2186710 0.6604916 -0.8084913 0.9999050 0
-1.1411079 -0.2156386 0.5628560 0.8439919 1.7805744 1.5483477 -0.9201630 -0.5306771 0
-0.5475618 -0.6535133 -0.2637694 0.1544326 -0.6924393 -0.2907828 -0.3135144 -1.0408711 0
-1.1411079 0.3160664 0.9761686 -1.2873733 -0.6924393 -0.0497933 0.8182925 -0.1055154 1
0.6395305 -0.5284062 0.2528715 -0.1590035 0.6612103 -0.2654155 0.7549113 0.6597757 1
-0.2507887 0.8477713 -0.1604412 0.2798070 -0.6924393 0.0643597 -0.6515475 -0.9558388 0
0.0459844 -0.0279780 -0.0571130 -1.2873733 -0.6924393 -0.3034664 0.7156753 0.0645493 0
0.0459844 -0.3407457 -0.1604412 -1.2873733 -0.6924393 -0.0117423 -0.0026448 -0.3606124 0
-0.2507887 -0.3094689 1.0794968 -0.5351267 -0.0156145 -0.4556704 0.0697908 -0.3606124 0
0.6395305 -0.5909598 0.6661841 -1.2873733 -0.6924393 -0.1512625 -0.8809270 0.2346140 1
0.6395305 0.4098966 0.0462151 0.1544326 0.4356020 0.4321858 0.2116440 -0.3606124 1
-0.5475618 -1.0601112 -3.5702706 0.1544326 -0.6924393 -0.3922521 0.9088370 -0.7007418 0
-0.8443348 -1.3103253 -0.4704257 1.3454895 -0.2759317 1.4595621 0.6221126 -0.8708064 0
-0.5475618 -1.4354324 -0.2637694 0.2171198 -0.2151911 -0.2907828 -0.3074781 -0.0204831 0
1.2330766 1.8173510 0.1495433 1.3454895 0.4356020 0.0897270 0.7458568 0.2346140 1
0.6395305 -1.1226647 0.4595278 -1.2873733 -0.6924393 -0.1005279 -0.2712603 0.7448080 0
-1.1411079 0.2535128 2.1127784 1.5962384 0.4356020 4.4529056 -0.4614039 -0.6157094 1
0.3427574 0.6913875 0.4595278 -1.2873733 -0.6924393 1.6498170 -0.8507455 1.1699697 0
0.3427574 0.2847896 0.6661841 -1.2873733 -0.6924393 0.9014811 1.4611588 0.3196463 1
0.6395305 -1.0601112 0.5628560 -1.2873733 -0.6924393 -1.1152206 -1.1706696 -0.1055154 0
-1.1411079 -0.0592548 -0.2637694 -0.1590035 0.1058669 0.3687675 0.7639657 -0.8708064 0
-0.8443348 -3.7811896 0.2528715 -0.0336291 -0.4928628 -0.5444560 -0.5217669 -1.0408711 0
0.3427574 -1.4979859 -0.4704257 -1.2873733 -0.6924393 -0.6586089 -0.6153296 -0.5306771 0
0.0459844 0.6288340 0.2528715 -1.2873733 -0.6924393 -0.5571396 -0.6877653 0.5747433 0
0.9363036 2.2865024 -0.0571130 0.4678686 -0.6924393 0.4956041 0.8243288 0.6597757 1
1.2330766 1.8799045 -0.0571130 0.9693663 3.6027950 -0.2400482 0.4319690 2.2753901 1
-0.8443348 0.2222361 1.4928094 1.2828023 -0.1891593 0.0009414 2.5627842 -0.0204831 1
1.2330766 -0.3720224 0.3561996 1.1574279 0.2967662 -0.5190886 0.5074228 -0.1905477 1
0.3427574 0.5662805 0.5628560 0.9066791 0.6959193 -0.0497933 -0.3346415 -0.7007418 1
-0.2507887 -0.3094689 -0.3670975 -1.2873733 -0.6924393 -1.1913226 -0.9956168 -1.0408711 0
1.5298497 0.0658522 0.0462151 1.4708639 0.1232213 0.1404616 -0.2954055 0.5747433 0
0.9363036 1.1918157 -0.1604412 -1.2873733 -0.6924393 -0.2019972 -0.2682422 0.2346140 1
2.1233958 0.4411734 -3.5702706 -1.2873733 -0.6924393 2.5757241 0.3202974 0.5747433 1
1.2330766 -1.1226647 -0.7287461 -0.0336291 -0.6924393 -0.9630167 -1.0137257 0.7448080 0
0.3427574 1.1605390 0.7695123 1.2828023 1.1297813 0.9395321 -0.2320244 -0.3606124 1
-0.8443348 -0.4971295 -0.5737538 -1.2873733 -0.6924393 -0.9757004 -0.8597999 -1.0408711 0
-0.2507887 -0.4345760 -0.3670975 -0.4724395 -0.2759317 -1.1532716 0.6221126 -0.8708064 1
0.0459844 -0.3720224 -0.2637694 1.4708639 0.1666075 0.3560838 1.3072331 -0.6157094 1
0.0459844 0.8477713 -0.4704257 0.4051814 2.0669234 -0.1385789 -0.9714715 -0.3606124 1
-1.1411079 -0.2469154 0.5628560 -0.2843779 -0.6924393 -0.1258952 1.2136704 -1.0408711 0
-0.8443348 0.5350037 0.6661841 -1.2873733 -0.6924393 1.0283177 -0.7119105 -0.4456447 0
-1.1411079 -0.4032992 -0.0571130 -0.0336291 -0.6924393 -0.5951906 0.9510912 -0.1055154 0
-0.5475618 -0.6847901 0.0462151 -0.2843779 -0.3106407 -1.4703631 -0.7149286 -0.5306771 0
0.6395305 -0.5596830 0.1495433 0.7186174 0.9562365 0.7239099 -0.4463131 1.8502284 0
0.3427574 -0.3094689 0.1495433 0.4678686 -0.6924393 -1.0264350 -0.1958065 -0.5306771 0
1.2330766 2.3490559 0.3561996 0.5305558 1.7371882 0.6985426 0.4017875 2.0202931 1
0.3427574 1.2856460 1.8027939 -1.2873733 -0.6924393 0.7239099 -0.9684534 1.5951314 1
-0.8443348 -0.7786204 -0.2637694 0.4051814 0.0624807 0.1531453 -0.5519484 -1.0408711 0
0.9363036 1.9737348 0.7695123 0.7813046 -0.6924393 0.4448694 -0.3527504 0.6597757 1
-0.5475618 -1.2477718 -0.4704257 0.0917453 -0.6924393 -0.5444560 -0.5489303 -0.7007418 0
-1.1411079 0.8164946 0.8211764 2.0977360 -0.6924393 1.3707765 -0.2923874 -0.7857741 0
0.9363036 1.8173510 1.3378172 0.6559302 -0.6924393 0.2799819 -0.9292174 2.2753901 0
-1.1411079 0.5975572 -0.2121053 0.3424942 0.4356020 1.3454092 -0.1233709 -0.7857741 1
1.5298497 -0.2781921 0.6661841 0.7186174 0.8260779 0.2799819 -0.6394748 0.2346140 1
2.4201689 0.9416016 0.0462151 1.2201151 1.6590930 1.2439399 0.8152743 0.4046786 1
0.3427574 -0.3720224 -0.3670975 1.2828023 0.4269248 0.4829204 0.1271357 -0.7007418 1
0.6395305 0.1284058 -0.0571130 0.5932430 0.3488296 -0.2527318 -0.0237719 -0.1055154 0
0.3427574 -1.1226647 0.2528715 0.0917453 -0.6924393 -0.3795684 2.2700235 -0.1055154 1
0.3427574 -0.2781921 -0.1604412 -1.2873733 -0.6924393 0.7365936 -0.6364567 0.6597757 1
-1.1411079 1.7547974 -0.4704257 0.5305558 3.4552819 0.3307165 1.8112644 -1.0408711 1
-0.5475618 1.1605390 1.0794968 -1.2873733 -0.6924393 -0.0497933 1.0054179 2.7855842 1
0.9363036 -0.0592548 -3.5702706 -1.2873733 -0.6924393 -0.8615474 -0.7934006 0.3196463 0
0.9363036 0.6601107 -0.4704257 0.7813046 0.9562365 -0.4049357 0.6492760 2.3604225 0
-0.8443348 -0.6535133 -0.1604412 -0.3470651 -0.2065138 -1.0644860 0.5858948 -0.6157094 0
-0.8443348 -1.0601112 0.4595278 0.4051814 -0.4147676 0.3307165 -1.1193610 -0.9558388 0
-1.1411079 -0.6222365 0.3561996 -1.2873733 -0.6924393 0.4702367 -0.8266003 -0.6157094 0
-0.2507887 1.2856460 -0.8837383 1.0947407 -0.6924393 0.6604916 0.5436407 -0.7857741 1
0.0459844 2.3803327 0.0462151 1.1574279 5.7634281 0.5970733 5.6050813 -0.1905477 0
-1.1411079 -0.1218083 0.5628560 0.6559302 -0.2325455 1.6751843 -1.1555788 -0.7857741 0
0.0459844 0.6601107 0.8728404 -1.2873733 -0.6924393 1.5229804 0.5225136 -0.9558388 1
0.6395305 0.4098966 0.5628560 1.0320535 2.5181399 1.8020209 -0.7058742 1.0849374 1
-0.8443348 -1.3103253 0.5628560 0.2798070 -0.3713814 -0.8361801 0.3353882 -0.9558388 0
0.0459844 0.0345755 -0.0571130 -1.2873733 -0.6924393 0.3814511 -0.2350425 -0.3606124 0
-0.2507887 -1.4667091 -0.0571130 0.4678686 -0.3019635 -0.2907828 -0.5398758 -0.8708064 0
0.0459844 1.5671369 0.1495433 -1.2873733 -0.6924393 1.4722458 0.0215004 -0.6157094 1
0.9363036 1.8799045 0.7695123 0.0290581 0.9735910 0.4956041 0.3444426 1.5100991 1
-1.1411079 1.8173510 1.0794968 0.4051814 -0.6924393 1.5356641 0.6462578 -0.8708064 1
1.5298497 1.3481995 0.7695123 0.0290581 -0.6924393 -0.1512625 1.0838898 -0.1055154 1
-1.1411079 -0.5284062 0.3561996 -1.2873733 -0.6924393 -1.7240362 0.3323700 -0.5306771 0
-0.8443348 -0.9350042 -0.2637694 0.2171198 -0.6924393 -0.3542011 -0.8447092 -1.0408711 0
0.0459844 -0.9350042 0.0462151 0.7186174 0.0711579 0.1404616 -0.0780986 -0.9558388 0
-0.2507887 0.5662805 -0.7804102 -1.2873733 -0.6924393 -0.8108128 -0.2108973 -0.9558388 1
0.6395305 -0.0592548 -0.9870665 0.0917453 0.8347551 -0.6205579 2.5537298 -0.0204831 1
-0.5475618 0.7852178 0.3561996 0.9066791 0.9909455 0.7873282 -0.4312224 -0.3606124 0
1.5298497 1.9737348 0.8211764 -0.3470651 -0.6924393 -0.2527318 2.2368238 1.3400344 1
1.8266227 0.0345755 -0.0571130 -1.2873733 -0.6924393 -0.1005279 -0.6455111 0.6597757 0
-1.1411079 1.3794763 1.0794968 0.7813046 5.2080847 2.5757241 -0.1354435 -0.8708064 0
1.5298497 0.0971290 0.0462151 0.7813046 2.7958116 0.4321858 -0.5730755 0.0645493 0
-0.8443348 -0.3094689 0.8728404 -0.0963163 -0.6924393 -0.2400482 -0.9925986 -0.8708064 0
1.5298497 -0.4658527 -0.8837383 -1.2873733 -0.6924393 -0.1005279 -0.2772966 0.7448080 0
-0.5475618 0.2535128 0.7695123 -1.2873733 -0.6924393 -0.5064050 -0.5670392 -0.5306771 0
-0.5475618 -0.9662809 0.5628560 -0.4097523 -0.2151911 -0.9630167 -0.6726745 -0.7857741 0
-1.1411079 -1.0913880 -0.0571130 0.7186174 -0.6924393 0.4829204 -0.7058742 -0.7007418 0
2.4201689 -0.9037274 -0.3670975 -0.8485628 1.5462889 -0.5571396 1.3706143 0.9148727 1
-0.8443348 -0.2469154 -0.2637694 0.9066791 -0.6924393 0.2038799 0.2146621 -1.0408711 1
-0.2507887 -0.3094689 -0.6770820 1.1574279 -0.6924393 -0.2400482 0.2569162 -0.2755801 0
-0.5475618 -0.2156386 -0.0571130 0.0917453 -0.6924393 -0.4176194 -1.1465244 -0.7007418 0
-0.8443348 2.2552257 -0.9870665 -0.2843779 2.5615261 -0.7727618 0.5526951 -0.7857741 0
2.1233958 1.0667087 0.3561996 0.4678686 0.6091468 0.1658289 2.6593651 1.5100991 1
-0.2507887 2.1926721 -0.0571130 -0.3470651 0.4356020 -0.1385789 -0.5217669 0.0645493 0
-0.2507887 0.6288340 -3.5702706 -1.2873733 -0.6924393 -0.2527318 0.8726192 -0.5306771 1
0.0459844 -0.8098971 0.0462151 0.7186174 -0.6924393 0.0136250 0.4229146 -0.7857741 0
-0.2507887 0.6601107 0.5628560 -0.3470651 -0.6924393 0.0516760 -0.8205640 2.5304871 0
0.0459844 0.0658522 -0.3670975 -1.2873733 -0.6924393 0.0009414 -0.7420920 0.1495816 1
0.3427574 -0.7786204 0.2528715 -0.1590035 -0.1110642 0.2038799 1.5849030 0.8298403 0
-1.1411079 0.5350037 -3.5702706 -1.2873733 -0.6924393 0.5463387 1.3917413 -0.7007418 1
-0.5475618 0.2222361 -0.2637694 1.3454895 -0.6924393 1.0156341 1.8987908 -0.7857741 0
-1.1411079 -0.5909598 -0.8837383 -1.2873733 -0.6924393 -0.8742311 -1.1887785 -1.0408711 0
-0.5475618 0.7852178 -3.5702706 -1.2873733 -0.6924393 -0.5698233 -0.6998379 -0.4456447 1
1.8266227 -0.6222365 0.8728404 1.0320535 -0.6924393 1.7259190 2.0044261 0.4046786 1
-0.5475618 -0.4032992 -0.3670975 0.7186174 -0.2065138 -0.8615474 -1.0378709 -1.0408711 0
-0.2507887 0.0345755 0.4595278 -1.2873733 -0.6924393 -1.1405879 -0.6575838 0.5747433 0
-0.8443348 -1.5605394 0.4595278 1.8469872 -0.3019635 0.1531453 -0.1505343 -1.0408711 0
2.7169419 -0.4658527 0.0462151 -1.2873733 -0.6924393 0.2799819 -0.6666382 1.5951314 0
-0.5475618 -0.6535133 0.0462151 1.9723616 -0.1978366 1.0790524 0.6190945 -0.7007418 0
0.9363036 -0.4658527 -0.4704257 0.2171198 -0.6924393 -0.6966599 -0.5308214 -0.3606124 1
-1.1411079 -0.5284062 -0.2637694 0.1544326 0.3141206 -0.5317723 -0.0539534 -0.8708064 0
0.3427574 -0.2156386 0.2528715 -1.2873733 -0.6924393 -0.8995984 0.8213106 2.0202931 0
-0.5475618 -0.4032992 -0.3670975 -0.6605012 1.7198337 -0.8488638 1.2347974 -0.9558388 0
-1.1411079 0.7852178 0.0462151 -1.2873733 -0.6924393 0.7492772 -0.4161316 -0.4456447 1
1.8266227 0.2535128 0.3561996 0.4678686 0.3661841 0.4956041 -0.5791118 0.4897110 0
0.9363036 0.3786199 0.9761686 -0.3470651 0.6525331 0.0516760 -0.6334385 0.3196463 0
0.9363036 1.2543692 0.8728404 -1.2873733 -0.6924393 -0.2019972 -0.9261993 1.1699697 1
-0.5475618 -0.4032992 0.5628560 -1.2873733 -0.6924393 -0.6332416 -0.6424930 1.5951314 1
0.9363036 0.4724502 0.2528715 0.3424942 0.4789882 -0.7600782 0.5285499 1.5100991 0
0.3427574 1.0667087 0.7695123 1.4708639 4.0366571 0.8507465 0.4440417 0.0645493 0
-0.8443348 -0.0592548 0.8728404 1.1574279 1.2165537 1.7259190 1.0144723 -0.3606124 1
0.0459844 -0.7786204 -0.6770820 -0.2216907 -0.2672545 -1.4196284 -0.3980227 -0.6157094 0
0.3427574 -0.4032992 0.1495433 1.4081767 -0.0416462 0.5209714 -0.6304204 -0.0204831 0
-1.1411079 -1.3416021 0.9761686 0.5305558 -0.3453497 0.6224407 -0.1143164 -1.0408711 0
-1.1411079 -0.4345760 -0.3670975 0.5932430 -0.0503235 0.5843897 0.8605466 -0.7007418 1
-0.5475618 0.2222361 0.4595278 1.0320535 0.8868186 1.4341948 2.2700235 -0.1905477 1
-0.8443348 0.2222361 -1.0903947 1.5335512 0.9909455 1.0790524 0.4259327 -0.7857741 1
-1.1411079 1.2543692 -0.9870665 -1.2873733 -0.6924393 -1.2801082 -0.6575838 2.7005518 0
0.6395305 0.9416016 -0.3670975 0.6559302 0.3488296 0.4448694 0.6643667 -0.4456447 0
-0.5475618 0.7852178 0.0462151 1.0947407 2.4313675 -0.5064050 -0.4070772 -0.3606124 1
-1.1411079 0.1596825 0.7695123 0.5305558 1.1731675 -0.1639462 0.1452446 -0.7857741 0
3.0137150 -0.6535133 0.4595278 0.2798070 0.9041730 0.5843897 -0.1807158 1.0849374 1
1.2330766 -0.2781921 0.1495433 -1.2873733 -0.6924393 -1.0644860 1.1110532 2.1053254 0
-1.1411079 1.4420298 -3.5702706 -1.2873733 -0.6924393 0.0389923 1.1080351 -0.2755801 1
-0.5475618 0.7226643 -0.5737538 0.7813046 0.4789882 -0.0497933 -0.1505343 -0.7007418 1
0.3427574 -1.3728788 0.6661841 1.2828023 -0.3279952 0.4829204 -0.9533626 0.1495816 0
0.3427574 -0.1843619 1.4928094 -1.2873733 -0.6924393 2.6518261 -0.7934006 -0.4456447 1
-0.2507887 0.9103248 0.3561996 -1.2873733 -0.6924393 -1.3942611 -0.7994369 0.3196463 0
-0.5475618 -0.0279780 0.3561996 1.0320535 0.2186710 0.9775831 -0.7752917 -0.3606124 0
1.8266227 1.2543692 -0.0571130 0.1544326 0.4529565 -0.8234965 -0.4402768 1.1699697 1
-1.1411079 0.5037269 -0.0571130 -0.4097523 0.5917924 -0.9122821 -0.9925986 -1.0408711 0
-1.1411079 0.2222361 -0.0571130 -0.0963163 0.8694641 -0.1893135 2.7740549 -0.7007418 1
-0.5475618 0.0971290 -0.0571130 0.4678686 1.0863951 0.1150943 1.2166885 -0.2755801 1
0.6395305 -1.2790486 -0.1604412 0.5932430 -0.6924393 -0.7347108 -0.4795128 0.6597757 0
-1.1411079 -0.4658527 0.0462151 1.0320535 0.5917924 0.9395321 0.4017875 -0.9558388 0
-0.5475618 1.0667087 0.2528715 -0.2216907 0.1405758 -0.6839762 -0.1173346 -0.5306771 1
-0.2507887 -0.2469154 -0.9870665 -0.6605012 0.0451262 -0.3161501 0.4651687 -0.7007418 0
0.9363036 -0.3720224 0.5628560 0.6559302 -0.6924393 0.4956041 1.9772628 0.8298403 1
-0.5475618 -0.2781921 -0.0571130 0.0917453 0.1232213 0.2672982 -0.4734765 -0.6157094 0
-0.2507887 -0.6847901 0.5628560 -0.5978140 -0.1370959 -1.6098833 -0.5670392 -0.2755801 0
-0.2507887 1.9111813 0.2528715 -1.2873733 -0.6924393 -0.1893135 -0.3829319 -0.3606124 1
-0.2507887 -0.1843619 -0.1604412 1.1574279 0.5223744 0.7746446 -0.9714715 -0.4456447 0
0.6395305 2.2865024 0.4595278 -1.2873733 -0.6924393 -1.0771696 -1.0348527 2.1903578 1
0.0459844 0.2535128 -0.4704257 -0.5351267 1.3120034 -0.5698233 0.1663717 -0.1905477 0
-0.2507887 -0.2781921 0.2528715 0.5932430 -0.6924393 -0.0497933 -0.8296184 -0.7007418 1
-1.1411079 0.0971290 0.0462151 -0.0336291 -0.6924393 -0.5825069 -0.6575838 0.2346140 1
2.7169419 0.9728784 1.0794968 0.7813046 -0.4407993 -0.6586089 0.7820747 0.8298403 1
-0.5475618 -0.2781921 0.3045355 0.7186174 -0.6924393 0.4702367 -0.9775078 -1.0408711 0
-0.8443348 1.1292622 0.1495433 0.0290581 0.7653372 -0.8108128 -1.0529616 -0.7857741 0
-0.8443348 0.0345755 -0.2637694 0.7186174 0.6612103 0.3941348 0.6643667 -0.2755801 1
1.8266227 1.8173510 0.0462151 -1.2873733 -0.6924393 0.3941348 -0.8205640 0.3196463 0
-0.5475618 -0.5909598 0.8728404 0.9693663 0.3488296 1.7132353 -1.0408890 -0.8708064 1
0.6395305 -0.4971295 0.0462151 0.7186174 -0.1023869 -0.1512625 -1.0559798 0.3196463 0
1.2330766 -0.0905316 0.1495433 -0.0963163 -0.6924393 -1.1279043 3.0305978 1.0849374 0
-0.5475618 -1.0601112 -0.5737538 -0.2843779 -0.2412228 0.0897270 -0.9231811 -0.7007418 0
-0.8443348 1.8486277 -3.5702706 -1.2873733 -0.6924393 1.4341948 -0.5730755 0.6597757 1
2.4201689 -0.4658527 0.5628560 -1.2873733 -0.6924393 -1.0644860 -1.0107075 0.9148727 0
-0.8443348 -0.8098971 -0.4704257 -0.1590035 -0.1891593 -1.0264350 -0.6394748 -0.9558388 0
-1.1411079 1.3794763 0.3561996 1.4081767 1.5202572 2.0176431 -0.6424930 -0.6157094 0
-1.1411079 -0.1218083 -3.5702706 -1.2873733 -0.6924393 0.2292472 1.3887232 0.9148727 0
0.3427574 -0.1843619 0.3561996 -1.2873733 -0.6924393 -0.1005279 -0.3889682 0.9148727 1
1.5298497 0.9728784 0.4595278 0.8439919 0.7913689 0.2799819 1.2710153 -0.0204831 1
0.9363036 1.7860742 0.7695123 -1.2873733 -0.6924393 1.0029504 -0.4251861 0.6597757 1
-0.8443348 0.2847896 0.0462151 -0.4724395 0.2186710 -0.7727618 0.0003733 -0.9558388 0
-0.8443348 -0.8098971 0.2528715 0.0290581 -0.0590007 -0.7727618 0.6070219 0.2346140 0
-0.8443348 -3.7811896 -0.0571130 0.9066791 -0.6924393 0.0009414 -0.2501333 -0.9558388 0
0.3427574 0.0345755 0.8728404 -1.2873733 -0.6924393 0.3434002 -0.5489303 -0.0204831 0
1.2330766 -0.8098971 0.1495433 -1.2873733 -0.6924393 0.6097570 0.0396093 2.0202931 0
1.2330766 0.1596825 0.9761686 0.9693663 0.2447027 0.8253792 -0.3708593 1.3400344 0
-0.8443348 0.5662805 -1.1937228 -0.0963163 0.0277717 -0.4176194 0.5496770 -0.9558388 0
-0.2507887 -0.1530851 -3.5702706 -1.2873733 -0.6924393 -1.0771696 -0.8597999 -0.8708064 0
-0.2507887 -0.6847901 -0.3670975 -0.0963163 -0.0503235 -1.2927918 -0.5821300 -0.6157094 0
0.3427574 -3.7811896 0.5628560 0.7186174 -0.6924393 1.1424707 -0.3799138 0.3196463 1
0.0459844 -0.9037274 0.5628560 -1.2873733 -0.6924393 1.2946746 -0.7088923 -0.3606124 0
0.0459844 0.5037269 0.7695123 -1.2873733 -0.6924393 -0.1005279 -0.6636201 -0.2755801 0
-0.2507887 -1.8733071 0.6661841 0.4678686 -0.6924393 0.3053492 -0.6907834 1.0849374 0
-0.8443348 -0.9662809 -0.3670975 -0.5351267 -0.3193180 -0.6078743 0.3263337 -0.7857741 0
-0.2507887 -0.9662809 0.4595278 -1.2873733 -0.6924393 1.3580929 0.2629525 -1.0408711 0
1.5298497 1.3794763 0.9761686 -1.2873733 -0.6924393 -0.2019972 -0.5127125 1.3400344 1
-0.8443348 0.1284058 -0.9870665 1.2201151 0.7566599 0.1658289 1.4792677 -0.4456447 1
2.7169419 0.2535128 -3.5702706 0.5932430 -0.6924393 1.0029504 0.2931341 0.9148727 1
2.4201689 -1.0288345 0.2528715 1.2201151 -0.2238683 0.4195021 -0.2833329 1.2550020 0
-0.8443348 2.3490559 0.3561996 0.9693663 1.4681937 0.5717060 1.2166885 -0.3606124 1
0.3427574 2.1301186 -0.2637694 0.7813046 2.1276641 -0.1005279 0.3353882 -0.3606124 1
0.3427574 1.1605390 0.0462151 -1.2873733 -0.6924393 -0.2780991 -0.7994369 2.5304871 0
0.3427574 -0.5596830 2.0094502 1.0320535 -0.6924393 0.9141648 -0.5036580 2.7005518 0
0.0459844 0.7852178 0.4595278 -1.2873733 -0.6924393 0.8253792 0.1452446 2.8706165 1
0.0459844 0.8164946 0.2528715 0.2798070 1.8499923 0.3687675 -0.2622059 -0.2755801 0
0.3427574 -0.6847901 -0.7804102 0.4678686 0.0277717 0.2546145 0.0818634 -0.2755801 0
0.6395305 0.0971290 0.1495433 -1.2873733 -0.6924393 -0.5571396 -0.3135144 -0.3606124 1
-1.1411079 -0.6222365 -0.2637694 -0.2216907 -0.6924393 -1.3942611 -0.6636201 -1.0408711 0
-0.2507887 -1.2477718 0.8728404 -0.2843779 -0.1197414 -0.5698233 -0.5006399 -0.9558388 0
-0.8443348 0.3786199 1.6994657 0.4678686 0.5223744 0.1024106 -0.7179468 0.9999050 1
-0.2507887 1.6296904 0.6661841 1.7216128 3.3424778 0.8126955 5.0255961 -0.7007418 1
-1.1411079 -0.0905316 -0.2637694 0.1544326 0.0798351 -4.0578295 3.8002265 -1.0408711 0
-1.1411079 -1.1539415 -0.2637694 0.0917453 -0.1197414 0.4829204 0.2206984 -1.0408711 0
-0.5475618 -0.4971295 -0.5737538 1.2201151 0.1232213 0.3687675 -0.7451102 -0.7007418 0
-0.5475618 0.0345755 -0.8837383 1.4081767 0.6785648 0.5336550 1.0386176 -0.4456447 0
2.4201689 0.5975572 0.6661841 1.4081767 2.1276641 0.9141648 0.1693898 2.1053254 1
-1.1411079 -0.7160668 0.6661841 -0.3470651 0.0364489 -0.8615474 -0.5217669 -0.9558388 0
-0.8443348 -1.0601112 -0.4704257 1.0320535 -0.0416462 0.6604916 0.1120450 -0.9558388 0
0.0459844 1.0979854 0.3045355 -1.2873733 -0.6924393 2.0683778 -0.7058742 -0.1055154 1
-1.1411079 -0.8724506 1.5961376 1.1574279 -0.0676780 1.4468785 1.6573387 0.1495816 0
-0.8443348 -0.4345760 0.1495433 0.5932430 0.0190944 -0.1512625 1.0537083 -0.7857741 0
-1.1411079 -0.4971295 -0.0571130 0.0917453 -0.6924393 -1.5210977 -0.7119105 -0.9558388 0
-0.8443348 -0.3720224 -0.4704257 -0.7858756 0.8868186 -0.8361801 1.4339955 -1.0408711 0
-0.8443348 -0.9662809 -0.3670975 -0.1590035 -0.1804821 -0.8742311 2.4028222 -0.7007418 0
-0.8443348 0.1284058 0.0462151 0.2171198 0.2620572 -0.9757004 -0.7571828 -0.7007418 0
-0.8443348 -0.0592548 -0.7804102 -0.4724395 -0.2585773 -1.2293735 -0.8054732 -0.7857741 0
0.3427574 -0.1530851 0.2528715 0.5305558 -0.6924393 0.0389923 0.5677859 0.1495816 1
1.2330766 -0.4971295 1.5961376 0.9693663 -0.6924393 1.4341948 -0.7028560 0.9999050 1
0.3427574 0.7226643 0.6661841 0.3424942 1.7805744 0.0009414 -0.0599897 2.1053254 1
-0.2507887 -0.6535133 -0.0571130 0.1544326 0.0104172 -0.0497933 1.4400318 -0.4456447 0
-0.8443348 -0.6535133 -0.1604412 0.5305558 1.0082999 0.0009414 -0.0841349 0.7448080 0
0.3427574 1.4107531 0.3561996 -1.2873733 -0.6924393 1.7386026 -0.3980227 -0.5306771 1
-0.8443348 0.3160664 -0.2637694 -0.4097523 2.9086158 -1.0518023 -0.2501333 -1.0408711 0
0.0459844 -0.1530851 0.1495433 -0.5351267 0.0624807 -1.2547409 -0.0267900 0.3196463 0
0.0459844 1.1605390 0.4595278 -1.2873733 -0.6924393 0.1150943 0.9993816 -0.1905477 1
-0.5475618 0.1909593 -0.5737538 0.2171198 1.6938020 -0.5444560 3.4048486 -0.7007418 0
-0.2507887 -0.7786204 -0.6770820 0.8439919 0.3054434 -0.9249657 1.4249410 0.4897110 0
-1.1411079 0.3160664 -0.1604412 1.2201151 -0.6924393 0.2926655 -0.8326366 -0.9558388 1
-0.2507887 -1.2164950 0.0462151 -1.2873733 -0.6924393 -1.3815775 -0.2501333 -0.7007418 0
-0.2507887 2.2552257 0.0462151 0.6559302 -0.6924393 0.3687675 -0.6968197 -0.7007418 1
0.0459844 -0.8098971 -0.2637694 -1.2873733 -0.6924393 0.0009414 -0.9382719 -0.1905477 1
0.6395305 0.5037269 -0.4187616 -1.2873733 -0.6924393 -0.9883840 -0.9684534 1.8502284 0
0.3427574 0.4724502 0.7695123 1.2828023 0.0711579 0.3814511 -0.5610029 0.1495816 1
1.5298497 -1.5292627 0.4595278 0.2798070 -0.6924393 -0.0497933 -0.5791118 0.4046786 0
0.3427574 1.4733066 -0.2637694 -1.2873733 -0.6924393 0.1150943 -1.0167438 0.6597757 1
-0.5475618 0.0658522 -1.0903947 0.7186174 0.7393055 1.2819909 0.1452446 -0.6157094 0
0.0459844 -0.1843619 0.1495433 -1.2873733 -0.6924393 -0.3922521 -0.2893692 1.0849374 1
-1.1411079 -0.6222365 -0.3670975 -1.2873733 -0.6924393 -1.2801082 -0.4100953 -0.7007418 0
1.2330766 2.3803327 0.2528715 -1.2873733 -0.6924393 -0.7727618 2.1704245 0.4897110 1
-0.8443348 1.5984136 -0.0571130 1.7843000 4.3316833 1.3200419 0.6945483 -0.4456447 1
0.6395305 -0.5909598 1.0794968 1.1574279 -0.6924393 0.4702367 0.6100400 -0.4456447 0
-0.8443348 -0.2781921 0.1495433 0.5932430 0.8347551 0.3053492 0.1693898 -0.7007418 0
-0.8443348 0.6913875 0.7695123 0.1544326 1.9975054 1.3200419 1.8233370 -0.9558388 0
-0.8443348 0.6913875 0.2528715 0.0917453 -0.1631276 -0.7347108 -0.6515475 -1.0408711 0
-1.1411079 0.5350037 -0.4704257 0.9066791 0.7566599 0.3307165 0.1874988 -1.0408711 1
-0.2507887 1.6296904 0.7695123 0.7813046 3.4205730 0.4702367 -0.6455111 -0.9558388 1
-0.8443348 -0.7473436 -0.0571130 0.0290581 -0.6924393 -0.6078743 1.8806819 -0.9558388 0
0.0459844 0.7226643 0.6661841 0.7186174 -0.6924393 0.8253792 0.2478618 0.3196463 1
-0.8443348 -1.1852183 -0.0571130 -1.2873733 -0.6924393 -1.7494036 0.4591324 -0.5306771 0
-0.2507887 0.2535128 -0.2637694 0.5305558 0.3054434 -0.7093435 -0.7632191 -0.4456447 1
-0.8443348 -0.0592548 0.9761686 1.2828023 0.7826917 1.6878680 0.1060087 -0.6157094 0
-0.5475618 -0.8411739 -0.0571130 -0.1590035 -0.0329690 -0.7600782 0.2689889 -1.0408711 0
-1.1411079 -0.5909598 -0.2637694 1.5962384 -0.0156145 1.0917360 0.0728090 -1.0408711 0
-0.5475618 -0.1843619 -0.2637694 0.0917453 -0.6924393 -0.1512625 -0.1535524 -1.0408711 0
1.2330766 0.9416016 0.4595278 0.7186174 1.1297813 1.3834602 0.1331720 0.2346140 1
0.0459844 1.9737348 0.4595278 1.1574279 1.7111565 0.6351243 -0.6274022 -0.1905477 1
-1.1411079 -0.8411739 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.6515475 -0.7007418 0
-0.8443348 1.8799045 -0.2637694 0.5932430 0.8694641 0.2672982 -0.4342405 0.4046786 1
-1.1411079 0.4411734 1.2861531 1.5962384 0.5657606 1.0917360 -0.5670392 -0.6157094 0
-0.8443348 -0.8098971 0.6661841 0.2798070 0.8694641 0.3814511 -0.7209649 0.8298403 1
-0.5475618 -0.6847901 -3.5702706 -1.2873733 -0.6924393 -1.2420572 -1.0982339 -0.8708064 0
-0.2507887 -0.9975577 0.2528715 -0.2843779 0.0451262 -0.2019972 0.2388073 0.4046786 0
-0.8443348 -1.2790486 0.2528715 -0.5978140 -0.1718049 -0.2527318 0.1663717 -0.9558388 0
-0.5475618 0.5662805 0.3045355 -1.2873733 -0.6924393 -0.8108128 -0.9201630 -0.3606124 0
-0.8443348 -0.9662809 -0.0571130 -0.7858756 -0.6924393 -0.9503331 2.0104624 0.2346140 0
-1.1411079 0.6288340 -3.5702706 -1.2873733 -0.6924393 1.3200419 -0.8054732 -0.3606124 1
2.4201689 0.5975572 0.8211764 0.7813046 -0.6924393 0.6858589 -0.6877653 0.6597757 0
0.3427574 0.8164946 0.3045355 -1.2873733 -0.6924393 -0.2654155 -0.1143164 -0.4456447 0
-0.8443348 -0.7473436 0.0462151 -0.3470651 -0.6924393 -1.7494036 -0.9805260 -1.0408711 0
0.6395305 -0.4345760 0.9761686 -1.2873733 -0.6924393 0.6097570 0.7700021 -0.1905477 0
-1.1411079 2.1301186 1.8027939 0.2798070 -0.6924393 0.2926655 -0.1112983 0.6597757 1
-0.5475618 -1.1852183 -0.1604412 0.1544326 -0.2585773 0.0263087 0.0758271 -0.9558388 0
0.0459844 -0.1218083 -0.2637694 0.4051814 0.3488296 0.1531453 -0.7300194 -0.7857741 0
1.2330766 -0.4032992 0.0462151 -1.2873733 -0.6924393 -0.1893135 1.4581407 -0.0204831 1
0.0459844 -0.1218083 -0.3670975 -0.5351267 -0.6924393 -0.2907828 -0.2772966 -0.2755801 1
-1.1411079 1.8486277 0.4595278 2.6619209 -0.5709579 3.4762639 5.8797331 -0.7007418 1
-0.8443348 -0.6535133 0.1495433 -0.5351267 -0.0850324 -0.8488638 0.5617496 -0.4456447 0
-1.1411079 -0.8098971 0.5628560 1.5335512 0.1058669 0.5717060 -0.4282042 -0.6157094 0
-1.1411079 -0.5284062 -0.2637694 1.0320535 -0.1370959 0.2038799 0.1150631 -0.9558388 1
-1.1411079 -0.0279780 0.2528715 -0.1590035 -0.1457731 -0.1893135 -0.5640211 -0.6157094 0
-0.8443348 -1.2164950 -0.2637694 -0.4724395 0.1318986 -1.3688938 -0.1716613 -0.8708064 0
-0.5475618 0.4098966 0.0462151 -1.2873733 -0.6924393 -0.3922521 0.2116440 -0.8708064 1
-1.1411079 -0.9350042 -0.0571130 0.7186174 1.1297813 1.0029504 -0.2742785 -0.7007418 0
-0.5475618 -0.0592548 -3.5702706 -1.2873733 -0.6924393 -1.5718323 1.0869080 3.2957782 0
-0.5475618 -0.6535133 -0.7804102 0.4678686 0.2186710 0.7365936 0.0788453 -0.7857741 0
3.0137150 1.6922439 -0.3670975 0.5932430 -0.6924393 0.2038799 -0.7843461 0.4046786 1
-0.8443348 0.4411734 -0.7804102 -1.2873733 -0.6924393 -0.6712926 0.6492760 2.4454548 0
0.3427574 -1.0913880 -0.0571130 0.4678686 -0.0763552 -0.2273645 -0.3255871 -0.7857741 0
1.8266227 0.8477713 0.7695123 1.7216128 1.3640668 0.7112263 1.5969756 1.5100991 1
1.5298497 0.4098966 0.2528715 0.7813046 -0.1718049 -0.7727618 -0.0358445 4.0610692 0
1.5298497 -0.0279780 0.1495433 0.0917453 -0.2065138 -1.4196284 0.7881110 1.2550020 0
-0.8443348 -1.5605394 -0.3670975 -1.2873733 -0.6924393 -1.2927918 -0.1686432 -0.6157094 0
1.2330766 -1.4667091 0.0462151 1.2201151 -0.2672545 0.4195021 0.7036027 0.4897110 0
0.3427574 -1.0288345 0.4595278 0.5932430 -0.6924393 -0.5571396 -0.6455111 0.3196463 0
1.8266227 -0.1843619 1.4928094 -1.2873733 -0.6924393 -1.0137513 1.6603568 0.0645493 0
-1.1411079 0.0971290 -0.6770820 -0.4724395 0.2186710 -1.2927918 -0.0599897 -1.0408711 0
-1.1411079 -1.4667091 -0.8837383 -0.6605012 -0.3800586 -0.5317723 -0.6123115 -0.9558388 0
-1.1411079 -0.7473436 -0.2637694 0.9693663 0.1752848 0.6097570 0.3866968 -0.7007418 0
1.2330766 -0.0279780 -3.5702706 -1.2873733 -0.6924393 -0.2527318 -0.8718725 0.4046786 1
0.6395305 1.0354319 0.4595278 1.2828023 0.5223744 1.7893373 0.2991704 -0.5306771 0
-0.8443348 0.7226643 0.6661841 1.2201151 -0.6924393 1.1805216 0.4078238 -0.4456447 0
-1.1411079 0.5037269 0.0462151 1.0947407 -0.6924393 0.1531453 -0.9111085 -0.9558388 0
-1.1411079 -0.0592548 -0.1604412 0.4051814 -0.6924393 0.8634302 -0.6424930 -0.9558388 0
0.9363036 0.4724502 1.0794968 -1.2873733 -0.6924393 -0.2654155 -0.7903824 1.4250667 0
0.0459844 -0.2156386 -0.2637694 -1.2873733 -0.6924393 -0.3922521 -1.0439072 -0.7857741 0
-1.1411079 0.5037269 0.7695123 0.4051814 -0.6924393 -0.5951906 -0.7270012 2.1903578 0
-0.5475618 -0.4971295 0.5628560 1.5335512 0.9649137 0.2165636 0.7217116 -0.3606124 1
0.9363036 -0.2156386 0.3561996 -0.2216907 0.2620572 -1.0391187 -0.0177356 -0.1905477 0
1.2330766 0.1596825 0.2528715 1.0947407 -0.0416462 -0.7727618 -0.9352537 0.4897110 0
0.0459844 0.3473431 0.8728404 0.6559302 -0.6924393 -0.5064050 -0.1595887 2.5304871 0
-0.2507887 1.1605390 0.0462151 0.5932430 2.1536958 0.4448694 -0.3859501 0.1495816 1
-1.1411079 0.0658522 0.9761686 1.0320535 -0.6924393 0.4068184 -0.8296184 -0.3606124 0
0.0459844 -1.1226647 -0.5737538 0.0917453 -0.2672545 -0.5317723 -0.5006399 -0.4456447 0
-1.1411079 -1.1539415 0.6661841 0.6559302 0.3922158 0.7873282 -0.7209649 -0.8708064 0
-1.1411079 0.7539410 -3.5702706 -1.2873733 -0.6924393 1.5483477 0.4772413 -0.1905477 1
-1.1411079 0.4411734 -0.0571130 1.3454895 1.4768710 1.3073582 -0.3225689 -0.7857741 1
-0.8443348 0.5662805 -0.3670975 1.2828023 3.4726364 1.1044197 0.1935351 -1.0408711 0
-1.1411079 1.6296904 0.4595278 0.7186174 1.6070296 1.8400719 2.0738436 2.1053254 0
0.0459844 -0.6847901 0.1495433 -0.2216907 -0.6924393 -0.8108128 -0.5368577 -0.4456447 0
1.2330766 2.2865024 0.5628560 -1.2873733 -0.6924393 -0.7473945 0.2388073 2.8706165 0
-0.5475618 -1.1852183 -0.2121053 0.4678686 -0.1197414 0.6097570 0.4742232 -0.7857741 0
-0.5475618 -0.9975577 1.0794968 0.5932430 -0.6924393 0.1911962 -0.5428940 0.7448080 0
0.0459844 -0.6847901 -0.0571130 1.0947407 -0.6924393 0.1024106 -0.9865623 -0.0204831 0
0.0459844 0.1284058 0.0462151 -0.1590035 0.3661841 -0.3922521 2.0285714 0.9999050 1
-0.2507887 -1.2790486 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.8990359 -0.9558388 0
0.6395305 1.4107531 0.2528715 -1.2873733 -0.6924393 -0.6839762 -0.5066762 2.7855842 0
0.3427574 -0.3407457 -0.0571130 -1.2873733 -0.6924393 -0.7600782 -0.5428940 -0.2755801 0
-0.5475618 -1.2477718 0.1495433 -0.3470651 -0.0329690 -0.2400482 0.2267347 -0.7007418 0
0.9363036 2.3177792 0.0462151 0.7813046 0.5657606 -0.8742311 -0.9322356 1.8502284 1
0.6395305 1.0354319 0.2528715 0.7186174 0.9822682 -0.3415174 1.1080351 0.4897110 0
-0.5475618 -0.1218083 1.0794968 -0.0963163 -0.0763552 -0.8615474 -0.4795128 -1.0408711 0
-0.2507887 -1.1539415 0.1495433 0.7186174 -0.6924393 0.6604916 -0.6183478 -0.4456447 0
0.6395305 -3.7811896 -0.0571130 1.2828023 -0.6924393 0.8887975 0.7700021 0.6597757 1
0.9363036 -0.8411739 -0.2637694 0.2798070 -0.0069373 0.1658289 0.8032017 0.6597757 0
-0.2507887 -0.7786204 0.4595278 1.1574279 -0.6924393 0.6731753 -0.7058742 0.5747433 0
1.8266227 -1.4354324 0.6661841 -1.2873733 -0.6924393 0.1658289 -0.6304204 0.4046786 0
-1.1411079 1.8486277 1.0794968 0.3424942 0.0885124 0.5717060 -0.4764946 0.1495816 1
-0.8443348 0.2847896 -0.4704257 0.1544326 0.7826917 -0.4303030 0.6643667 -1.0408711 0
-0.5475618 -1.1539415 -0.9870665 0.1544326 -0.0329690 -0.2019972 1.4973766 -1.0408711 0
1.2330766 -0.0279780 0.4595278 -1.2873733 -0.6924393 -0.8869148 -0.1897702 2.6155195 0
2.4201689 -1.1539415 0.1495433 0.6559302 -0.6924393 -0.2907828 -0.5278032 1.0849374 1
-1.1411079 0.5662805 -0.3670975 -0.2216907 1.1297813 -1.2547409 -0.7994369 -1.0408711 0
1.5298497 -0.9350042 -0.0571130 -1.2873733 -0.6924393 -0.9883840 -0.8205640 2.1053254 0
-0.5475618 -0.9350042 -0.3670975 -1.2873733 -0.6924393 -0.5951906 0.1603354 -0.9558388 0
-0.2507887 -0.6847901 -0.7804102 -0.0963163 0.0538034 -0.8108128 -0.9593989 -0.7857741 0
-0.2507887 1.3169228 0.0462151 -0.1590035 0.2186710 -0.0497933 -0.6153296 -0.4456447 1
1.5298497 0.7539410 0.9761686 0.8439919 0.7393055 -0.2146808 0.9028007 1.6801637 1
0.9363036 0.1284058 0.8728404 -1.2873733 -0.6924393 0.7112263 -0.5066762 1.5100991 0
2.7169419 -1.4041556 -0.4704257 -1.2873733 -0.6924393 0.1024106 -0.8809270 0.6597757 0
0.6395305 0.2535128 1.0794968 -0.8485628 2.1363413 -1.5718323 0.3323700 2.2753901 0
-0.5475618 -1.6543697 0.0462151 0.7186174 -0.1197414 -0.8869148 -0.8597999 -0.7007418 0
-0.2507887 0.0971290 0.5628560 0.7813046 0.4356020 0.1531453 -0.5036580 -0.6157094 0
0.6395305 -0.2156386 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.8537636 -0.6157094 0
1.5298497 0.2847896 0.0462151 -1.2873733 -0.6924393 0.2799819 0.5436407 0.9999050 1
-0.2507887 0.1284058 -0.5737538 -1.2873733 -0.6924393 -0.0497933 -0.9684534 -0.7857741 0
-0.2507887 -1.0601112 -0.4704257 -0.1590035 -0.6924393 -1.2927918 -0.0841349 -1.0408711 0
-0.8443348 -0.7473436 -0.2637694 -0.0963163 0.0190944 -1.7494036 -0.5217669 -1.0408711 0
-0.2507887 -0.1530851 0.2528715 -0.3470651 0.2186710 -0.7220272 -1.1012521 -0.7857741 0
-1.1411079 -0.1218083 -0.1604412 0.6559302 0.9388820 -0.1512625 0.0637545 -0.9558388 0
-1.1411079 -0.3094689 -0.2121053 -1.2873733 -0.6924393 -0.9376494 0.5677859 -0.1905477 0
-0.5475618 0.0345755 -0.4704257 -0.1590035 0.2273482 -0.2780991 0.7398205 -0.9558388 0
-1.1411079 -0.4345760 0.3561996 -1.2873733 -0.6924393 1.6878680 0.6462578 -0.7857741 0
-0.8443348 -1.0913880 -0.1604412 1.9723616 -0.1284186 1.1805216 1.3434509 -0.3606124 0
0.6395305 -0.9350042 -3.5702706 -1.2873733 -0.6924393 -0.2780991 0.0878997 -0.1905477 0
-0.8443348 -1.3728788 -0.6770820 0.5932430 -0.2065138 0.1658289 2.3515136 -0.7857741 0
0.0459844 0.3473431 -3.5702706 -1.2873733 -0.6924393 0.1150943 -0.5127125 -0.8708064 1
-1.1411079 -0.4971295 1.0794968 -1.2873733 -0.6924393 -0.3034664 -0.8296184 1.0849374 0
-1.1411079 -1.9984141 -0.4704257 -1.2873733 -0.6924393 -1.3054755 0.7941473 2.8706165 0
-1.1411079 0.1909593 0.5628560 1.0320535 1.1297813 0.5463387 1.0023997 -0.8708064 0
-0.2507887 0.2535128 1.1828249 1.7843000 0.6525331 0.5590224 1.4973766 -0.1055154 1
1.2330766 -0.6535133 0.2528715 1.2201151 1.1731675 0.9395321 0.5708040 0.8298403 1
-0.2507887 0.2222361 0.1495433 0.2798070 0.9562365 0.0516760 0.2327710 -0.5306771 1
1.8266227 -0.9662809 0.8211764 0.7186174 -0.6924393 0.3687675 1.0657809 1.9352608 1
0.0459844 -1.1539415 1.0794968 0.1544326 -0.2065138 0.9522158 -0.9443082 -0.7007418 0
-0.8443348 -1.0288345 0.4595278 0.5305558 -0.0329690 0.0009414 -0.3225689 -0.3606124 0
1.2330766 2.0362883 1.0794968 0.9066791 1.2599399 0.3180328 -0.1475161 0.3196463 1
0.3427574 2.0675651 0.3561996 0.4051814 1.1037496 1.4722458 1.6965747 1.6801637 1
0.0459844 0.3160664 -0.0571130 0.0290581 0.7479827 0.1404616 -0.9412900 -0.4456447 0
-0.8443348 1.3481995 0.6661841 1.4081767 -0.1110642 0.1024106 -0.3950045 1.4250667 0
0.0459844 2.1301186 2.1127784 0.6559302 -0.6924393 -0.4429867 0.6281489 0.3196463 0
-0.8443348 -0.1530851 0.0462151 0.4678686 -0.6924393 -0.5825069 -0.8084913 -1.0408711 0
-0.2507887 -1.1539415 -0.0571130 0.5932430 0.2273482 -0.0117423 0.3595334 -0.7007418 0
0.6395305 -0.2156386 0.9761686 -1.2873733 -0.6924393 -0.5317723 -0.6787108 2.7855842 0
-0.8443348 -1.0288345 -0.3670975 0.2171198 -0.3106407 -0.2654155 -0.1505343 -0.8708064 0
-0.8443348 -1.1539415 -0.2637694 0.1544326 0.3054434 0.6224407 -0.0026448 -0.4456447 0
0.9363036 0.0971290 0.0462151 0.7813046 1.1731675 -0.8234965 -0.9382719 0.3196463 0
-0.8443348 -0.7473436 0.0462151 1.2201151 -0.6924393 0.7746446 -0.7662372 -0.2755801 0
1.2330766 -0.3407457 0.3561996 -1.2873733 -0.6924393 -0.5317723 -0.7088923 2.1053254 0
2.1233958 -0.5596830 -0.0571130 1.2201151 -0.6924393 1.8020209 -1.0439072 0.7448080 0
2.1233958 -1.1226647 0.2528715 -1.2873733 -0.6924393 -0.2400482 -0.5187488 0.1495816 0
0.6395305 0.1284058 0.3561996 -1.2873733 -0.6924393 0.2292472 -1.0589979 1.7651961 1
-1.1411079 2.4116095 -0.1604412 0.7186174 1.6851248 1.1805216 0.0909179 -0.4456447 1
-0.8443348 -1.0601112 -0.0571130 0.8439919 -0.0242918 0.7112263 -0.2139154 -0.7857741 0
0.6395305 -0.6847901 -0.4704257 -0.0963163 -0.2238683 -0.6459252 0.0758271 -0.1055154 0
-1.1411079 -0.9350042 0.5628560 -1.2873733 -0.6924393 0.0516760 0.3897149 -0.5306771 0
-0.5475618 -0.8098971 -0.7804102 -0.4097523 0.0711579 -0.7473945 0.8333832 -0.9558388 0
-0.8443348 -0.6847901 0.1495433 0.5932430 -0.5362490 0.8380629 -0.1807158 -1.0408711 0
0.6395305 -0.9037274 -0.3670975 0.7186174 0.4008931 0.0009414 -1.1676514 1.0849374 0
0.0459844 1.0354319 0.1495433 0.5305558 0.4008931 -0.0878442 -0.4040590 0.3196463 0
-1.1411079 0.0032987 -0.1604412 0.5932430 0.7393055 0.2926655 -0.8115095 -0.0204831 1
-0.2507887 -1.3416021 0.0462151 -1.2873733 -0.6924393 0.0643597 -0.6092933 0.4897110 0
-0.5475618 0.2847896 1.3894813 -1.2873733 -0.6924393 -1.1913226 -0.6153296 -1.0408711 0
-0.2507887 -0.3094689 -0.5737538 0.6559302 -0.3106407 -0.3161501 -0.1263890 -0.9558388 0
-0.5475618 -0.7160668 -0.4704257 -0.2216907 0.3488296 0.3434002 -0.8266003 -0.9558388 0
-0.8443348 0.6913875 0.8728404 0.5932430 2.1710503 -0.2400482 1.2679971 -0.8708064 0
-0.8443348 -0.0592548 -1.2970510 1.6589256 -0.1457731 0.4448694 -0.5791118 -0.7007418 0
0.6395305 -0.4032992 -1.2970510 -0.0336291 0.4356020 -1.0137513 1.0295631 0.1495816 0
-0.5475618 -0.0905316 0.5628560 -1.2873733 -0.6924393 1.3834602 0.6673849 -1.0408711 1
1.8266227 0.3786199 -0.0571130 -1.2873733 -0.6924393 -0.6332416 -0.6847471 0.2346140 0
-0.5475618 2.3803327 0.0462151 4.9186605 -0.6924393 0.3434002 0.3112430 2.4454548 1
-1.1411079 0.9416016 1.0794968 1.5962384 -0.6924393 1.2819909 -0.3044600 -1.0408711 1
0.6395305 -0.3720224 -0.4704257 0.4051814 -0.6924393 -0.8869148 -0.8024550 -0.5306771 0
2.4201689 0.0032987 0.4595278 -0.2216907 -0.6924393 -0.6966599 -0.6424930 2.4454548 0
1.2330766 -0.6535133 0.3561996 -1.2873733 -0.6924393 0.8507465 -0.8507455 0.7448080 0
1.2330766 0.0971290 0.3561996 0.2171198 4.5139054 -0.4176194 0.6492760 1.5951314 1
-0.8443348 -0.8724506 -0.6770820 -0.5978140 -0.6924393 -1.2040062 -0.1656250 -0.9558388 0
1.2330766 0.6913875 -0.1604412 -1.2873733 -0.6924393 0.3687675 -1.0348527 0.6597757 1
0.6395305 -0.5596830 -0.1604412 -1.2873733 -0.6924393 -0.9757004 -0.6726745 -0.3606124 0
-0.2507887 1.7235207 0.8728404 0.4051814 0.6612103 0.1658289 2.0587529 1.5951314 1
-1.1411079 -1.4979859 -3.5702706 -1.2873733 -0.6924393 -1.3815775 -0.3919864 -0.7007418 0
2.1233958 -0.3094689 0.7695123 1.2201151 -0.6924393 1.8781229 1.3675961 0.9999050 1
-0.5475618 -0.2781921 0.4595278 1.8469872 0.5223744 0.9395321 -0.8960177 -0.7857741 0
-0.2507887 0.3473431 0.5628560 -1.2873733 -0.6924393 0.3053492 -0.2108973 0.9148727 1
-0.5475618 -1.2164950 -0.8837383 0.0917453 0.3054434 -0.4429867 3.7036456 -0.7007418 0
0.6395305 0.0658522 0.1495433 1.5335512 1.3033261 0.2038799 0.7881110 0.0645493 0
-1.1411079 2.0988418 0.6661841 -0.4097523 0.9128503 0.0009414 0.6341852 -0.9558388 1
-1.1411079 -1.6856465 0.3561996 -1.2873733 -0.6924393 1.6878680 -0.8386729 1.0849374 0
-0.8443348 -0.9975577 -2.3303326 -0.0963163 -0.4755083 -0.5317723 0.2629525 -1.0408711 0
-0.8443348 1.6296904 0.2528715 -1.2873733 -0.6924393 0.6097570 -1.1585970 0.4046786 1
-0.8443348 -0.3720224 -1.6070355 -0.1590035 0.3488296 -1.1279043 -0.1958065 -0.6157094 0
-0.8443348 -0.4032992 0.9761686 -0.0963163 -0.6924393 -0.6205579 -0.2169336 -0.7857741 0
0.6395305 -0.7786204 -3.5702706 -1.2873733 -0.6924393 -1.0518023 -0.8507455 -0.4456447 0
-0.8443348 0.0971290 0.2528715 0.9693663 -0.6924393 -0.5317723 -1.1223791 -0.2755801 0
0.9363036 0.9103248 0.4595278 0.5305558 0.4008931 0.4068184 0.6643667 1.7651961 1
0.0459844 1.9424580 -3.5702706 -1.2873733 -0.6924393 -0.4556704 -0.7843461 0.2346140 1
-0.8443348 0.0971290 -0.4704257 0.7186174 -0.6924393 0.4829204 0.1271357 -1.0408711 0
-0.8443348 1.8799045 0.4595278 1.3454895 1.8499923 1.0156341 2.3726407 -0.9558388 1
-0.8443348 -0.9037274 -0.3670975 0.2798070 -0.3366724 -1.5845160 0.0305549 -0.7007418 0
-1.1411079 0.9728784 0.6661841 1.1574279 1.6677703 1.2058890 -0.6092933 -0.5306771 0
-0.8443348 -0.3094689 -0.3670975 -0.4724395 0.8868186 -1.0137513 -1.0076894 -0.8708064 0
-0.2507887 -0.4658527 -0.7804102 0.0290581 0.6785648 -0.1385789 -0.5428940 -0.7857741 0
-0.2507887 1.6609672 -0.5737538 0.0917453 0.9909455 0.1150943 0.3655697 0.2346140 1
0.9363036 1.4733066 0.9761686 1.3454895 2.0929551 0.7873282 0.9510912 0.5747433 1
0.6395305 -0.4971295 0.5628560 0.4678686 -0.6924393 0.0643597 1.2257430 -0.6157094 0
2.1233958 0.5350037 0.2528715 0.3424942 0.5570834 0.5209714 0.2569162 1.4250667 1
-0.2507887 -0.4658527 0.1495433 -1.2873733 -0.6924393 -0.7854455 -0.7994369 -0.5306771 0
0.6395305 -0.1218083 1.3894813 -1.2873733 -0.6924393 -0.4176194 -0.9503445 -0.2755801 0
-0.5475618 -1.6543697 -0.3670975 -0.4724395 -0.5622807 -1.5084140 -0.6485293 -0.8708064 0
1.5298497 -0.2781921 0.6661841 0.2171198 -0.6924393 -0.4810377 2.4450763 1.4250667 1
-1.1411079 -0.0592548 -3.5702706 -1.2873733 -0.6924393 0.0516760 -0.9986349 -0.7857741 1
-0.5475618 -0.2781921 0.8728404 1.3454895 0.6959193 0.8126955 -0.6817290 -0.4456447 0
-0.5475618 -0.9037274 0.3561996 -0.0336291 -0.6924393 -0.9883840 3.7006275 -0.4456447 0
0.6395305 1.9424580 1.2861531 -1.2873733 -0.6924393 1.1171033 2.9853255 0.9999050 0
-1.1411079 -0.8411739 0.0462151 0.4051814 0.3054434 1.4595621 -0.3768956 -1.0408711 0
-0.5475618 -0.4032992 -0.2637694 -1.2873733 -0.6924393 -0.1512625 -0.9473263 -1.0408711 0
0.0459844 -0.9662809 0.9761686 1.6589256 -0.2238683 0.7239099 -0.3316234 -0.3606124 0
-1.1411079 0.1284058 -0.0571130 -1.2873733 -0.6924393 -0.9249657 -0.8024550 -1.0408711 0
-1.1411079 0.3473431 0.4595278 -1.2873733 -0.6924393 0.0516760 -0.2380607 -1.0408711 0
0.3427574 0.2222361 0.5628560 -1.2873733 -0.6924393 0.3307165 -0.9895805 0.9999050 0
0.0459844 -0.8411739 -0.2121053 0.0917453 -0.6924393 -0.9249657 -0.9775078 -1.0408711 0
0.9363036 -0.2156386 -0.2637694 -1.2873733 -0.6924393 -0.5825069 0.7850928 0.0645493 1
-1.1411079 -0.5909598 0.4595278 1.2201151 0.0885124 0.3180328 -0.7058742 -0.7857741 0
-0.5475618 -0.3094689 -0.4704257 -1.2873733 -0.6924393 -0.7347108 -0.3889682 -0.8708064 0
-0.8443348 0.2222361 0.6661841 -0.2216907 0.8954958 -0.5698233 -1.0771069 -0.9558388 0
1.8266227 -0.9037274 -0.3670975 -1.2873733 -0.6924393 -0.7727618 -0.9201630 -0.1905477 0
2.7169419 -0.5284062 0.1495433 -1.2873733 -0.6924393 -0.1005279 -0.0207537 0.4046786 1
0.3427574 -0.5284062 0.2528715 -1.2873733 -0.6924393 -0.4049357 -0.9624171 1.2550020 0
-0.5475618 -0.8411739 0.3561996 -0.1590035 -0.1197414 -0.0497933 0.5345862 -0.8708064 0
0.9363036 -0.7473436 0.3561996 0.7186174 0.0971896 1.1297870 1.2046159 -0.1055154 1
-0.8443348 -0.6535133 0.2528715 -0.5351267 -0.2932862 -1.5845160 -0.9744897 -0.4456447 0
-1.1411079 -0.5909598 0.8728404 -0.2216907 0.2186710 -0.3415174 0.6734212 -0.5306771 0
0.0459844 0.2222361 0.0462151 -1.2873733 -0.6924393 0.2926655 -0.5096943 -0.7857741 0
0.6395305 0.8164946 0.5628560 -1.2873733 -0.6924393 -0.3161501 -0.8869633 1.4250667 1
0.0459844 -0.9662809 -3.5702706 -1.2873733 -0.6924393 -0.5064050 0.4168783 -0.1905477 0
-0.2507887 -0.5596830 0.1495433 0.5932430 0.6265013 -0.5571396 0.7790565 -0.5306771 0
-0.5475618 1.1292622 0.2528715 0.9066791 3.1255468 0.9395321 -1.0197620 -0.2755801 0
-0.8443348 1.4420298 0.2528715 -0.2216907 0.5570834 -1.0898533 -0.0750805 -0.0204831 1
-1.1411079 1.8173510 -0.9870665 0.9693663 0.6872420 0.7365936 -0.0509352 -0.9558388 1
2.1233958 0.4724502 0.7695123 0.9066791 0.4356020 -0.4683540 -0.6394748 0.7448080 1
-1.1411079 -0.4345760 -0.4704257 0.2798070 -0.6924393 -0.7093435 -1.0227801 -0.8708064 0
-0.8443348 -0.9350042 -0.7804102 0.2798070 0.1752848 -0.8615474 -0.7179468 -0.8708064 0
-0.8443348 -0.1218083 -0.4704257 0.1544326 0.2273482 0.2292472 -0.0177356 -0.5306771 0
0.3427574 0.0658522 0.2528715 1.2201151 -0.0242918 0.2672982 -0.6123115 -0.4456447 0
-0.5475618 -0.0279780 -0.7804102 -1.2873733 -0.6924393 -0.6586089 -0.0509352 -0.5306771 0
-0.8443348 -0.4658527 0.0462151 0.4678686 0.4789882 0.2799819 -0.9956168 -0.9558388 0
-0.5475618 1.0667087 -0.8837383 0.4051814 3.9932709 0.8507465 -0.6998379 -0.7007418 1
-0.5475618 -0.6222365 -0.5737538 0.9066791 0.0885124 -1.2927918 -0.9563808 -0.9558388 0
-0.8443348 -0.0279780 0.5628560 1.7216128 1.0430089 0.8761138 2.0828981 0.6597757 0
2.1233958 0.1909593 1.9061221 -1.2873733 -0.6924393 0.8887975 -0.8507455 1.5100991 0
-0.2507887 -1.2790486 0.6661841 0.6559302 -0.0850324 0.2799819 2.4752578 -0.5306771 1
1.8266227 1.2856460 0.7695123 -1.2873733 -0.6924393 -0.5444560 -0.8748907 1.7651961 0
-0.8443348 2.4428862 0.3561996 1.4081767 -0.6924393 1.3834602 2.7831093 -0.9558388 1
1.2330766 1.4420298 1.9061221 1.5962384 1.3120034 0.7112263 -0.9261993 0.8298403 1
1.5298497 0.7539410 0.5628560 1.5962384 0.4356020 0.7492772 0.4983684 0.5747433 1
0.6395305 -0.1843619 -0.4704257 1.1574279 -0.6924393 0.2165636 -0.6847471 0.5747433 1
-0.8443348 -0.2781921 0.5628560 1.5335512 0.4529565 0.3560838 -0.7692554 -0.7857741 0
0.0459844 0.7539410 0.6661841 -0.1590035 -0.6924393 0.0643597 -0.7149286 3.1257135 1
1.8266227 -0.3094689 0.0462151 0.4051814 -0.6924393 -0.5698233 -0.9986349 0.5747433 1
0.6395305 -0.7160668 -0.5737538 0.7813046 0.9562365 0.2546145 -0.1263890 0.8298403 0
1.5298497 1.0354319 0.4595278 0.5932430 0.1752848 -0.1385789 -0.9292174 0.9999050 0
0.6395305 1.3794763 -0.0571130 0.3424942 0.7653372 0.2038799 0.4802595 1.3400344 0
-0.8443348 -0.6847901 -0.5737538 -0.6605012 -0.6924393 -0.8361801 0.2388073 -1.0408711 0
1.8266227 -1.6543697 1.9061221 0.1544326 -0.2672545 0.4448694 -0.5640211 1.1699697 0
-0.2507887 0.0658522 1.5961376 0.9066791 1.3900986 3.2099071 1.2317793 -0.9558388 0
1.2330766 -0.9350042 0.6661841 -1.2873733 -0.6924393 0.4575531 0.3474608 2.9556488 0
0.6395305 2.3177792 0.0462151 -1.2873733 -0.6924393 -0.1385789 -0.4342405 -0.1905477 1
1.5298497 1.0979854 0.8728404 -1.2873733 -0.6924393 -0.9122821 -0.7300194 1.6801637 1
-1.1411079 -0.8724506 -0.4704257 -1.2873733 -0.6924393 0.4195021 -0.6304204 -0.7007418 0
-0.2507887 0.0032987 -0.8837383 -1.2873733 -0.6924393 0.5082877 -1.0408890 -0.7007418 1
-0.5475618 -0.6222365 -0.5737538 -0.2216907 1.6070296 -0.9883840 0.4289509 -0.8708064 0
-0.5475618 -2.0296909 -0.6770820 0.4678686 -0.3019635 -0.9883840 -0.4221679 -0.9558388 0
-1.1411079 1.2856460 0.3561996 0.9693663 -0.6924393 2.2332653 -0.3255871 -0.6157094 1
-1.1411079 -0.8098971 -0.2637694 1.1574279 0.2186710 1.5990824 -0.3195508 -0.9558388 0
0.0459844 0.1284058 0.5628560 -1.2873733 -0.6924393 0.0389923 0.1935351 -0.5306771 1
0.3427574 0.4724502 0.6661841 -1.2873733 -0.6924393 -4.0578295 0.5074228 3.0406812 0
-0.5475618 0.2535128 0.2528715 0.3424942 1.0863951 0.1531453 0.3595334 -0.7007418 0
-0.2507887 0.2847896 -0.2637694 -1.2873733 -0.6924393 -1.1279043 -0.4764946 -0.9558388 0
-0.8443348 -0.4345760 -0.9870665 -0.0963163 -0.6924393 -0.4683540 -0.8779088 -0.3606124 0
-0.8443348 0.5975572 0.2528715 0.3424942 0.8694641 -1.0010677 1.0748354 -0.8708064 0
-0.8443348 0.7226643 0.6661841 1.5962384 0.8694641 1.7893373 -0.4131135 1.0849374 1
1.2330766 -0.4345760 0.5628560 -1.2873733 -0.6924393 -0.9376494 1.1593436 0.0645493 0
2.7169419 1.1605390 2.3194347 -1.2873733 -0.6924393 1.3073582 -0.6485293 0.9148727 1
-0.5475618 0.0032987 0.0462151 0.7186174 0.1318986 0.9014811 1.2498882 -0.8708064 0
0.9363036 0.2535128 -0.0571130 1.7843000 0.3922158 0.8253792 -0.0992257 0.8298403 1
-0.5475618 -0.9662809 -0.4704257 -1.2873733 -0.6924393 -1.0771696 -0.8477273 -0.7007418 0
0.9363036 0.6601107 1.0794968 0.2171198 3.4726364 -0.2019972 -1.0378709 0.8298403 1
-0.2507887 1.5045833 0.2528715 -0.0963163 0.3922158 -0.2654155 -0.6153296 -0.1905477 1
-1.1411079 -0.6847901 -3.5702706 -1.2873733 -0.6924393 -0.8869148 -0.6606019 -0.9558388 0
0.0459844 0.1909593 0.9761686 -0.5978140 0.6525331 0.3180328 0.3806605 -0.4456447 0
0.0459844 -0.0905316 0.0462151 -1.2873733 -0.6924393 1.5863987 1.3042149 -0.6157094 0
-0.5475618 0.0345755 0.3561996 0.4051814 1.0430089 0.4956041 0.0335730 -0.6157094 0
0.6395305 0.1284058 0.4595278 0.6559302 -0.6924393 -0.5571396 0.2810615 1.3400344 1
-0.8443348 1.4733066 0.9761686 0.5305558 -0.6924393 0.3814511 1.3072331 1.5951314 1
-0.5475618 0.2535128 -3.5702706 -1.2873733 -0.6924393 0.8253792 -0.5066762 0.6597757 0
0.0459844 -0.3407457 0.3561996 -0.0336291 0.1752848 -0.4556704 -1.0680524 -0.5306771 0
0.6395305 -1.2790486 0.5628560 0.9693663 -0.6924393 0.9902668 -0.8899814 -0.4456447 0
1.8266227 -0.1843619 -3.5702706 -1.2873733 -0.6924393 -4.0578295 -0.6364567 -0.2755801 1
-0.5475618 0.1909593 -1.1937228 0.0290581 2.2144365 0.3053492 -0.8929996 -0.9558388 0
1.5298497 1.3481995 0.4595278 -1.2873733 -0.6924393 0.1024106 -0.9775078 0.9999050 1
-0.5475618 -0.8724506 -0.2637694 0.7186174 0.6959193 0.7619609 0.6100400 -0.8708064 1
-0.2507887 1.1605390 -0.2637694 -0.4724395 2.6656530 -0.1005279 -0.5338395 -0.7857741 0
0.3427574 0.1596825 0.4595278 0.4051814 -0.5015400 -0.3034664 -0.0992257 0.5747433 0
1.8266227 0.2535128 -0.3670975 0.9693663 -0.6924393 1.1678380 -0.0931894 0.4046786 1
-1.1411079 0.4098966 -0.5737538 -0.0336291 1.8326379 -0.7093435 -0.3618049 -1.0408711 0
-0.2507887 -0.5909598 0.2528715 -1.2873733 -0.6924393 -0.3161501 -1.0589979 -0.1055154 0
0.9363036 2.0675651 -0.9870665 0.7813046 2.7090392 0.2419309 1.0687991 0.0645493 1
-0.2507887 1.6296904 0.4595278 1.1574279 0.9128503 0.2292472 1.5034129 -0.1905477 1
1.8266227 -0.8411739 0.1495433 -0.1590035 -0.6924393 -1.1279043 0.3716060 1.9352608 0
-0.8443348 -0.4032992 -0.4704257 1.5962384 0.8521096 0.4448694 -0.1716613 -0.7857741 0
0.3427574 -0.7473436 0.3561996 0.4051814 -0.6924393 0.4575531 -0.2833329 1.5951314 1
0.0459844 -1.1852183 0.8728404 -0.0963163 -0.6924393 -0.3415174 -0.4674402 0.0645493 0
-0.8443348 -0.2156386 -0.1604412 0.9693663 1.0430089 0.7746446 -0.5519484 -1.0408711 0
-0.8443348 0.8790481 -0.0571130 0.5305558 0.4095703 -0.3415174 -0.3708593 0.7448080 1
0.3427574 -0.1218083 0.8728404 0.5932430 0.2186710 0.9014811 -0.6666382 0.7448080 0
-0.8443348 -0.3094689 1.2861531 -1.2873733 -0.6924393 0.1024106 -0.6243841 0.9999050 0
0.0459844 -0.2781921 0.4595278 1.2201151 -0.6924393 0.9395321 -0.7119105 0.4046786 0
-0.8443348 -0.1530851 0.4595278 0.5305558 0.8694641 0.5209714 0.0728090 -0.7007418 0
-1.1411079 0.6288340 0.7695123 0.3424942 -0.6924393 0.0516760 -0.1173346 -0.9558388 0
-0.5475618 1.6922439 0.9761686 -1.2873733 -0.6924393 -1.1532716 -0.4402768 -0.9558388 0
-0.5475618 -0.9037274 -0.8837383 -1.2873733 -0.6924393 -0.2400482 -0.9986349 -0.9558388 0
-0.2507887 0.2847896 0.4595278 0.1544326 -0.0069373 -0.4556704 -0.4493313 0.0645493 1
1.2330766 -0.0279780 0.8728404 -1.2873733 -0.6924393 -0.4556704 -0.6424930 -0.9558388 1
-0.5475618 1.6609672 0.9761686 1.0320535 0.3488296 1.5863987 0.5255318 -0.7857741 1
-0.5475618 -0.4658527 -0.6770820 0.4051814 0.7393055 -0.3795684 -0.1384616 -0.9558388 0
-0.5475618 -0.4971295 0.3045355 -1.2873733 -0.6924393 -1.1025370 0.2659707 1.6801637 0
0.0459844 -0.8098971 -0.4704257 0.7186174 -0.6924393 0.4321858 -0.5670392 -0.4456447 0
-1.1411079 0.1596825 0.8728404 0.4051814 0.3488296 -0.5825069 0.1301539 -1.0408711 0
1.2330766 -1.7482000 0.1495433 0.1544326 -0.6924393 0.0009414 0.3866968 0.7448080 0
-0.5475618 -0.6847901 -0.4704257 -0.2216907 0.6959193 0.5843897 -0.0569715 -1.0408711 0
-0.8443348 -0.5909598 0.2528715 -1.2873733 -0.6924393 0.9522158 -0.5398758 0.7448080 1
2.1233958 -0.0279780 0.5628560 1.0320535 0.6091468 1.3073582 0.9450549 1.2550020 1
-0.2507887 -0.5909598 -1.2970510 -0.0336291 0.1232213 -0.1512625 -0.2169336 -0.6157094 0
-0.8443348 -0.3720224 -0.5737538 -0.1590035 0.3141206 -0.4429867 -0.7632191 -0.9558388 0
1.5298497 0.5975572 1.2861531 -1.2873733 -0.6924393 0.0897270 0.7911291 0.9999050 1
2.7169419 1.0041551 0.9761686 1.0320535 0.5223744 1.0917360 2.1191159 0.4897110 0
2.4201689 -0.6535133 0.7695123 0.7813046 0.2186710 -0.2527318 0.0486638 1.0849374 0
-0.8443348 0.8164946 1.2861531 1.2828023 -0.6924393 2.1952144 -0.3436960 -0.5306771 1
-0.8443348 -1.2477718 0.2528715 1.2828023 -0.1978366 1.8147046 1.8837001 -0.1055154 0
-0.2507887 2.0675651 0.0462151 0.0917453 1.0430089 0.5590224 -0.1927884 0.2346140 1
0.6395305 1.2856460 -0.3670975 -1.2873733 -0.6924393 -0.9757004 -0.8869633 1.4250667 1
0.0459844 0.4724502 0.0462151 -1.2873733 -0.6924393 -0.1005279 2.1432611 -0.9558388 1
-0.8443348 0.0032987 0.4595278 1.1574279 -0.0503235 0.8887975 -0.6364567 -0.4456447 0
-0.2507887 -0.4032992 -0.3670975 0.2171198 -0.6924393 -0.7600782 -0.7511465 -0.7007418 0
-1.1411079 1.8799045 0.9761686 1.4708639 3.7329537 1.4341948 -0.7541646 -0.6157094 1
1.2330766 1.0354319 0.4595278 0.7186174 -0.6924393 0.0516760 -0.0871531 0.9999050 1
-0.8443348 0.2222361 0.9761686 1.1574279 0.2620572 0.5717060 1.7659922 0.3196463 1
0.9363036 0.5037269 1.0794968 1.2828023 -0.6924393 0.0009414 -0.2440970 0.4897110 0
-1.1411079 0.0658522 0.1495433 -1.2873733 -0.6924393 0.5463387 -0.6455111 1.5951314 1
-0.8443348 -0.4658527 0.3561996 -1.2873733 -0.6924393 0.6985426 -0.8296184 -0.6157094 0
0.6395305 2.1613954 1.1828249 -1.2873733 -0.6924393 0.4448694 -0.5851481 2.7855842 1
-0.5475618 -1.0288345 -0.5737538 0.3424942 -0.5536035 -0.4556704 0.8877100 -0.9558388 0
1.5298497 1.5358601 0.2528715 0.6559302 -0.6924393 1.5229804 -0.2078791 0.8298403 1
1.5298497 -0.9975577 -0.3670975 -1.2873733 -0.6924393 -1.2040062 -0.9956168 -0.0204831 0
1.8266227 -0.6222365 0.3561996 1.7216128 0.8694641 0.1150943 -0.9080904 2.5304871 0
-0.5475618 0.0345755 0.0462151 0.4051814 -0.6924393 0.6097570 -0.3980227 -0.5306771 0
0.3427574 0.0032987 0.1495433 0.1544326 0.2794117 -0.7347108 -0.6847471 -0.2755801 0
-0.8443348 0.1596825 -0.4704257 -1.2873733 -0.6924393 -0.2400482 -0.3708593 1.1699697 1
-0.8443348 -0.8724506 0.0462151 0.6559302 -0.6924393 -0.2019972 -0.4734765 -0.8708064 0

Funkcje własne

Do celów niniejszego projektu przygotowałem dwie własne funkcje które ułatwią mi przeprowadzenie zaplanowanej analizy.

Funkcja train_test_split

Aby móc analizować działanie funkcji knn niezbędne będzie podzielenie zbioru danych na podzbiory testowy oraz treningowy. Oczywiście, można to zrobić korzystając z prostej funkcji sample. Takie podejście jednak nie daje mi gwarancji, że obserwowany w zmiennej objaśnianej stosunek pozytywów (sukcesów) do negatywów (porażek) będzie również zachowany w podzbiorach testowym oraz treningowym. Przygotowałem więc własną funkcję train_test_split, która zapewnia mi taki podział na dwa podzbiory, aby w każdym z nich stosunek pozytywów do negatywów był (o ile to tylko możliwe) równy lub przynajmniej zbliżony do stosunku występującego w zmiennej objaśnianej całego zbioru danych.

Funkcja może się wydawać nieco skomplikowana, jednak została napisana tak aby można ją było używać w wygodnych potokach, zarówno w potoku od magrittr czyli %>% jak również w wbudowanym od pewnego czasu w samym R potoku |>. Ponadto funkcja dokładnie testuje parametry wejściowe. Wartości dla pozytywów i negatywów mogą tworzyć dowolne pary np. 0 i 1, 7 i 8, T i F, "1" i "0" oraz dowolna inna kombinacja dwóch wartości tego samego typu. Domyślnie przyjmowane są wartości 1L dla pozytywów i 0L dla negatywów.

Proporcja podziału podzbioru treningowego ustalana jest parametrem ptr. Jeżeli zestaw danych nie pozwoli na podział zbioru na dwa podzbiory z zachowaniem proporcji pozytywów do negatywów, parametr ten zostanie odpowiednio skorygowany, a użytkownik poinformowany o tym fakcie odpowiednim komunikatem. Dla przykładu możemy sobie wyobrazić, że chcemy dzielić ramkę danych w której zmienna objaśniana stanowi następujący wektor c(1, 1, 0, 0, 0, 0). Jak można zauważyć w wektorze tym stosunek wartości 1 do 0 wynosi 0.5. Jest oczywistym, że aby zachować taki sam stosunek w zbiorach testowym i treningowym jedyną możliwą proporcją podziału będzie wartość 0.5 która daje pewność, że wartość 1 będzie obecna zarówno w zbiorze treningowym jak i testowym.

Poniżej znajduje się cały kod funkcji train_test_split wraz z dwoma pomocniczymi funkcjami ptrmin oraz ptrmax pomocnymi do ustalenia poprawnego zakresu parametru ptr.

#Funkcje pomocnicze do wyznaczania minimalnej oraz maksymalnej proporcji podziału
ptrmin = function(n, p){
  ptr = max(1/(n*p), 1/(n*(1-p)))
  ifelse(ptr>.5, NA, round(ptr, 15))
}
ptrmin = Vectorize(ptrmin)

ptrmax = function(n, p){
  ptr = 1 - max(1/(n*p), 1/(n*(1-p)))
  ifelse(ptr<.5, NA, round(ptr, 15))
}
ptrmax = Vectorize(ptrmax)


#Funkcja zwracająca indeksy zbioru testowego.
train_test_split = function(df, var, ptr=0.7, propv=TRUE,
                            positive = 1L, negative = 0L){
  var = enquo(var)
  v = df |> pull(!!var)

  #Zmienna musi zawierać wartości negative oraz positive i żadnych innych
  if(!(unique(v) |> sort() |> identical(c(positive,negative) |> sort()))){
    stop(paste("Zmienna", quo_name(var),
               "musi zawierać wyłącznie wartości",
               negative, "oraz", positive,"!"))
  }

  #Zmienna musi zawierać co najmniej dwie wartości negative i dwie wartości positive
  if(any(c(sum(v==negative), sum(v==positive))<2)){
    stop(paste("Zmienna", quo_name(var),
               "musi zawierać co najmniej dwie wartości",
               negative, "oraz", positive,"!"))
  }

  n = length(v)
  p = sum(v==positive)/n
  ptr_min = ifelse(is.na(ptrmin(n, p)), .5, ptrmin(n, p))
  ptr_max = ifelse(is.na(ptrmax(n, p)), .5, ptrmax(n, p))

  #Współczynnik podziału musi być na tyle wysoki aby w zbiorze zarówno
  #treningowym jak i testowym znalazło się co najmniej po jednej wartości
  #negative i positive
  if(ptr<ptr_min){
    warning(paste("Współczynnik proporji podziału", ptr, "był zbyt niski!",
                  "Został zwiększony do minimalnej wartości", ptr_min))
    ptr=ptr_min
  }
  if(ptr>ptr_max){
    warning(paste("Współczynnik proporji podziału", ptr, "był zbyt wysoki!",
                  "Został zmniejszony do maksymalnej wartości", ptr_max))
    ptr=ptr_max
  }

  #Zwróć indeksy zbioru treningowego
  idxpos = which(v==positive)
  idxneg = which(v==negative)
  npos = round(length(idxpos)*ptr)
  nneg = round(length(idxneg)*ptr)
  if(propv) {sort(c(sample(idxpos, npos), sample(idxneg, nneg)))
  } else {sort(sample(1:n, ptr*n))}
}

Funckja knn_tiuning

Druga funkcja, knn_tiuning jest funkcją pozwalająca na bardzo szerokie badanie procesu tuningu parametru k funkcji knn. Jej ostateczna forma kształtowała się podczas wykonywania kolejnych eksperymentów numerycznych. Składa się ona z pięciu wzajemnie wewnętrznych pętli for. Każda z tych pętli związana jest z osobnym działaniem sterowanym odpowiednimi parametrami wejściowymi.

Pierwsza pętla for

Pierwsza, najbardziej zewnętrzna pętla for jest zwykłym powtórzeniem całego algorytmu n razy. Domyślnie wartość parametru n wynosi 1. Zanim jednak ta pierwsza pętla zostanie uruchomiona przygotowuję macierz out w której gromadzone będą wyniki. Macierz ta posiada posiada odpowiednią ilość wierszy oraz kolumny dla wszystkich wartości iteratorów a także dla wszystkich wartości zwracanych przez funkcję confusionMatrix. Nazwy tych kolumn pobieram z wyniku zwróconego przez “puste” wywołanie confusionMatrix(as.factor(c(1,0)), as.factor(c(1,0))).

Druga pętla for

Zadaniem drugiej pętli for jest wywołanie nsample razy pętli dzielącej dane wejściowe df na podzbiory testowy oraz treningowy. Domyślnie wartość parametru nsample również wynosi 1.

Trzecia pętla for

W trzeciej pętli wykonywany jest podział zbioru danych wejściowych na zbiory testowe oraz treningowe z proporcjami podziału danymi w parametrze ptrseq, który może być wektorem z dowolnymi wartościami (w dowolnej kolejności) parametru ptr przekazywanego do funkcji train_test_split.

Czwarta pętla for

Czwarta pętla for jest przygotowana dla wywołania nknn razy pętli tuningującej parametr k funkcji knn. Domyślnie wartość parametru nknn również wynosi 1.

Piąta pętla for

Piąta, najbardziej wewnętrzna i ostatnia już pętla for wykonuje tuning parametru k funkcji knn, a w zasadzie wywołuje tą funkcję dla każdej z wartości k która znajduje się w parametrze kseq gromadząc otrzymane wyniki w macierzy out. Takie podejście, podobnie jak w przypadku ptrseq pozwala wywoływać funkcję knn z dowolnymi wartościami (w dowolnej sekwencji) parametru k. Otrzymane w ten sposób wartości predykcyjne porównywane są z wykorzystaniem funkcji confusionMatrix z wartościami referencyjnymi a wyniki, wraz z wartościami wszystkich iteratorów zapisywane do wyjściowej macierzy out.

Zwrot wyników

Na samym końcu, wyjściowa macierz out przekształcana jest w tabelę danych typu tibble, która dodatkowo zostaje uzupełniona o atrybut param zawierający wszystkie wartości wejściowych parametrów funkcji knn_tiuning.

#Funkcja tuningu parametru K
knn_tiuning = function(df, var, n=1, nsample = 1, ptrseq = 0.7, propv = TRUE,
                       nknn = 1, kseq = 1, positive = "1"){
  var = enquo(var)

  nrow = n*nsample*length(ptrseq)*nknn*length(kseq)
  cm = confusionMatrix(as.factor(c(1,0)), as.factor(c(1,0)))
  cmnames = c("i", "isample", "ptr", "iknn", "k", names(cm$overall), names(cm$byClass))
  out = matrix(0, nrow=nrow, ncol = length(cmnames),
               dimnames=list(paste(1:nrow), cmnames))
  row = 0
  for(i in 1:n){
    for(isample in 1:nsample){
      for(iptr in seq_along(ptrseq)){
        #Podział zbioru wejściowego na podzbiory testowy oraz treningowy
        ptr = ptrseq[iptr]
        sample = df %>% train_test_split(!!var, ptr, propv)

        train = df[sample,] %>% select(-!!var)
        test = df[-sample,] %>% select(-!!var)
        cl = df[sample,] %>% pull(!!var)
        ref = df[-sample,] %>% pull(!!var)

        for(iknn in 1:nknn){
          for(ik in seq_along(kseq)){
            #Predykcja wartości dla zbioru testowego metodą knn
            row = row + 1
            k = kseq[ik]
            pred = knn(train, test, cl, k)

            #Zapis wyników
            cm = confusionMatrix(as.factor(pred), as.factor(ref), positive = positive)
            out[row,] = c(i, isample, ptr, iknn, k, cm$overall, cm$byClass)
          }
        }
      }
    }
  }
  #Zwrot wyników w formie tibble uzupełnionej o parametry wejściowe funkcji
  dfout = out %>% as_tibble()
  attributes(dfout)$param = list(
    df = deparse(substitute(df)),
    var = quo_name(var),
    n = n,
    ptrseq = ptrseq,
    propv = propv,
    nsample = nsample,
    kseq = kseq,
    nknn = nknn,
    positive = positive)
  dfout
}

Wizualizacja wyników obliczeń

Dla efektownej wizualizacji wyników przygotowałem kilka własnych funkcji generujących odpowiednie wykresy. Ich budowa nie będzie tu jednak omawiana. Natomiast kod tych funkcji, bez dodatkowego opisu, zostanie zamieszczony w dodatku na końcu tego projektu. Tutaj jedynie omówię co prezentują poszczególne wykresy i jak należy odczytywać zawarte na nich informacje. Każda z funkcji oczekuje na wejściu ramkę danych pochodzącą z funkcji knn_tiuning. Przygotujmy więc pierwszą ramkę danych. Będzie to ramka dla dziesięciu cykli tuningowych w których parametr k zmieniany będzie według następującej sekwencji seq(2, 12, 2). Ramka ta zostanie poniżej zaprezentowana w formie tabelki wyłącznie w celach poglądowych, tak aby można się było przekonać jakie dane zawiera. W dalszej części projektu uzyskiwane ramki danych nie będą już prezentowane.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, nknn = 10, kseq = seq(2, 12, 2))
df %>% kable2
i isample ptr iknn k Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull AccuracyPValue McnemarPValue Sensitivity Specificity Pos Pred Value Neg Pred Value Precision Recall F1 Prevalence Detection Rate Detection Prevalence Balanced Accuracy
1 1 0.7 1 2 0.6956522 0.3252305 0.6317592 0.7544200 0.6521739 0.0932627 0.9048611 0.5500 0.7733333 0.5641026 0.7631579 0.5641026 0.5500 0.5569620 0.3478261 0.1913043 0.3391304 0.6616667
1 1 0.7 1 4 0.7086957 0.2985890 0.6453671 0.7665543 0.6521739 0.0403624 0.0006245 0.4000 0.8733333 0.6274510 0.7318436 0.6274510 0.4000 0.4885496 0.3478261 0.1391304 0.2217391 0.6366667
1 1 0.7 1 6 0.7217391 0.3405018 0.6590326 0.7786303 0.6521739 0.0147965 0.0040403 0.4500 0.8666667 0.6428571 0.7471264 0.6428571 0.4500 0.5294118 0.3478261 0.1565217 0.2434783 0.6583333
1 1 0.7 1 8 0.7347826 0.3733810 0.6727580 0.7906455 0.6521739 0.0045506 0.0048503 0.4750 0.8733333 0.6666667 0.7572254 0.6666667 0.4750 0.5547445 0.3478261 0.1652174 0.2478261 0.6741667
1 1 0.7 1 10 0.7173913 0.3322912 0.6544709 0.7746115 0.6521739 0.0210719 0.0063572 0.4500 0.8600000 0.6315789 0.7456647 0.6315789 0.4500 0.5255474 0.3478261 0.1565217 0.2478261 0.6550000
1 1 0.7 1 12 0.7086957 0.2985890 0.6453671 0.7665543 0.6521739 0.0403624 0.0006245 0.4000 0.8733333 0.6274510 0.7318436 0.6274510 0.4000 0.4885496 0.3478261 0.1391304 0.2217391 0.6366667
1 1 0.7 2 2 0.6782609 0.2782019 0.6137011 0.7381541 0.6521739 0.2241136 0.5610799 0.5000 0.7733333 0.5405405 0.7435897 0.5405405 0.5000 0.5194805 0.3478261 0.1739130 0.3217391 0.6366667
1 1 0.7 2 4 0.6913043 0.2660674 0.6272356 0.7503627 0.6521739 0.1190426 0.0043957 0.4000 0.8466667 0.5818182 0.7257143 0.5818182 0.4000 0.4740741 0.3478261 0.1391304 0.2391304 0.6233333
1 1 0.7 2 6 0.7043478 0.2992832 0.6408249 0.7625159 0.6521739 0.0543270 0.0052845 0.4250 0.8533333 0.6071429 0.7356322 0.6071429 0.4250 0.5000000 0.3478261 0.1478261 0.2434783 0.6391667
1 1 0.7 2 8 0.7217391 0.3405018 0.6590326 0.7786303 0.6521739 0.0147965 0.0040403 0.4500 0.8666667 0.6428571 0.7471264 0.6428571 0.4500 0.5294118 0.3478261 0.1565217 0.2434783 0.6583333
1 1 0.7 2 10 0.7260870 0.3528361 0.6636010 0.7826422 0.6521739 0.0101891 0.0055758 0.4625 0.8666667 0.6491228 0.7514451 0.6491228 0.4625 0.5401460 0.3478261 0.1608696 0.2478261 0.6645833
1 1 0.7 2 12 0.7304348 0.3529946 0.6681761 0.7866474 0.6521739 0.0068785 0.0006058 0.4375 0.8866667 0.6730769 0.7471910 0.6730769 0.4375 0.5303030 0.3478261 0.1521739 0.2260870 0.6620833
1 1 0.7 3 2 0.7391304 0.4147583 0.6773469 0.7946366 0.6521739 0.0029494 0.5186050 0.5875 0.8200000 0.6351351 0.7884615 0.6351351 0.5875 0.6103896 0.3478261 0.2043478 0.3217391 0.7037500
1 1 0.7 3 4 0.6956522 0.2876106 0.6317592 0.7544200 0.6521739 0.0932627 0.0231510 0.4375 0.8333333 0.5833333 0.7352941 0.5833333 0.4375 0.5000000 0.3478261 0.1521739 0.2608696 0.6354167
1 1 0.7 3 6 0.7043478 0.2903811 0.6408249 0.7625159 0.6521739 0.0543270 0.0010595 0.4000 0.8666667 0.6153846 0.7303371 0.6153846 0.4000 0.4848485 0.3478261 0.1391304 0.2260870 0.6333333
1 1 0.7 3 8 0.7173913 0.3280899 0.6544709 0.7746115 0.6521739 0.0210719 0.0029124 0.4375 0.8666667 0.6363636 0.7428571 0.6363636 0.4375 0.5185185 0.3478261 0.1521739 0.2391304 0.6520833
1 1 0.7 3 10 0.7304348 0.3570784 0.6681761 0.7866474 0.6521739 0.0068785 0.0014983 0.4500 0.8800000 0.6666667 0.7500000 0.6666667 0.4500 0.5373134 0.3478261 0.1565217 0.2347826 0.6650000
1 1 0.7 3 12 0.7347826 0.3694382 0.6727580 0.7906455 0.6521739 0.0045506 0.0021200 0.4625 0.8800000 0.6727273 0.7542857 0.6727273 0.4625 0.5481481 0.3478261 0.1608696 0.2391304 0.6712500
1 1 0.7 4 2 0.6782609 0.2866723 0.6137011 0.7381541 0.6521739 0.2241136 0.9074563 0.5250 0.7600000 0.5384615 0.7500000 0.5384615 0.5250 0.5316456 0.3478261 0.1826087 0.3391304 0.6425000
1 1 0.7 4 4 0.6826087 0.2453933 0.6182066 0.7422297 0.6521739 0.1844545 0.0049698 0.3875 0.8400000 0.5636364 0.7200000 0.5636364 0.3875 0.4592593 0.3478261 0.1347826 0.2391304 0.6137500
1 1 0.7 4 6 0.7434783 0.3862506 0.6819429 0.7986206 0.6521739 0.0018721 0.0007120 0.4625 0.8933333 0.6981132 0.7570621 0.6981132 0.4625 0.5563910 0.3478261 0.1608696 0.2304348 0.6779167
1 1 0.7 4 8 0.7260870 0.3528361 0.6636010 0.7826422 0.6521739 0.0101891 0.0055758 0.4625 0.8666667 0.6491228 0.7514451 0.6491228 0.4625 0.5401460 0.3478261 0.1608696 0.2478261 0.6645833
1 1 0.7 4 10 0.7043478 0.2948602 0.6408249 0.7625159 0.6521739 0.0543270 0.0024318 0.4125 0.8600000 0.6111111 0.7329545 0.6111111 0.4125 0.4925373 0.3478261 0.1434783 0.2347826 0.6362500
1 1 0.7 4 12 0.7434783 0.3823396 0.6819429 0.7986206 0.6521739 0.0018721 0.0002671 0.4500 0.9000000 0.7058824 0.7541899 0.7058824 0.4500 0.5496183 0.3478261 0.1565217 0.2217391 0.6750000
1 1 0.7 5 2 0.6739130 0.2662697 0.6092015 0.7340726 0.6521739 0.2681088 0.4884223 0.4875 0.7733333 0.5342466 0.7388535 0.5342466 0.4875 0.5098039 0.3478261 0.1695652 0.3173913 0.6304167
1 1 0.7 5 4 0.7043478 0.2992832 0.6408249 0.7625159 0.6521739 0.0543270 0.0052845 0.4250 0.8533333 0.6071429 0.7356322 0.6071429 0.4250 0.5000000 0.3478261 0.1478261 0.2434783 0.6391667
1 1 0.7 5 6 0.7130435 0.3198925 0.6499158 0.7705862 0.6521739 0.0294392 0.0046388 0.4375 0.8600000 0.6250000 0.7413793 0.6250000 0.4375 0.5147059 0.3478261 0.1521739 0.2434783 0.6487500
1 1 0.7 5 8 0.7304348 0.3729112 0.6681761 0.7866474 0.6521739 0.0068785 0.0308500 0.5000 0.8533333 0.6451613 0.7619048 0.6451613 0.5000 0.5633803 0.3478261 0.1739130 0.2695652 0.6766667
1 1 0.7 5 10 0.7173913 0.3322912 0.6544709 0.7746115 0.6521739 0.0210719 0.0063572 0.4500 0.8600000 0.6315789 0.7456647 0.6315789 0.4500 0.5255474 0.3478261 0.1565217 0.2478261 0.6550000
1 1 0.7 5 12 0.7173913 0.3195266 0.6544709 0.7746115 0.6521739 0.0210719 0.0005147 0.4125 0.8800000 0.6470588 0.7374302 0.6470588 0.4125 0.5038168 0.3478261 0.1434783 0.2217391 0.6462500
1 1 0.7 6 2 0.6695652 0.2542662 0.6047077 0.7299852 0.6521739 0.3159632 0.4220007 0.4750 0.7733333 0.5277778 0.7341772 0.5277778 0.4750 0.5000000 0.3478261 0.1652174 0.3130435 0.6241667
1 1 0.7 6 4 0.6826087 0.2501117 0.6182066 0.7422297 0.6521739 0.1844545 0.0100268 0.4000 0.8333333 0.5614035 0.7225434 0.5614035 0.4000 0.4671533 0.3478261 0.1391304 0.2478261 0.6166667
1 1 0.7 6 6 0.7260870 0.3528361 0.6636010 0.7826422 0.6521739 0.0101891 0.0055758 0.4625 0.8666667 0.6491228 0.7514451 0.6491228 0.4625 0.5401460 0.3478261 0.1608696 0.2478261 0.6645833
1 1 0.7 6 8 0.7130435 0.3198925 0.6499158 0.7705862 0.6521739 0.0294392 0.0046388 0.4375 0.8600000 0.6250000 0.7413793 0.6250000 0.4375 0.5147059 0.3478261 0.1521739 0.2434783 0.6487500
1 1 0.7 6 10 0.7217391 0.3446126 0.6590326 0.7786303 0.6521739 0.0147965 0.0086649 0.4625 0.8600000 0.6379310 0.7500000 0.6379310 0.4625 0.5362319 0.3478261 0.1608696 0.2521739 0.6612500
1 1 0.7 6 12 0.7043478 0.2903811 0.6408249 0.7625159 0.6521739 0.0543270 0.0010595 0.4000 0.8666667 0.6153846 0.7303371 0.6153846 0.4000 0.4848485 0.3478261 0.1391304 0.2260870 0.6333333
1 1 0.7 7 2 0.6826087 0.2900634 0.6182066 0.7422297 0.6521739 0.1844545 0.6396669 0.5125 0.7733333 0.5466667 0.7483871 0.5466667 0.5125 0.5290323 0.3478261 0.1782609 0.3260870 0.6429167
1 1 0.7 7 4 0.7130435 0.3283186 0.6499158 0.7705862 0.6521739 0.0294392 0.0193490 0.4625 0.8466667 0.6166667 0.7470588 0.6166667 0.4625 0.5285714 0.3478261 0.1608696 0.2608696 0.6545833
1 1 0.7 7 6 0.7217391 0.3486726 0.6590326 0.7786303 0.6521739 0.0147965 0.0175490 0.4750 0.8533333 0.6333333 0.7529412 0.6333333 0.4750 0.5428571 0.3478261 0.1652174 0.2608696 0.6641667
1 1 0.7 7 8 0.7260870 0.3446404 0.6636010 0.7826422 0.6521739 0.0101891 0.0010540 0.4375 0.8800000 0.6603774 0.7457627 0.6603774 0.4375 0.5263158 0.3478261 0.1521739 0.2304348 0.6587500
1 1 0.7 7 10 0.7304348 0.3529946 0.6681761 0.7866474 0.6521739 0.0068785 0.0006058 0.4375 0.8866667 0.6730769 0.7471910 0.6730769 0.4375 0.5303030 0.3478261 0.1521739 0.2260870 0.6620833
1 1 0.7 7 12 0.7391304 0.3698630 0.6773469 0.7946366 0.6521739 0.0029494 0.0001812 0.4375 0.9000000 0.7000000 0.7500000 0.7000000 0.4375 0.5384615 0.3478261 0.1521739 0.2173913 0.6687500
1 1 0.7 8 2 0.7260870 0.3836665 0.6636010 0.7826422 0.6521739 0.0101891 0.4496918 0.5625 0.8133333 0.6164384 0.7770701 0.6164384 0.5625 0.5882353 0.3478261 0.1956522 0.3173913 0.6879167
1 1 0.7 8 4 0.6739130 0.2390825 0.6092015 0.7340726 0.6521739 0.2681088 0.0376669 0.4125 0.8133333 0.5409836 0.7218935 0.5409836 0.4125 0.4680851 0.3478261 0.1434783 0.2652174 0.6129167
1 1 0.7 8 6 0.7086957 0.3030303 0.6453671 0.7665543 0.6521739 0.0403624 0.0014911 0.4125 0.8666667 0.6226415 0.7344633 0.6226415 0.4125 0.4962406 0.3478261 0.1434783 0.2304348 0.6395833
1 1 0.7 8 8 0.7173913 0.3364403 0.6544709 0.7746115 0.6521739 0.0210719 0.0131127 0.4625 0.8533333 0.6271186 0.7485380 0.6271186 0.4625 0.5323741 0.3478261 0.1608696 0.2565217 0.6579167
1 1 0.7 8 10 0.7217391 0.3363390 0.6590326 0.7786303 0.6521739 0.0147965 0.0017781 0.4375 0.8733333 0.6481481 0.7443182 0.6481481 0.4375 0.5223881 0.3478261 0.1521739 0.2347826 0.6554167
1 1 0.7 8 12 0.7478261 0.3947368 0.6865461 0.8025972 0.6521739 0.0011634 0.0003922 0.4625 0.9000000 0.7115385 0.7584270 0.7115385 0.4625 0.5606061 0.3478261 0.1608696 0.2260870 0.6812500
1 1 0.7 9 2 0.7043478 0.3164336 0.6408249 0.7625159 0.6521739 0.0543270 0.0689088 0.4750 0.8266667 0.5937500 0.7469880 0.5937500 0.4750 0.5277778 0.3478261 0.1652174 0.2782609 0.6508333
1 1 0.7 9 4 0.6913043 0.2796648 0.6272356 0.7503627 0.6521739 0.1190426 0.0326625 0.4375 0.8266667 0.5737705 0.7337278 0.5737705 0.4375 0.4964539 0.3478261 0.1521739 0.2652174 0.6320833
1 1 0.7 9 6 0.7304348 0.3611111 0.6681761 0.7866474 0.6521739 0.0068785 0.0034891 0.4625 0.8733333 0.6607143 0.7528736 0.6607143 0.4625 0.5441176 0.3478261 0.1608696 0.2434783 0.6679167
1 1 0.7 9 8 0.7304348 0.3570784 0.6681761 0.7866474 0.6521739 0.0068785 0.0014983 0.4500 0.8800000 0.6666667 0.7500000 0.6666667 0.4500 0.5373134 0.3478261 0.1565217 0.2347826 0.6650000
1 1 0.7 9 10 0.7260870 0.3568575 0.6636010 0.7826422 0.6521739 0.0101891 0.0117434 0.4750 0.8600000 0.6440678 0.7543860 0.6440678 0.4750 0.5467626 0.3478261 0.1652174 0.2565217 0.6675000
1 1 0.7 9 12 0.7000000 0.2776513 0.6362889 0.7584711 0.6521739 0.0718131 0.0007495 0.3875 0.8666667 0.6078431 0.7262570 0.6078431 0.3875 0.4732824 0.3478261 0.1347826 0.2217391 0.6270833
1 1 0.7 10 2 0.6869565 0.2892704 0.6227181 0.7462992 0.6521739 0.1494055 0.2888444 0.4875 0.7933333 0.5571429 0.7437500 0.5571429 0.4875 0.5200000 0.3478261 0.1695652 0.3043478 0.6404167
1 1 0.7 10 4 0.6956522 0.2741208 0.6317592 0.7544200 0.6521739 0.0932627 0.0028074 0.4000 0.8533333 0.5925926 0.7272727 0.5925926 0.4000 0.4776119 0.3478261 0.1391304 0.2347826 0.6266667
1 1 0.7 10 6 0.7260870 0.3404643 0.6636010 0.7826422 0.6521739 0.0101891 0.0004192 0.4250 0.8866667 0.6666667 0.7430168 0.6666667 0.4250 0.5190840 0.3478261 0.1478261 0.2217391 0.6558333
1 1 0.7 10 8 0.7086957 0.3160231 0.6453671 0.7665543 0.6521739 0.0403624 0.0145500 0.4500 0.8466667 0.6101695 0.7426901 0.6101695 0.4500 0.5179856 0.3478261 0.1565217 0.2565217 0.6483333
1 1 0.7 10 10 0.7130435 0.3241318 0.6499158 0.7705862 0.6521739 0.0294392 0.0097401 0.4500 0.8533333 0.6206897 0.7441860 0.6206897 0.4500 0.5217391 0.3478261 0.1565217 0.2521739 0.6516667
1 1 0.7 10 12 0.7173913 0.3195266 0.6544709 0.7746115 0.6521739 0.0210719 0.0005147 0.4125 0.8800000 0.6470588 0.7374302 0.6470588 0.4125 0.5038168 0.3478261 0.1434783 0.2217391 0.6462500

Wykres dokładności (Accuracy)

df %>% tiuning_plot_acc_k(klab=c(2))

Wykres ten jest wykresem typu “long boxplot” (moja nazwa własna) i prezentuje otrzymane wartości Accuracy w funkcji tuningowanego parametru k. Na wykresie tym, grubszą, ciągłą linią zaznaczono wartość mediany (osiąganej w każdym z nknn przebiegów), wartość drugiego i trzeciego kwartyla (wypełnione pole) oraz wartość minimalną i maksymalną prezentowane cienką, przerywaną linią. Dodatkowo na wykresie są przedstawione punkty maksymalnej wartości Accuracy wraz z etykietą oznaczająca wartość parametru k dla której osiągnięto to maksimum. W powyższym przykładzie są to punkty dla k równego 2, 6, 8 oraz 12. Na pierwszy rzut oka może wydawać się, że tych punktów jest nieco za dużo. Jednak trzeba sobie uzmysłowić, że w jednym cyklu tuningowym dokładnie taka sama, maksymalna wartość Accuracy mogła wystąpić dla kilku różnych wartości parametru k. W powyższym przykładzie było tak np. dla czwartej iteracji, gdzie Accuracy osiągnęła maksimum równe 0.743 dla k równego 6 oraz 12. Natomiast w iteracji dziewiątej wartość Accuracy osiągnęła maksimum równe 0.730 dla k równego 6 oraz 8.

Wykres parametrów macierzy konfuzji

df %>% tiuning_plot_byClassk_k()

Drugi wykres (również typu “long boxplot”) prezentuje wybrane parametry macierzy konfuzji. Domyślnie są to parametry Sensitivity, Specificity, Precision, Recall, choć funkcje tiuning_plot_byClass... zostały przygotowane w taki sposób, aby móc zaprezentować dowolne inne parametry zwracane przez funkcję confusionMatrix. Dodatkowo na wykresie tym zaznaczono punkty dla których wartość parametru Accuracy osiągała maksimum.

Uzbrojeni w taki komplet funkcji możemy przejść do właściwej analizy.

Pierwsze spostrzeżenia

Na początek rozpocznę od wizualizacji jednego cyklu optymalizacyjnego parametru k. Optymalnej wartości k będę poszukiwać w zakresie 1:20, zaś cały cykl optymalizacyjny będzie powtórzony dziesięciokrotnie (nknn = 10).

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, nknn = 10, kseq = 1:20)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Pierwsze spostrzeżenie jakie nasuwa się po obserwacji uzyskanych wykresów to dość nieoczekiwany rozkład wartości w poszczególnych punktach k. Dla nieparzysty wartości k za każdym razem uzyskiwano dokładnie te same wartości Accuracy. Natomiast w przypadku parzystych wartości k uzyskiwane wartości Accuracy charakteryzują się pewnym niezerowym rozstępem, który wydaje się maleć wraz ze wzrostem k.

Widać to znacznie wyraźniej jeżeli proces tuningu uruchomimy osobno dla sekwencji parzystych oraz nieparzystych wartości k, dodatkowo w znacznie większym zakresie (2:80 oraz 1:79).

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, nknn = 10, kseq = seq(2, 80, 2))
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, nknn = 10, kseq = seq(1, 79, 2))
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Porównując otrzymane tu wykresy można zauważyć, że w przypadku tuningu przeprowadzonego przy użyciu nieparzystych wartości k, rozstęp uzyskiwanych wartości Accuracy wystąpił tylko dla kilku najwyższych wartości k. Natomiast dla tuningu przy użyciu wyłącznie parzystych wartości k, rozstęp wartości Accuracy jest cechą stałą, i ani razu nie zaobserwowano aby wartość Accuracy była zawsze taka sama dla każdej pętli tuningowej.

Dodatkowo trzeba zauważyć, że sam przebieg tuningu parametru k nie daje w żadnym miejscu gładkiego przebiegu, a wręcz przeciwnie występuje tu szereg lokalnych ekstremów. Dlaczego tak się dzieje? Dlaczego występują takie różnice uzyskiwanych wartości dla parzystych oraz nieparzystych wartości parametru k? Wydaje się, że może to być związane z stochastycznym procesem rozstrzygania remisów zawartym w algorytmie funkcji knn. To jest chyba jedyne logiczne wyjaśnienie zaobserwowanego zjawiska.

Kolejne spostrzeżenie związane jest z lokalizacja maksimów wartości Accuracy w stosunku do innych parametrów macierzy konfuzji.Jak widać niekoniecznie optymalne k względem maksimum Accuracy będzie wartością dla której np. Sensitivity będzie również przyjmowało wartość ekstremalną. Jeżeli więc będziemy zainteresowani optymalizacją innego parametru pochodzącego z macierzy konfuzji warto zmodyfikować nieco sam algorytm tuningu.

Cztery iteracje

W kolejnym eksperymencie wykonam cztery powtórzenia (n=4) procesu tuningu parametru k. Podobnie jak poprzednio każdy proces tuningu zostanie powtórzony dziesięciokrotnie (nknn = 10) a optymalne k będize poszukiwane w zakresie 1:50.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, nknn = 10, kseq = 1:50)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

To co od razy rzuca się w oczy to zdecydowanie różne ścieżki optymalizacyjne (w dalszej części będę się konsekwentnie posługiwał tą nazwą która nazwałem kształt uzyskanych krzywych) na przebieg . I tak tak dla pierwszej, głównej iteracji możemy zaobserwować dość płaską ścieżkę z maksimum zlokalizowanym na samym jej końcu, dla wartości k w zakresie 46:50, gdzie maksymalne wartości Accuracy wyniosły ok. 0.75. Tymczasem w przypadku drugiej głównej iteracji widzimy, że prawie wszystkie wartości Accuracy były większe od 0.75 a samo maksimum występowało głównie dla wartości k równego 16 lub 18 przy maksymalnej dokładności na poziomie 0.82. Trzeci przebieg naszego algorytmu wyraźnie optymalizował k w zakresie 27:30 podczas gdy dla ostatniej, czwartej iteracji maksima Accuracy występowały w dość szerokim przedziale k pomiędzy 16:27, czyli w przedziale w którym w przypadku pierwszej iteracji widać wyraźny “dołek”. To jest dość zaskakujące.

Sprawdźmy zatem co zmieni się w przebiegu procesu tuningu parametru k jeżeli odwrócimy kierunek poszukiwania optymalnego parametru tym razem zmieniając go w zakresie 50:1

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, nknn = 10, kseq = 50:1)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Jak można się przekonać zmiana kierunku poszukiwania optymalnej wartości k nie wpłynęła w ogóle na kształt ścieżek optymalizacyjnych, a jedynie wniosła niewielkie zmiany w lokalizacji maksimów Accuracy występujących w kolejnych iteracjach nknn.

Aby ostatecznie potwierdzić moje przypuszczenia uruchomiłem jeszcze raz te same cztery procesy tuningowe tym razem zamieniając sekwencję kseq na losową sekwencję liczb z zakresu 1:50. Należało tu jednak zwrócić uwagę na miejsce przygotowania losowej sekwencji. Było bardzo ważne aby przygotowanie jej nastąpiło przed ustawieniem ziarna generatora losowego.

kseq = sample(1:50, 50)
set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, kseq = kseq, nknn = 10)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

To ostatecznie utwierdziło mnie w przekonaniu, że sama sekwencja optymalizowanych wartości k nie ma żadnego wpływu na kształt ścieżek optymalizacyjnych. Pozostaje jednak pytanie dlaczego kolejne ścieżki tak bardzo się różnią pomiędzy sobą, co przyznaję było dla mnie drugim, sporym zaskoczeniem?

Chcąc wyjaśnić ten efekt musiałem spojrzeć do wnętrza funkcji knn_tiuning w poszukiwaniu różnicy. Różnica ta tkwi bowiem zasadniczo w trzeciej pętli for w której zbiór danych zostaje podzielony na podzbiory treningowy oraz testowy. Stąd już łatwo można wyciągnąć wniosek, że to w jaki sposób będzie przebiegał proces tuningu parametru k oraz jakie maksymalne wartości Accuracy będziemy osiągać zależy bardzo mocno od tego jakie elementy zbioru danych zostaną użyte do podzbioru treningowego a jakie do podzbioru testowego.

Iteracje dla tej samej wartości k

Postanowiłem dodatkowo sprawdzić co się stanie, jeżeli proces tuningu będziemy realizować cały czas dla tej samej wartości k. Podobnie jak poprzednio wykonam cztery powtórzenia (n = 4) procesu tuningu powtarzanego dwadzieścia razy (nknn = 20) dla ciągle tych samych wartości parametru k. W pierwszym przypadku k będzie nieparzyste a w drugim parzyste. Tym razem jednak na osi x wykresu przedstawię kolejne wartości iteratora czwartej pętli for funkcji knn_tiuning.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, nknn = 20, kseq = rep(15, 10))
df %>% tiuning_plot_acc_iknn()

df %>% tiuning_plot_byClassk_iknn()

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, nknn = 20, kseq = rep(16, 10))
df %>% tiuning_plot_acc_iknn()

df %>% tiuning_plot_byClassk_iknn()

Tym razem jednak, otrzymane wyniki już mnie tak mocno nie zdziwiły. Potwierdziły bowiem to co już zauważyłem na początku tej analizy. Wielokrotne wywoływanie funkcji knn dla nieparzystej wartości parametru k daje prawie zawsze takie same wartości dokładności predykcji. I nie zależy to od samego podziału zbioru danych na podzbiór testowy oraz treningowy. Oczywiście dla każdego podziału otrzymałem inną wartość Accuracy, jednak wartość ta nie zmieniała się niezależnie jak wiele razy uruchomiałem funkcję knn.

Tym czasem dla parzystej wartości parametru k rozstęp uzyskiwanych wartości dokładności predykcji jest dość znaczny. I to również nie zależy od od samego podziału zbioru danych na podzbiór testowy oraz treningowy. Chociaż oczywiście i w tym przypadku dla różnych podziałów otrzymałem różne wartości średnie parametru Accuracy. Tak samo dotyczy to wszystkich innych parametrów pochodzących z macierzy konfuzji.

Podział zbioru danych

W kolejnym kroku postanowiłem sprawdzić jaki wpływ na wyzyskiwane wyniki będzie miała proporcja podziału zbioru danych na podzbiory treningowy oraz testowy. Interesowało mnie czy wyniki będą się różnić jeżeli będę stosował bardziej rygorystyczny podział (z zachowaniem proporcji pozytywów do negatywów) w stosunku do tych które otrzymam przy podziale bez zachowania tego rygorystycznego wymogu. Moja funkcja knn_tiuning była już gotowa do takiego eksperymentu. Tak samo zawarta w niej funkcja train_test_split umożliwiała wybór metody podziału poprzez odpowiednie ustawienie parametru propv.

Podział rygorystyczny

Wykonam więc cztery powtórzenia (n = 4). W każdym z tych powtórzeń wykonam trzydzieści podziałów zbioru danych (nsample = 30). Podziały będą realizowane dla następującej sekwencji proporcji podziału seq(.075, .925, .025). Dla każdego z otrzymanych podzbiorów jeden raz wywołana będzie funkcja knn, oczywiście z nieparzystą wartością parametru k równą w tym przypadku 15.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, 
                 nsample = 30, ptrseq = seq(.075, .925, .025),
                 propv = TRUE, kseq = 15)
df %>% tiuning_plot_acc_ptr

df %>% tiuning_plot_byClassk_ptr

Uzyskane wyniki po raz trzeci wprawiły mnie w niemałą konfuzję. Z pierwszego z powyższych wykresów wynika bowiem, że do całkiem niezłej predykcji wystarczy nam już zbiór treningowy zawierający niecałe 8 procent wszystkich danych! Oczywiście dla tak małego zbioru treningowego wartość dokładności predykcji jest również mniejsza, jednak tylko nieznacznie. Zastanawiający jest także fakt, że przy bardzo dużych podzbiorach treningowych mocno rośnie rozstęp otrzymywanych wyników. Można się tu także dopatrzeć niewielkiego spadku średniej wartości dokładności predykcji.

Podział swobodny

Byłem bardzo ciekaw w jaki sposób zmienią się te wyniki jeżeli podziału na podzbiory treningowy i testowy wykonam bez rygorystycznego warunku utrzymywania takiej samej proporcji pozytywów i negatywów w obu tych podzbiorach. Wykonałem więc jeszcze jeden eksperyment tym razem zmieniając tylko parametr propv który w mojej funkcji train_test_split decydował o sposobie podziału zbioru danych.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, 
                 nsample = 30, ptrseq = seq(.075, .925, .025),
                 propv = FALSE, kseq = 15)
df %>% tiuning_plot_acc_ptr

df %>% tiuning_plot_byClassk_ptr

I tu kolejna niespodzianka. Jak się okazuje zmiana sposobu podziału spowodowała w zasadzie tylko nieco większy rozstęp międzykwartylowy uzyskiwanych wyników. Poza tym nie można się dopatrzeć żadnej większej różnicy ani co do wartości średniej parametrów ani co do rozstępu całkowitego.

Trening kontra test

Na koniec tego eksperymentu chciałem zobaczyć czy będzie różnica w przebiegu ścieżek optymalizacyjnych, a jeżeli tak to jaka ona będzie, jeżeli dla jednego podzbioru treningowego do tuningu będziemy używać kilka różnych podzbiorów testowych oraz odwrotnie, kiedy to dla jednego podzbioru testowego do tuningu parametru k będziemy używać kilku różnych podzbiorów treningowych. W tym celu nieco zmodyfikowałem moją pierwotna funkcję knn_tiuning przekształcając ją w dwie nowe funkcje knn_tiuning_train oraz knn_tiuning_test.

Funkcja knn_tiuning_train

Funkcja ta wydziela najpierw jeden podzbiór treningowy a następnie pozostałe dane dzieli na n rozłącznych podzbiorów testowych. Tuning parametru k wykonywany jest n razy przy użyciu tego jednego podzbioru treningowego oraz kolejnych n podzbiorów testowych.

knn_tiuning_train = function(df, var, n=1, nsample = 1, ptrseq = 0.5, propv = TRUE,
                       nknn = 1, kseq = 1, positive = "1"){
  var = enquo(var)
  
  nrow = n*nsample*length(ptrseq)*nknn*length(kseq)
  cm = confusionMatrix(as.factor(c(1,0)), as.factor(c(1,0)))
  cmnames = c("i", "isample", "ptr", "iknn", "k", names(cm$overall), names(cm$byClass))
  out = matrix(0, nrow=nrow, ncol = length(cmnames),
               dimnames=list(paste(1:nrow), cmnames))
  row = 0
  for(isample in 1:nsample){
    for(iptr in seq_along(ptrseq)){
      ptr = ptrseq[iptr]
      sample = df %>% train_test_split(!!var, ptr, propv)
      
      train = df[sample,] %>% select(-!!var)
      cl = df[sample,] %>% pull(!!var)
      
      stest = sample((1:nrow(df))[-sample])
      ntest = as.integer(length(stest)/n)
      for(i in 1:n){
        stest1 = stest[seq(ntest*(i-1)+1, ntest*i)]
        test = df[stest1,] %>% select(-!!var)
        ref = df[stest1,] %>% pull(!!var)
        
        for(iknn in 1:nknn){
          for(ik in seq_along(kseq)){
            row = row + 1
            k = kseq[ik]
            pred = knn(train, test, cl, k)
            cm = confusionMatrix(as.factor(pred), as.factor(ref), positive = positive)
            out[row,] = c(i, isample, ptr, iknn, k, cm$overall, cm$byClass)
          }
        }
      }
    }
  }
  dfout = out %>% as_tibble()
  attributes(dfout)$param = list(
    df = deparse(substitute(df)),
    var = quo_name(var),
    n = n,
    ptrseq = ptrseq,
    propv = propv,
    nsample = nsample,
    kseq = kseq,
    nknn = nknn,
    positive = positive)
  dfout
}

Funkcja knn_tiuning_test

Odwrotnie niż w poprzedniej funkcji, funkcja knn_tiuning_test wydziela najpierw jeden podzbiór testowy a następnie pozostałe dane dzieli na n rozłącznych podzbiorów treningowych. Tym razem tuning parametru k wykonywany jest n razy przy użyciu jednego podzbioru testowego oraz kolejnych n podzbiorów treningowych.

knn_tiuning_test = function(df, var, n=1, nsample = 1, ptrseq = 0.5, propv = TRUE,
                             nknn = 1, kseq = 1, positive = "1"){
  var = enquo(var)
  
  nrow = n*nsample*length(ptrseq)*nknn*length(kseq)
  cm = confusionMatrix(as.factor(c(1,0)), as.factor(c(1,0)))
  cmnames = c("i", "isample", "ptr", "iknn", "k", names(cm$overall), names(cm$byClass))
  out = matrix(0, nrow=nrow, ncol = length(cmnames),
               dimnames=list(paste(1:nrow), cmnames))
  row = 0
  for(isample in 1:nsample){
    for(iptr in seq_along(ptrseq)){
      ptr = ptrseq[iptr]
      sample = df %>% train_test_split(!!var, ptr, propv)
      
      test = df[-sample,] %>% select(-!!var)
      ref = df[-sample,] %>% pull(!!var)
      
      strain = sample((1:nrow(df))[sample])
      ntrain = as.integer(length(sample)/n)
      for(i in 1:n){
        strain1 = strain[seq(ntrain*(i-1)+1, ntrain*i)]
        train = df[strain1,] %>% select(-!!var)
        cl = df[strain1,] %>% pull(!!var)

        for(iknn in 1:nknn){
          for(ik in seq_along(kseq)){
            row = row + 1
            k = kseq[ik]
            pred = knn(train, test, cl, k)
            cm = confusionMatrix(as.factor(pred), as.factor(ref), positive = positive)
            out[row,] = c(i, isample, ptr, iknn, k, cm$overall, cm$byClass)
          }
        }
      }
    }
  }
  dfout = out %>% as_tibble()
  attributes(dfout)$param = list(
    df = deparse(substitute(df)),
    var = quo_name(var),
    n = n,
    ptrseq = ptrseq,
    propv = propv,
    nsample = nsample,
    kseq = kseq,
    nknn = nknn,
    positive = positive)
  dfout
}

Jeden trening

Sprawdźmy więc jak będą przebiegały ścieżki optymalizacyjne kiedy do tuningu będziemy używać jednego podzbioru danych treningowych oraz kilku podzbiorów testowych. Nasz zbiór danych podzielimy przeznaczając 25% danych na zbiór treningowy a następnie pozostałe 75% danych podzielimy na cztery rozłączne podzbiory testowe. Dla każdej powstałej w ten sposób pary trening-test wykonamy 10 cykli optymalizacyjnych dla k zmieniającego się w zakresie 1:40.

set.seed(123)
df = knn_tiuning_train(cukrzyca, Outcome, n=4, ptrseq = 0.25, kseq = 1:40, nknn = 10)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Jak widać, szczególnie na pierwszym wykresie ścieżki optymalizacyjne różnią się, i to diametralnie. Dla pierwszego podzbioru testowego cały czas utrzymywała się bardzo wysoka dokładność przy optymalnej wartości k w zakresie 8:14. W bardzo zbliżonym zakresie k uzyskano maksymalne Accuracy dla drugiej iteracji, choć przy niższych wartościach dokładności. Trzecia iteracja dała nam maksimum w zakresie 24:30 oraz ścieżkę optymalizacyjną bez tendencji malejącej przy końcu zakresu. Natomiast ostatnia, czwarta iteracja dała najmniejsze dokładności z maksimum na samym początku zakresu i z wyraźną tendencją spadkową.

Jeden test

Czy zatem będzie różnica kiedy do tuningu użyjemy kilku różnych podzbiorów treningowych a tylko jeden podzbiór testowy? Pora się przekonać. Tym razem zbiór danych zostanie podzielony tak, że 75% danych zostanie przeznaczone na 4 podzbiory treningowe a pozostałe 25% danych zostanie przeznaczone na jeden zbiór testowy. Podobnie jak poprzednio, dla każdej powstałej w ten sposób pary trening-test wykonamy 10 cykli optymalizacyjnych dla k zmieniającego się w zakresie 1:40.

set.seed(123)
df = knn_tiuning_test(cukrzyca, Outcome, n=4, ptrseq = 0.75, kseq = 1:40, nknn = 10)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Jak można się przekonać, przy takiej kombinacji par trening-test przebiegi procesu tuningu były już znacznie bardziej zbliżone a same ścieżki optymalizacyjne o wiele lepiej się pokrywają. Co prawda trudno tu wskazać jednoznaczne maksimum dokładności (poza pierwszą iteracją). Jej wartość średnia jest zaś bardzo zbliżona do średniej wartości dokładności uzyskanej w eksperymencie dla zmiennej proporcji podziału.

Ostatnie spojrzenie

Na koniec wykonam jeszcze jeden eksperyment, wracając do poprzedniej funkcji knn_tiuning. Tym razem jednak będzie on wymagał najwięcej obliczeń. Eksperyment ten będzie polegał na czterokrotnym powtórzeniu (n=4) trzydziestu podziałów zbioru danych(nsample=30) na podzbiory treningowy i testowy, a nastąpienie dla każdej z tych par trening-test wykonam 8 przebiegów optymalizacyjnych (nknn=), szukając optymalnego k dla sekwencji nieparzystych wartości seq(1, 49, 2). Da nam to w efekcie aż 24 000 wywołań funkcji knn co oczywiście będzie trochę trwało.

set.seed(123)
df = knn_tiuning(cukrzyca, Outcome, n=4, nsample=30, nknn=8, kseq=seq(1, 49, 2))
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Analizując otrzymane wykresy można zauważyć, że w każdej z czterech głównych iteracji otrzymano prawie identyczne wyniki. Po drugie, tak uzyskane ścieżki optymalizacyjne mają kształt którego można by się spodziewać, tzn. wartość Accuracy łagodnie narasta poczynając od k równego 1 i stabilizuje się na stałym poziomie ok. 0.75 od k większego od ok. 15. Warto także zwrócić uwagę, że mimo stosowania wyłącznie nieparzystych wartości k rozstęp uzyskiwanych wartości dokładności wynosił ok. 0.1 i w zakresie k większym od 15 minima Accuracy sięgały wartości0.7 a maksima osiągały wartość 0.8 a nawet 0.85 (dla drugiej iteracji). To ostatecznie i dodatkowo potwierdza nasze wcześniejsze wnioski, o bardzo silnym wpływie samego podziału na podzbiory treningowo testowe, na przebieg procesu tuningu parametru k.

Wnioski

Pierwszy wniosek jaki wyciągam z tego eksperymentu to wizualizować i jeszcze raz wizualizować. Dzisiejsze narzędzia, a w szczególności funkcji zawarte w bibliotece ggplot pozwalają na przygotowanie niesamowitych wizualizacji które w kapitalny sposób mogą unaocznić nam co dzieje się z “mielonymi” przez różne algorytmy danymi. Gdyby nie powyższa wizualizacja było by mi bardzo trudno zrozumieć jaki wpływ na działanie funkcji knn ma dobór odpowiedniej wartości k, i że parzyste k będzie powodować, że algorytm będzie musiał znacznie częściej sięgać do losowych rozstrzygnięć występujących remisów. Jednak nie to jest tu głównym problemem. Główny problem leży bowiem w samej naturze dzielenia zbioru danych na podzbiory treningowo testowe. To właśnie tu tkwi największa różnica w osiąganych wynikach. Bardzo łatwo jest trafić na taki zestaw trening-test który będzie charakteryzował się skrajnymi dokładnościami predykcji, albo bardzo wysokimi albo bardzo niskimi. I na niewiele przyda się zadbanie o to aby podział ten przeprowadzić w rygorystycznych warunkach zaproponowanych w mojej funkcji train_test_split. Choć oczywiście funkcja ta może okazać się korzystna, to jej wpływ jest minimalny.

Oczywiście w pełni zdaję sobie sprawę, że analizę tę należało by powtórzyć dla innych zbiorów danych i porównać uzyskane w ten sposób wyniki. Jednak ze względu na ograniczony zakres tego zaliczenia, zadanie to zostawiam sobie na późniejszy czas.

Na koniec chciałbym zaproponować algorytm który być może, pomoże choć trochę ominąć dostrzeżoną tutaj specyfikę algorytmu i dać przede wszystkim dobrze wybrany zbiór treningowy z nieźle dopasowaną wartością k. Tak uzyskaną parę sample-k będzie można użyć do przyszłych klasyfikacji pozwalając nam otrzymać wyniki klasyfikacji najmniej zakłócone samym podziałem trening-test. W moim odczuciu można będzie to uzyskać, jeżeli spośród kilkudziesięciu par trening-test wybierzemy taką parę, dla której uzyskiwane dokładności predykcji będą jak najbardziej zbliżone do mediany wszystkich wyników. Oczywiście niczego tu nie pozostawię ślepemu przypadkowi i “mielącym trybom” koprocesora. Całość tak jak poprzednio zostanie odpowiednio zwizualizowana.

I w ten oto sposób narodziła się ostatnia już wersja funkcji knn_tiuning, zmodyfikowana funkcja knn_tiuning_power prezentowana poniżej.

knn_tiuning_power = function(df, var, n=1, nsample = 1, ptrseq = 0.5, propv = TRUE,
                             nknn = 1, kseq = 1, positive = "1", kstart = 15){
  var = enquo(var)
  
  nrow = n*nknn*length(kseq)
  cm = confusionMatrix(as.factor(c(1,0)), as.factor(c(1,0)))
  cmnames = c("i", "isample", "ptr", "iknn", "k", names(cm$overall), names(cm$byClass))
  out = matrix(0, nrow=nrow, ncol = length(cmnames),
               dimnames=list(paste(1:nrow), cmnames))
  
  nsamples = nsample*length(ptrseq)
  samles = list()
  Acc = vector("double", nsamples)
  samplerow = 0
  row = 0
  for(i in 1:n){
    for(isample in 1:nsample){
      for(iptr in seq_along(ptrseq)){
        samplerow = samplerow + 1
        ptr = ptrseq[iptr]
        sample = df %>% train_test_split(!!var, ptr, propv)
        
        train = df[sample,] %>% select(-!!var)
        test = df[-sample,] %>% select(-!!var)
        cl = df[sample,] %>% pull(!!var)
        ref = df[-sample,] %>% pull(!!var)
        pred = knn(train, test, cl, kstart)
        cm = confusionMatrix(as.factor(pred), as.factor(ref), positive = positive)
        samles[[samplerow]] = sample
        Acc[samplerow] = cm$overall["Accuracy"]
      }
    }
    
    #Wybór najlepszego zbioru sample
    isample = Acc %>% 
      as_tibble() %>% 
      mutate(
        isample = 1:nrow(.),
        dmedian = abs(value - median(value))
      ) %>% 
      filter(dmedian == min(dmedian)) %>% 
      pull(isample) %>% 
      sample(1)
    
    #Tuning k dla najlepszego podzbioru trening-test
    sample = samles[[isample]] 
    train = df[sample,] %>% select(-!!var)
    test = df[-sample,] %>% select(-!!var)
    cl = df[sample,] %>% pull(!!var)
    ref = df[-sample,] %>% pull(!!var)
    
    for(iknn in 1:nknn){
      for(ik in seq_along(kseq)){
        row = row + 1
        k = kseq[ik]
        pred = knn(train, test, cl, k)
        cm = confusionMatrix(as.factor(pred), as.factor(ref), positive = positive)
        out[row,] = c(i, isample, ptr, iknn, k, cm$overall, cm$byClass)
      }
    }
  }
  dfout = out %>% as_tibble()
  attributes(dfout)$param = list(
    df = deparse(substitute(df)),
    var = quo_name(var),
    n = n,
    ptrseq = ptrseq,
    propv = propv,
    nsample = nsample,
    kstart = kstart,
    kseq = kseq,
    nknn = nknn,
    positive = positive)
  dfout
}

Zobaczmy jaki przyniesie to efekt. Cały algorytm uruchomię czterokrotnie (n=4). W każdym głównym przebiegu iteracyjnym zbiór danych zostanie podzielony pięćdziesiąt jeden razy (nsample = 51) przy podziale 7:3 (ptrseq = 0.7). Dla każdej z uzyskanych w ten sposób par trening-test wyliczona zostanie dokładność predykcji a następie wybrana zostanie ta para dla której wartość Accuracy będzie najbardziej zbliżona do mediany wszystkich dokładności. Jeżeli dla kilku par uzyskana zostanie dokładnie taka sama wartość Accuracy, to konkretna para zostanie wylosowana spośród nich. Następnie dla tak wyznaczonej pary trening-test dziesięciokrotnie (nknn = 10) uruchomiony będzie proces tuningu parametru parametru k, którego optymalna wartość będzie poszukiwana wśród nieparzystych wartości z zakresu 1:49.

set.seed(123)
df = knn_tiuning_power(cukrzyca, Outcome, n=4, nsample = 51, ptrseq = 0.7,
                       kstart = 15, kseq = seq(1, 49, 2), nknn = 10)
df %>% tiuning_plot_acc_k()

df %>% tiuning_plot_byClassk_k()

Jak można zauważyć, ścieżki optymalizacyjne pokrywają się już znacznie lepiej, chociaż nadal ich kształt charakteryzuje się licznymi lokalnymi ekstremami. Trudno także jest wskazać jednoznaczne, optymalne k. Decyzję o jego wyborze należało by chyba pozostawić do wizualnej oceny eksperymentatora. Wydaje się jednak, że bardziej istotny od właściwego doboru parametru k będzie wybór odpowiedniej pary trening-test.

Dodatek

Niniejszy dodatek zawiera cały kod funkcji przygotowujących wykresy używane w tym projekcie. Funkcje te zostały zebrane w osobnym skrypcie który jest ładowany na początku projektu. Tu jedynie przedstawiam kod.

stat_summ = function(df, var, na.rm = TRUE){
  df %>% summarise(
    n = n(),
    min = min(!!enquo(var), na.rm = na.rm),
    q1 = quantile(!!enquo(var), .25, na.rm = na.rm),
    median = median(!!enquo(var), na.rm = na.rm),
    mean = mean(!!enquo(var), na.rm = na.rm),
    q3 = quantile(!!enquo(var), .75, na.rm = na.rm),
    max = max(!!enquo(var), na.rm = na.rm),
    sd = sd(!!enquo(var), na.rm = na.rm),
    .groups = "keep"
  )
}

subtitleParam = function(df){
  seq_str = function(pseq){
    if(length(pseq)==1) return(pseq)
    if(length(pseq)>1 & length(pseq)<=4)
      return(paste0("[", paste(pseq, collapse = ", "), "]"))
    if(length(pseq)>4)
      return(paste0("[", paste(pseq[c(1,2,3)], collapse = ", "), ", ...]"))
  }

  param = attributes(df)$param
  paste0(
    "Dane: ", param$df,
    ", Zmienna: ", param$var,
    ", n: ", param$n,
    ", nsample: ", param$nsample,
    ", ptrseq: ", param$ptrseq |> seq_str(),
    ", propv: ", param$propv,
    ", nknn: ", param$nknn,
    ", kseq: ", param$kseq |> seq_str(),
    ", positive: ", param$positive)
}


tiuning_plot_acc_k = function(df, addlab=TRUE, klab=c()){
  df1 = df %>%
    select(i, iknn, k, Accuracy) %>%
    mutate(i = i |> as.factor()) %>%
    group_by(i, k) %>%
    stat_summ(Accuracy)

  df2 = df %>%
    select(i, iknn, k, Accuracy) %>%
    mutate(i = i |> as.factor()) %>%
    group_by(i, iknn) %>%
    mutate(MaxAcc = max(Accuracy)==Accuracy) %>%
    filter(MaxAcc) %>%
    ungroup() %>%
    distinct(i, k, Accuracy)

  df3 = df1 %>%
    filter(k %in% klab) %>%
    select(i, k, min, q1, median, q3, max) %>%
    pivot_longer(!c(i, k))

  p = df1 %>%
    ggplot(aes(k, median, color = i, fill = i), df1)+
    geom_line(size=1, alpha = .8)+
    geom_line(aes(y=min), linetype =2, alpha = .6)+
    geom_line(aes(y=max), linetype =2, alpha = .6)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .2)+
    geom_point(aes(k, Accuracy), df2, size=2, shape = 23, color = "black")

  if(addlab) p = p +
    geom_text_repel(aes(k, Accuracy, label = k), df2, size = 3)
  if(length(klab)>0) p = p +
    geom_point(aes(k, value), df3, size=3, shape = 21, color = "black")+
    geom_label_repel(aes(k, value, label = name), df3, size = 4, color="black", alpha=.8, direction="x")

  if(attributes(df)$param$n == 1){
    p = p + theme(legend.position="none")
  }

  p = ggpar(
    p,
    title = "Przebieg procesu tuning parametru k dla maksymalnej dokładności",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    ylab = "Accuracy",
    palette = "jco")
  p
}

tiuning_plot_byClassk_k = function(
  df, byClass = vars("Sensitivity", "Specificity", "Precision", "Recall")){

  df1 = df %>%
    select(i, iknn, k, !!!(byClass)) %>%
    mutate(i = i |> as.factor()) %>%
    pivot_longer(!c(i, iknn, k)) %>%
    group_by(i, k, name) %>%
    stat_summ(value)

  df2 = df %>%
    select(i, iknn, k, Accuracy) %>%
    mutate(i = i |> as.factor()) %>%
    group_by(i, iknn) %>%
    mutate(MaxAcc = max(Accuracy)==Accuracy) %>%
    filter(MaxAcc) %>%
    distinct(i, k, Accuracy)

  df3 = df1 %>% left_join(df2, by = c("i", "k")) %>%
    na.omit()

  p = df1 %>%
    ggplot(aes(k, median, color = i, fill = i), df1)+
    geom_line(size=1, alpha = .8)+
    geom_line(aes(y=min), linetype =2, alpha = .6)+
    geom_line(aes(y=max), linetype =2, alpha = .6)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .2)+
    geom_point(data=df3, size=2, shape = 23, color = "black")+
    facet_wrap(vars(name), scales="free")+
    theme(axis.title.y = element_blank())

  if(attributes(df)$param$n == 1){
    p = p + theme(legend.position="none")
  }

  p = ggpar(
    p,
    title = "Przebieg procesu tuning parametru k dla wybranych parametrów",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    palette = "jco")
  p
}

tiuning_plot_acc_iknn = function(df){
  df1 = df %>%
    select(i, iknn, k, Accuracy) %>%
    mutate(i = i |> as.factor()) %>%
    group_by(i, iknn) %>%
    stat_summ(Accuracy)

  p = df1 %>%
    ggplot(aes(iknn, median, color = i, fill = i), df1)+
    geom_line(size=1, alpha = .8)+
    geom_line(aes(y=min), linetype =2, alpha = .6)+
    geom_line(aes(y=max), linetype =2, alpha = .6)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .2)

  p = ggpar(
    p,
    title = "Przebieg procesu tuning parametru k dla maksymalnej dokładności",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    ylab = "Accuracy",
    palette = "jco")
  p
}

tiuning_plot_byClassk_iknn = function(df, byClass = vars("Sensitivity", "Specificity", "Precision", "Recall")){
  df1 = df %>%
    select(i, iknn, k, !!!(byClass)) %>%
    mutate(i = i |> as.factor()) %>%
    pivot_longer(!c(i, iknn, k)) %>%
    group_by(i, iknn, name) %>%
    stat_summ(value)

  p = df1 %>%
    ggplot(aes(iknn, median, color = i, fill = i), df1)+
    geom_line(size=1, alpha = .8)+
    geom_line(aes(y=min), linetype =2, alpha = .6)+
    geom_line(aes(y=max), linetype =2, alpha = .6)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .2)+
    facet_wrap(vars(name), scales="free")+
    theme(axis.title.y = element_blank(),
          legend.position="none")

  p = ggpar(
    p,
    title = "Przebieg procesu tuning parametru k dla wybranych parametrów",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    palette = "jco")
  p
}

tiuning_plot_acc_ptr = function(df){
  df1 = df %>%
    select(i, isample, ptr, Accuracy) %>%
    mutate(i = i |> as.factor()) %>%
    group_by(i, ptr) %>%
    stat_summ(Accuracy)

  p = df1 %>%
    ggplot(aes(ptr, median, color = i, fill = i), df1)+
    geom_line(size=1, alpha = .8)+
    geom_line(aes(y=min), linetype =2, alpha = .6)+
    geom_line(aes(y=max), linetype =2, alpha = .6)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .2)


  p = ggpar(
    p,
    title = "Wpływ podziału zbioru danych na podzbiory test i trening na dokładność",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    ylab = "Accuracy",
    palette = "jco")
  p
}

tiuning_plot_byClassk_ptr = function(df, byClass = vars("Sensitivity", "Specificity", "Precision", "Recall")){
  df1 = df %>%
    select(i, isample, ptr, !!!(byClass)) %>%
    mutate(i = i |> as.factor()) %>%
    pivot_longer(!c(i, isample, ptr)) %>%
    group_by(i, ptr, name) %>%
    stat_summ(value)

  p = df1 %>%
    ggplot(aes(ptr, median, color = i, fill = i), df1)+
    geom_line(size=1)+
    geom_line(aes(y=min), linetype =2)+
    geom_line(aes(y=max), linetype =2)+
    geom_ribbon(aes(ymin = q1, ymax = q3), alpha = .4)+
    facet_wrap(vars(name), scales="free")+
    theme(axis.title.y = element_blank(),
          legend.position="none")

  p = ggpar(
    p,
    title = "Wpływ podziału zbioru danych na podzbiory test i trening dla wybranych parametrów",
    subtitle = subtitleParam(df),
    caption = "M. Fiołka",
    palette = "jco")
  p
}