Esse é um tópico relativamente antigo, mas recentemente encontrei esse problema no meu trabalho e me deparei com essa discussão. A pergunta foi respondida, mas sinto que o perigo de normalizar as linhas quando não é a unidade de análise (consulte a resposta de @ DJohnson acima) não foi abordado.
O ponto principal é que a normalização de linhas pode ser prejudicial para qualquer análise subsequente, como o vizinho mais próximo ou o k-médias. Para simplificar, manterei a resposta específica para centralizar as linhas nas médias.
Para ilustrar, usarei dados Gaussianos simulados nos cantos de um hipercubo. Felizmente, R
existe uma função conveniente para isso (o código está no final da resposta). No caso 2D, é simples que os dados centralizados na média da linha caiam em uma linha que passa pela origem a 135 graus. Os dados simulados são então agrupados usando k-means com número correto de clusters. Os dados e os resultados do cluster (visualizados em 2D usando PCA nos dados originais) são assim (os eixos para o gráfico mais à esquerda são diferentes). As diferentes formas dos pontos nas plotagens de agrupamento referem-se à atribuição de agrupamento terra-verdade e as cores são o resultado do agrupamento k-means.
Os clusters superior esquerdo e inferior direito são cortados ao meio quando os dados são centralizados na média da linha. Portanto, as distâncias após a centralização da média da linha ficam distorcidas e não são muito significativas (pelo menos com base no conhecimento dos dados).
Não é tão surpreendente em 2D, e se usarmos mais dimensões? Aqui está o que acontece com os dados 3D. A solução de cluster após a centralização da média das linhas é "ruim".
E semelhante aos dados 4D (agora mostrados por questões de concisão).
Por que isso está acontecendo? A centralização da média da linha empurra os dados para algum espaço em que alguns recursos se aproximam mais do que estão. Isso deve se refletir na correlação entre os recursos. Vejamos isso (primeiro nos dados originais e depois nos dados centralizados na média da linha para casos 2D e 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
Portanto, parece que a centralização da média de linhas está introduzindo correlações entre os recursos. Como isso é afetado pelo número de recursos? Podemos fazer uma simulação simples para descobrir isso. O resultado da simulação é mostrado abaixo (novamente o código no final).
Assim, à medida que o número de recursos aumenta, o efeito da centralização média da linha parece diminuir, pelo menos em termos das correlações introduzidas. Mas apenas usamos dados aleatórios distribuídos uniformemente para esta simulação (como é comum ao estudar a maldição da dimensionalidade ).
Então, o que acontece quando usamos dados reais? Quantas vezes a dimensionalidade intrínseca dos dados é menor, a maldição pode não se aplicar . Nesse caso, eu acho que a centralização da média de linhas pode ser uma escolha "ruim", como mostrado acima. Obviamente, é necessária uma análise mais rigorosa para fazer reivindicações definitivas.
Código para simulação de cluster
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 a simulação de recursos
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
−1/(p−1)