Supongamos que tengo cuatro formas básicas de señal (azul, morado, rojo, verde). También he creado formas de transición entre ellas. Si observas detenidamente la imagen de abajo, puedes ver que por ejemplo la señal azul (A1) se transforma lentamente en morado (A5) - horizontalmente, o en rojo (E1) - verticalmente. En general, cuanto más cercana sea la diferencia entre dos señales, más similares son.
**
Estoy buscando algún método/algoritmo/técnica que sea capaz de:
- Extraer la mayor cantidad de información posible sobre la complejidad de las señales
- Mapear las señales en 2D (o 3D) de acuerdo a su similitud
Enlace a los datos fuente: cada señal está codificada en una imagen JPG (25 archivos jpg, cada uno de 100x180 píxeles) https://www.dropbox.com/sh/ynidcsjdymrh85f/AAAHVtYSG0GUvX3CEdDWWG42a
He pasado algún tiempo intentando resolver este problema, así que aquí agrego mi enfoque, que no produce el resultado deseado:
En primer lugar, he establecido el directorio de trabajo, he cargado todos los 25 archivos jpg a una lista de R...
setwd("añadir directorio donde descargaste los archivos jpg aquí")
# librerías requeridas
library(jpeg)
library(raster)
library(asbio)
sgnl.vctr<-c("A1.jpg","A2.jpg","A3.jpg","A4.jpg","A5.jpg",
"B1.jpg","B2.jpg","B3.jpg","B4.jpg","B5.jpg",
"C1.jpg","C2.jpg","C3.jpg","C4.jpg","C5.jpg",
"D1.jpg","D2.jpg","D3.jpg","D4.jpg","D5.jpg",
"E1.jpg","E2.jpg","E3.jpg","E4.jpg","E5.jpg")
sgnl.list <- list() # sgnl.list contiene todas las 25 señales
for (i in 1:length(sgnl.vctr)){
sgnl.list[[i]] <- readJPEG(sgnl.vctr[i])
}
Experimenté problemas con los valores de píxeles (rango de 0 a 1), por lo tanto los reclasifiqué en binarios (0 o 1).
# reclasificación de valores
for (i in 1:25) {
sgnl.list[[i]][1:100,1:180,1][sgnl.list[[i]][1:100,1:180,1] > 0.5]<- 2
sgnl.list[[i]][1:100,1:180,1][sgnl.list[[i]][1:100,1:180,1] <= 0.5]<- 1
sgnl.list[[i]][1:100,1:180,1][sgnl.list[[i]][1:100,1:180,1] == 2]<- 0
}
Luego, extraje vectores binarios (0-1) de cada archivo jpeg. Si alguien sabe cómo acortar el procedimiento abajo, por favor edite el código R.
# Fila A
A1<-as.vector(sgnl.list[[1]][1:100,1:180,1])
A2<-as.vector(sgnl.list[[2]][1:100,1:180,1])
A3<-as.vector(sgnl.list[[3]][1:100,1:180,1])
A4<-as.vector(sgnl.list[[4]][1:100,1:180,1])
A5<-as.vector(sgnl.list[[5]][1:100,1:180,1])
# Fila B
B1<-as.vector(sgnl.list[[6]][1:100,1:180,1])
B2<-as.vector(sgnl.list[[7]][1:100,1:180,1])
B3<-as.vector(sgnl.list[[8]][1:100,1:180,1])
B4<-as.vector(sgnl.list[[9]][1:100,1:180,1])
B5<-as.vector(sgnl.list[[10]][1:100,1:180,1])
# Fila C
C1<-as.vector(sgnl.list[[11]][1:100,1:180,1])
C2<-as.vector(sgnl.list[[12]][1:100,1:180,1])
C3<-as.vector(sgnl.list[[13]][1:100,1:180,1])
C4<-as.vector(sgnl.list[[14]][1:100,1:180,1])
C5<-as.vector(sgnl.list[[15]][1:100,1:180,1])
# Fila D
D1<-as.vector(sgnl.list[[16]][1:100,1:180,1])
D2<-as.vector(sgnl.list[[17]][1:100,1:180,1])
D3<-as.vector(sgnl.list[[18]][1:100,1:180,1])
D4<-as.vector(sgnl.list[[19]][1:100,1:180,1])
D5<-as.vector(sgnl.list[[20]][1:100,1:180,1])
# Fila E
E1<-as.vector(sgnl.list[[21]][1:100,1:180,1])
E2<-as.vector(sgnl.list[[22]][1:100,1:180,1])
E3<-as.vector(sgnl.list[[23]][1:100,1:180,1])
E4<-as.vector(sgnl.list[[24]][1:100,1:180,1])
E5<-as.vector(sgnl.list[[25]][1:100,1:180,1])
Los vectores fueron comparados con la función Kappa
para obtener el valor total de acuerdo. Ver este enlace: https://stackoverflow.com/questions/24534192/how-to-compare-all-possible-combinations-of-objects-in-r-by-loop/24534794#comment37992299_24534794 (Muchas gracias a @digEmAll)
# bucle de:
# Kappa(sgnl.list[[1]][1:100,1:180,1],
# sgnl.list[[2]][1:100,1:180,1])$ttl_agreement
M <- rbind(A1,A2,A3,A4,A5,
B1,B2,B3,B4,B5,
C1,C2,C3,C4,C5,
D1,D2,D3,D4,D5,
E1,E2,E3,E4,E5)
res <- outer(1:nrow(M),
1:nrow(M),
FUN=function(i,j){
# i y j son 2 vectores de la misma longitud que contienen
# las combinaciones de los índices de las filas.
# por ejemplo (i[1] = 1, j[1] = 1) (i[2] = 1, j[2] = 2)) etc...
sapply(1:length(i),
FUN=function(x) Kappa(M[i[x],],M[j[x],])$ttl_agreement )
})
row.names(res) <- c("A1","A2","A3","A4","A5",
"B1","B2","B3","B4","B5",
"C1","C2","C3","C4","C5",
"D1","D2","D3","D4","D5",
"E1","E2","E3","E4","E5")
colnames(res) <- c("A1","A2","A3","A4","A5",
"B1","B2","B3","B4","B5",
"C1","C2","C3","C4","C5",
"D1","D2","D3","D4","D5",
"E1","E2","E3","E4","E5")
Finalmente, la matriz de similitud (objeto res
) se utilizó para escalamiento multidimensional...
# mds basado en la matriz ttl_agreement
d <- as.dist(res)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")
Sin embargo, como puedes ver (gráfico de la izquierda), las cuatro señales básicas no se separaron como esperaba. ¿Alguien conoce una mejor solución que conduzca al resultado deseado (gráfico de la derecha)?
**