Me gustaría hacer un mapa de calor con la fila de clustering basado en coseno distancias. Estoy usando R y heatmap.2()
para hacer la figura. Puedo ver que hay un dist
parámetro en heatmap.2
pero no puedo encontrar una función para generar el coseno de la matriz de disimilitud. El grupo builtin dist
función no admite coseno distancias, también me encontré con un paquete que se llama arules
con un dissimilarity()
funcionando, pero sólo funciona en datos binarios.
Respuestas
¿Demasiados anuncios?Como @Max se indica en los comentarios (+1) sería más sencillo "escribir su propia" de pasar tiempo buscando en otro lugar. Como sabemos, la similitud del coseno entre dos vectores $A,B$ de la longitud de la $n$ es
$$ C = \frac{ \sum \limits_{i=1}^{n}A_{i} B_{i} }{ \sqrt{\sum \limits_{i=1}^{n} A_{i}^2} \cdot \sqrt{\sum \limits_{i=1}^{n} B_{i}^2} } $$
que es muy sencillo generar en R
. Deje X
ser la matriz donde las filas son los valores que queremos para el cálculo de la similitud entre. Entonces podemos calcular la matriz de similitud con los siguientes R
código de:
cos.sim <- function(ix)
{
A = X[ix[1],]
B = X[ix[2],]
return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
}
n <- nrow(X)
cmb <- expand.grid(i=1:n, j=1:n)
C <- matrix(apply(cmb,1,cos.sim),n,n)
A continuación, la matriz C
es la similitud del coseno de la matriz y puede pasar cualquier cosa "mapa de calor" de la función que desee (el único con el que estoy familiarizado con es image()
).
Usted puede utilizar el cosine
función de la lsa paquete:
http://cran.r-project.org/web/packages/lsa
La siguiente función puede ser útil cuando se trabaja con matrices, en lugar de 1-d vectores:
# input: row matrices 'ma' and 'mb' (with compatible dimensions)
# output: cosine similarity matrix
cos.sim=function(ma, mb){
mat=tcrossprod(ma, mb)
t1=sqrt(apply(ma, 1, crossprod))
t2=sqrt(apply(mb, 1, crossprod))
mat / outer(t1,t2)
}