forked from okuspokus/medidas_separabilidad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
separabilidad_functions.r
112 lines (91 loc) · 3.06 KB
/
separabilidad_functions.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# Defino las funciones:
bhattacharyya <- function(muestra1, muestra2) {
# Funcion para calcular la distancia de Bhattacharyya (Richards)
#
# Inputs
# ------
# muestra1 : dataframe donde las columnas son las bandas y las filas las observaciones.
# muestra2 : dataframe donde las columnas son las bandas y las filas las observaciones.
#
#
# Output:
# -------
# bt : distancia de bhattacharyya entre muestra1 y muestra2.
mean1 <- colMeans(muestra1)
mean2 <- colMeans(muestra2)
mean_diff <- mean1 - mean2
cov1 <- cov(muestra1)
cov2 <- cov(muestra2)
cov_ <- (cov1 + cov2)/2
bt <- mean_diff %*% solve(cov_, mean_diff)*(1/8) + (1/2) * log(det( cov_ ) / sqrt(det ( cov1 ) * det( cov2 )))
return(bt[1,1])
}
jeffries_matusita <- function(muestra1, muestra2, sqrt_ = FALSE) {
# Funcion para calcular la distancia de Jeffries Matusita (Richards)
#
#
# Inputs
# ------
# muestra1 : dataframe donde las columnas son las bandas y las filas las observaciones.
# muestra2 : dataframe donde las columnas son las bandas y las filas las observaciones.
# sqrt_ : bool. Por default es FALSE. Si es FALSE no calcula la raiz y si es TRUE calcula la raiz.
#
#
# Output:
# -------
# jm : distancia de jeffries.matusita entre muestra1 y muestra2.
# Richards no le calcula la raiz cuadrada:
if (sqrt_ == TRUE) {
jm <- sqrt(2*(1-exp(-bhattacharyya(muestra1, muestra2))))
}
else {
jm <- 2*(1-exp(-bhattacharyya(muestra1, muestra2)))
}
return(jm)
}
average_distance <- function(muestra1, muestra2){
# Esta funcion calcula el promedio de las distancias euclideas entre las filas de la muestra1 y las de la
# muestra 2. Si los dataframes tienen muchas filas puede tardar.
#
# Inputs
# ------
# muestra1 : dataframe donde las columnas son las bandas y las filas las observaciones.
# muestra2 : dataframe donde las columnas son las bandas y las filas las observaciones.
#
#
# Output:
# -------
# d : calcula la distancia de cada fila de la muestra1 contra cada fila de la muestra2 y luego divide por la cantidad
# de filas (total).
nrows1 <- nrow(muestra1)
nrows2 <- nrow(muestra2)
d <- 0
for(i in 1:nrows1) {
row1 <- muestra1[i,]
for(i in 1:nrows2){
row2 <- muestra2[i,]
d <- d + sqrt(sum((row1 - row2) ^ 2))
}
}
d <- d/(nrow1*nrow2)
return(d)
}
centroid_distance <-function(muestra1, muestra2){
# Esta funcion calcula el promedio de las distancias euclideas entre el vector de medias de muestra1 y
# el vector de medias de la muestra 2.
#
# Inputs
# ------
# muestra1 : dataframe donde las columnas son las bandas y las filas las observaciones.
# muestra2 : dataframe donde las columnas son las bandas y las filas las observaciones.
#
#
# Output:
# -------
# d : calcula la distancia de cada fila de la muestra1 contra cada fila de la muestra2 y luego divide por la cantidad
# de filas (total).
mean1 <- colMeans(muestra1)
mean2 <- colMeans(muestra2)
d <- sqrt(sum((mean1 - mean2) ^ 2))
return(d)
}