summaryrefslogtreecommitdiff
path: root/analysis/knn.R
blob: 729f3322fffaf65083f832004a08ec2e4faf55d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
library("tidyverse")
library("class")
library("rpart")
library("rpart.plot")
library("viridis")

## Simulation Parameters:
## simkey         {baseline,extended,hint,hintandextended}
## wireless       {lora,nbiot}
## wakeupfor      {60s,180s}
## seed           [1,200]
## node           on[0,12]
## isSender       {0,1}
## dataSize       {1MB}

## Metrics:
## energy         [0,+inf)
## nDataRcv       [0,+inf)

nseed=200
nwakeupfor=2
nwireless=2
nsimkey=4
nsimulations=nseed*nwakeupfor*nwireless*nsimkey # Must be 3200

## Load data
data=read_csv("../CCGRID2022.csv")%>%distinct() # Note that in the data experiment wireless=="lora",seed==1,wakeupfor==60,simkey=="baseline" is present 2 times in the CSV file
tmp_data_coverage=data%>%group_by(simkey,wireless,wakeupfor,seed)%>%mutate(coverage=sum(nDataRcv))%>%ungroup()%>%filter(isSender==1)%>%select(simkey,wireless,wakeupfor,seed,coverage)
data_seed_isSender=data%>%group_by(simkey,wireless,wakeupfor,seed,isSender)%>%summarize(energy_mean=mean(energy))%>%
    left_join(tmp_data_coverage,by=c("simkey","wireless","wakeupfor","seed"))%>%
    mutate(efficiency=energy_mean/coverage)%>%
    ungroup()
data_seed=data%>%group_by(simkey,wireless,wakeupfor,seed)%>%summarize(energy=sum(energy),coverage=sum(nDataRcv))%>%
    mutate(efficiency=energy/coverage)%>%
    ungroup()


## Prepare data for traning
set.seed(1) # Reproducibility
data_seed=data_seed%>%select(-efficiency,-seed)%>%mutate(wireless=as.numeric(as.factor(data_seed$wireless)))#%>%filter(simkey!="hint")
train_set=data_seed%>%sample_frac(0.8)     # 80% of the data
test_set=data_seed%>%anti_join(train_set)  # 20% of the data

## KNN training
knn_predictions=knn(train=train_set%>%select(-simkey),test=test_set%>%select(-simkey),cl=train_set$simkey,k=10)
## KNN analysis
knn_cont_table=table(knn_predictions,test_set$simkey)
knn_accuracy=round((sum(diag(knn_cont_table)/sum(rowSums(knn_cont_table))))*100)
knn_prop_table=round(prop.table(knn_cont_table),digits=2)

## Decision tree
tree=rpart(
    simkey ~ wireless + wakeupfor + energy + coverage,
    data=train_set,
    method="class",
    minsplit=60,
    minbucket=1)
tree_predictions=predict(tree,newdata=test_set%>%select(-simkey),type="class")
tree_cont_table=table(tree_predictions,test_set$simkey)
tree_accuracy=round((sum(diag(tree_cont_table)/sum(rowSums(tree_cont_table))))*100)
tree_prop_table=round(prop.table(tree_cont_table),digits=2)

## Prints
print(paste0("Accuracy: KNN=",knn_accuracy,"% CART=",tree_accuracy,"%"))
pdf("figures/tree.pdf")
tree_plot=rpart.plot(tree,box.palette=as.list(viridis::viridis(4,begin=0.48)))
silent_call=dev.off()
## Notes: KNN accuracy jump to 76% and CART to 80% accuracy without the hint policy