-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathclusteringAll.R
79 lines (59 loc) · 2.54 KB
/
clusteringAll.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
source("DetectOutliers.R")
source("optimalClustering.R")
source("conceptDrift.R")
source("forecasting.R")
my_knn <- function(data, query) {
as.integer(which.min(as.matrix(dist(rbind(data, query)))[nrow(data)+1,-(nrow(data)+1)]))
}
check.matrix <- function(mat) {
if(is.matrix(mat) == TRUE){
return(mat)
} else
return(as.matrix(mat))
}
check.matrix2 <- function(mat) {
if(is.matrix(mat) == TRUE){
return(mat)
} else
return(t(as.matrix(mat)))
}
clusterAll <- function(data, k_low, k_high, outlier_tresh, ncores = detectCores()-1, freq = 48){
clip_oom <- repr_matrix(data, func = repr_feaclip,
windowing = T, win_size = freq)
# detect outliers
outliers <- detectOutliersIQR(clip_oom, treshold = outlier_tresh)
# clustering
clip_filtered <- clip_oom[-outliers$outliers,]
clus_res <- clusterOptimKmedoidsDB(clip_filtered, k_low, k_high, ncores, criterium = "Davies_Bouldin")
clustering <- outliers$class
clustering[which(clustering == 1)] <- clus_res$clustering
# Assign outliers to clusters (to nearest medoid)
out_clust <- sapply(seq_along(outliers$outliers),
function(z) my_knn(clus_res$medoids, as.numeric(clip_oom[outliers$outliers[z],])))
clustering[which(clustering == 0)] <- out_clust
# Aggregating clusters
final_ts_sums <- t(sapply(unique(clustering), function(x) colSums(check.matrix(data[clustering == x,]))))
return(list(final_ts = final_ts_sums,
outliers = outliers$class,
clustering = clustering,
representation = clip_oom))
}
clusterRepr <- function(data, data_rep, k_low, k_high, outlier_tresh, alpha, ncores = 4){
# detect outliers
outliers <- detectOutliersIQR(data_rep, treshold = outlier_tresh)
# clustering
clip_filtered <- data_rep[-outliers$outliers,]
clus_res <- clusterOptimKmedoidsDB(clip_filtered, k_low, k_high, ncores, criterium = "Davies_Bouldin")
clustering <- outliers$class
clustering[which(clustering == 1)] <- clus_res$clustering
# Assign outliers to clusters (to nearest medoid)
out_clust <- sapply(seq_along(outliers$outliers),
function(z) my_knn(clus_res$medoids, as.numeric(data_rep[outliers$outliers[z],])))
clustering[which(clustering == 0)] <- out_clust
# table(clustering)
# Aggregating clusters
final_ts_sums <- t(sapply(unique(clustering), function(x) colSums(check.matrix(data[clustering == x,]))))
return(list(final_ts = final_ts_sums,
outliers = outliers$class,
clustering = clustering))
}