Qual é o objetivo da normalização de linha


12

Entendo o raciocínio por trás da normalização de colunas, pois faz com que os recursos sejam ponderados igualmente, mesmo que não sejam medidos na mesma escala - no entanto, geralmente na literatura do vizinho mais próximo, colunas e linhas são normalizadas. Qual é a normalização de linha / por que normalizar linhas? Especificamente, como o resultado da normalização de linha afeta a semelhança / distância entre os vetores de linha?


você pode citar a literatura que normaliza as linhas? Percebo que esta é uma discussão relativamente antiga, mas recentemente me deparei com uma questão semelhante e estou tentando descobrir as diferenças. Vou postar minha opinião sobre isso como resposta.
precisa saber é o seguinte

Respostas:


4

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, Rexiste 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.

insira a descrição da imagem aqui

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".

insira a descrição da imagem aqui

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).

insira a descrição da imagem aqui

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/(p1)


5

Existem várias formas de normalização de linha e o OP não está indicando qual ele / ela tem em mente.

Uma forma específica de normalização de linha (normalização da norma euclediana) em que cada linha é normatizada (dividida por sua norma euclediana) é bastante popular.

3.2

xxp

(0)r(xx)=||xx||21xx

p>1p

Por exemplo, se seus dados originais estiverem centralizados (como os pontos pretos nesta imagem) e você aplicar a normalização de linha, obterá as estrelas vermelhas.

library(car)
p = 2
n = 1000
m = 10
C = matrix(.9, p, p)
diag(C) = 1
set.seed(123)
x = matrix(runif(n * p, -1, 1), n, p) %*% chol(C)
z = sweep(x, 1, sqrt(rowSums(x * x)), FUN = '/')
plot(rbind(x, z), pch = 16, type = 'n', ann = FALSE, xaxt = 'n', yaxt = 'n')
points(x, pch = 16)
points(z, pch = 8, col = 'red')

Os pontos verdes representam um pequeno número de valores discrepantes nos dados originais. Se você aplicar a transformação de normalização de linha a eles, obterá as estrelas azuis.

x_1 = sweep(matrix(runif(m * p, -1, 1), m, p), 2, c(2, -2))
z_1 = sweep(x_1, 1, sqrt(rowSums(x_1 * x_1)), FUN = '/')
plot(rbind(x, x_1, z, z_1), pch = 16, type = 'n', ann = FALSE, xaxt = 'n', yaxt = 'n')
points(x, pch = 16)
points(x_1, pch = 16, col = 'green')
points(z, pch = 8, col = 'red')
points(z_1, pch = 8, col = 'blue')

insira a descrição da imagem aqui

xFx

z

Você pode ver isso mais claramente comparando as matrizes de forma (ou elipses de contorno) ajustadas, por sua vez, aos dados, sua versão contaminada e a transformação normalizada das linhas:

ellipse(crossprod(rbind(x, x_1)) / (n + m - 1) / det(crossprod(rbind(x, x_1)) / (n + m - 1))^(1 / p), center = rep(0, p), col = 'green', radius = 1)
ellipse(crossprod(rbind(z, z_1)) / (n + m - 1) / det(crossprod(rbind(z, z_1)) / (n + m - 1))^(1 / p), center = rep(0, p), col = 'red', radius = 1)
ellipse(crossprod(rbind(x)) / (n - 1) / det(crossprod(rbind(x)) / (n - 1))^(1 / p), center = rep(0, p), col = 'black', radius = 1)

zx

  • S. Visuri, V. Koivunen, H. Oja (2000). Assinar e classificar matrizes de covariância, Journal of Statistical Planning and Inference Volume 91, Edição 2, 557-575.

4

Existem alguns motivos específicos de campo para executar a normalização de linha. Na análise de texto, é bastante comum representar um texto com o histograma das palavras que ele contém. A partir da contagem de palavras para cada linha, a padronização bruta a transforma em um histograma.

E a razão computacional . Se você estiver trabalhando com uma matriz esparsa, não poderá centralizar e dimensionar os dados coluna por coluna facilmente. Se você incorporá-lo em uma matriz densa, os dados podem se tornar muito grandes para caber na memória. No entanto, o dimensionamento de linha por linha não afeta a quantidade total de memória necessária.


Pelo motivo computacional, você está dizendo que apenas assumimos a transposição e a linha normalizamos isso devido à maneira como as matrizes esparsas são representadas? Estou perguntando mais sobre como a normalização de linha afeta os resultados dos vizinhos mais próximos na prática.
Curiosidades_delivers

3

A normalização de linha tem um nome - escala ipsativa - que normalmente envolve o redimensionamento de um conjunto de recursos, dividindo pelo valor máximo do conjunto ou subtraindo a média dos recursos. Existem muitas motivações para escolher essa abordagem para transformar dados, mas a principal delas é que ela condiciona os recursos em relação às características únicas do indivíduo (a linha ou unidade de análise).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.