Este es un hilo relativamente antiguo, pero recientemente encontré este problema en mi trabajo y me topé con esta discusión. La pregunta ha sido respondida pero siento que no se ha abordado el peligro de normalizar las filas cuando no es la unidad de análisis (ver la respuesta de @ DJohnson arriba).
El punto principal es que la normalización de filas puede ser perjudicial para cualquier análisis posterior, como el vecino más cercano o k-means. Por simplicidad, mantendré la respuesta específica para centrar la media en las filas.
Para ilustrarlo, utilizaré datos gaussianos simulados en las esquinas de un hipercubo. Afortunadamente, R
hay una función conveniente para eso (el código está al final de la respuesta). En el caso 2D, es sencillo que los datos centrados en la fila media caigan en una línea que pasa por el origen a 135 grados. Los datos simulados se agrupan utilizando k-means con el número correcto de grupos. Los datos y los resultados de la agrupación (visualizados en 2D utilizando PCA en los datos originales) se ven así (los ejes para el gráfico de la izquierda son diferentes). Las diferentes formas de los puntos en las gráficas de agrupación se refieren a la asignación de agrupación de verdad fundamental y los colores son el resultado de la agrupación de k-medias.
Los grupos superior izquierdo e inferior derecho se reducen a la mitad cuando los datos se centran en la fila de la media. Por lo tanto, las distancias después del centrado de la fila media se distorsionan y no son muy significativas (al menos basadas en el conocimiento de los datos).
No es tan sorprendente en 2D, ¿y si usamos más dimensiones? Esto es lo que sucede con los datos 3D. La solución de agrupamiento después de centrar la fila media es "mala".
Y similar con los datos 4D (ahora se muestra por brevedad).
¿Por qué está pasando esto? El centrado de la media de la fila empuja los datos a un espacio donde algunas características se acercan más de lo que están. Esto debería reflejarse en la correlación entre las características. Veamos eso (primero en los datos originales y luego en los datos centrados en la media de la fila para casos 2D y 3D).
[,1] [,2]
[1,] 1.000 -0.001
[2,] -0.001 1.000
[,1] [,2]
[1,] 1 -1
[2,] -1 1
[,1] [,2] [,3]
[1,] 1.000 -0.001 0.002
[2,] -0.001 1.000 0.003
[3,] 0.002 0.003 1.000
[,1] [,2] [,3]
[1,] 1.000 -0.504 -0.501
[2,] -0.504 1.000 -0.495
[3,] -0.501 -0.495 1.000
Por lo tanto, parece que el centrado de la fila media está introduciendo correlaciones entre las características. ¿Cómo se ve afectado esto por la cantidad de características? Podemos hacer una simulación simple para resolver eso. El resultado de la simulación se muestra a continuación (nuevamente el código al final).
Entonces, a medida que aumenta el número de características, el efecto del centrado de la fila media parece disminuir, al menos en términos de las correlaciones introducidas. Pero solo usamos datos aleatorios distribuidos uniformemente para esta simulación (como es común cuando se estudia la maldición de la dimensionalidad ).
Entonces, ¿qué sucede cuando usamos datos reales? Como muchas veces la dimensionalidad intrínseca de los datos es menor, la maldición podría no aplicarse . En tal caso, supongo que el centrado medio de fila podría ser una "mala" elección como se muestra arriba. Por supuesto, se necesita un análisis más riguroso para hacer cualquier afirmación definitiva.
Código para la simulación de agrupamiento
palette(rainbow(10))
set.seed(1024)
require(mlbench)
N <- 5000
for(D in 2:4) {
X <- mlbench.hypercube(N, d=D)
sh <- as.numeric(X$classes)
K <- length(unique(sh))
X <- X$x
Xc <- sweep(X,2,apply(X,2,mean),"-")
Xr <- sweep(X,1,apply(X,1,mean),"-")
show(round(cor(X),3))
show(round(cor(Xr),3))
par(mfrow=c(1,1))
k <- kmeans(X,K,iter.max = 1000, nstart = 10)
kc <- kmeans(Xc,K,iter.max = 1000, nstart = 10)
kr <- kmeans(Xr,K,iter.max = 1000, nstart = 10)
pc <- prcomp(X)
par(mfrow=c(1,4))
lim <- c(min(min(X),min(Xr),min(Xc)), max(max(X),max(Xr),max(Xc)))
plot(X[,1], X[,2], xlim=lim, ylim=lim, xlab="Feature 1", ylab="Feature 2",main="Data",col=1,pch=1)
points(Xc[,1], Xc[,2], col=2,pch=2)
points(Xr[,1], Xr[,2], col=3,pch=3)
legend("topleft",legend=c("Original","Center-cols","Center-rows"),col=c(1,2,3),pch=c(1,2,3))
abline(h=0,v=0,lty=3)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[k$cluster], xlab="PC 1", ylab="PC 2", main="Cluster original", pch=sh)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[kc$cluster], xlab="PC 1", ylab="PC 2", main="Cluster center-col", pch=sh)
plot(pc$x[,1], pc$x[,2], col=rainbow(K)[kr$cluster], xlab="PC 1", ylab="PC 2", main="Cluster center-row", pch=sh)
}
Código para aumentar la simulación de características
set.seed(2048)
N <- 1000
Cmax <- c()
Crmax <- c()
for(D in 2:100) {
X <- matrix(runif(N*D), nrow=N)
C <- abs(cor(X))
diag(C) <- NA
Cmax <- c(Cmax, max(C, na.rm=TRUE))
Xr <- sweep(X,1,apply(X,1,mean),"-")
Cr <- abs(cor(Xr))
diag(Cr) <- NA
Crmax <- c(Crmax, max(Cr, na.rm=TRUE))
}
par(mfrow=c(1,1))
plot(Cmax, ylim=c(0,1), ylab="Max. cor.", xlab="#Features",col=1,pch=1)
points(Crmax, ylim=c(0,1), col=2, pch=2)
legend("topright", legend=c("Original","Center-row"),pch=1:2,col=1:2)
EDITAR
Después de buscar en Google en esta página, las simulaciones muestran un comportamiento similar y propone que la correlación introducida por el centro de la fila media sea .- 1 / ( p - 1 )