Quel est le but de la normalisation des lignes

12

Je comprends le raisonnement derrière la normalisation des colonnes, car il entraîne une pondération égale des entités, même si elles ne sont pas mesurées sur la même échelle - cependant, souvent dans la littérature du voisin le plus proche, les colonnes et les lignes sont normalisées. Quelle est la normalisation des lignes pour / pourquoi normaliser les lignes? Plus précisément, comment le résultat de la normalisation de ligne affecte-t-il la similitude / distance entre les vecteurs de ligne?

curiosity_delivers
la source
pouvez-vous citer la littérature qui normalise les lignes? Je me rends compte qu'il s'agit d'une discussion relativement ancienne, mais j'ai récemment rencontré un problème similaire et j'essaie de découvrir les différences. Je posterai mon point de vue à ce sujet comme réponse.
DataD'oh

Réponses:

4

Il s'agit d'un fil relativement ancien, mais j'ai récemment rencontré ce problème dans mon travail et suis tombé sur cette discussion. La question a été répondue, mais je pense que le danger de normaliser les lignes quand ce n'est pas l'unité d'analyse (voir la réponse de @ DJohnson ci-dessus) n'a pas été abordé.

Le point principal est que la normalisation des lignes peut être préjudiciable à toute analyse ultérieure, comme le plus proche voisin ou k-means. Par souci de simplicité, je garderai la réponse spécifique au centrage moyen des lignes.

Pour l'illustrer, j'utiliserai des données gaussiennes simulées aux coins d'un hypercube. Heureusement, Ril y a une fonction pratique pour cela (le code est à la fin de la réponse). Dans le cas 2D, il est simple que les données centrées sur la ligne moyenne tombent sur une ligne passant par l'origine à 135 degrés. Les données simulées sont ensuite regroupées à l'aide de k-moyennes avec un nombre correct de grappes. Les données et les résultats de regroupement (visualisés en 2D en utilisant PCA sur les données d'origine) ressemblent à ceci (les axes du tracé le plus à gauche sont différents). Les différentes formes des points dans les tracés de regroupement se réfèrent à l'affectation des clusters de vérité au sol et les couleurs sont le résultat du regroupement des k-moyennes.

entrez la description de l'image ici

Les grappes en haut à gauche et en bas à droite sont divisées par deux lorsque les données sont centrées sur la moyenne des lignes. Ainsi, les distances après le centrage de la ligne moyenne sont déformées et ne sont pas très significatives (au moins sur la base de la connaissance des données).

Pas si surprenant en 2D, que se passe-t-il si nous utilisons plus de dimensions? Voici ce qui se passe avec les données 3D. La solution de clustering après le centrage de la moyenne des lignes est "mauvaise".

entrez la description de l'image ici

Et similaire avec les données 4D (maintenant présentées par souci de concision).

Pourquoi cela arrive-t-il? Le centrage de la ligne moyenne pousse les données dans un espace où certaines fonctionnalités se rapprochent plus qu'elles ne le sont autrement. Cela devrait se refléter dans la corrélation entre les caractéristiques. Examinons cela (d'abord sur les données d'origine, puis sur les données centrées sur la moyenne des lignes pour les cas 2D et 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 Il semble donc que le centrage moyen des lignes introduit des corrélations entre les entités. Comment cela est-il affecté par le nombre de fonctionnalités? Nous pouvons faire une simulation simple pour comprendre cela. Les résultats de la simulation sont présentés ci-dessous (encore une fois le code à la fin).

entrez la description de l'image ici

Ainsi, à mesure que le nombre de caractéristiques augmente, l'effet du centrage de la ligne moyenne semble diminuer, au moins en termes de corrélations introduites. Mais nous venons d'utiliser des données aléatoires uniformément réparties pour cette simulation (comme cela est courant lors de l'étude de la malédiction de la dimensionnalité ).

Alors, que se passe-t-il lorsque nous utilisons des données réelles? Autant de fois la dimensionnalité intrinsèque des données est plus faible, la malédiction peut ne pas s'appliquer . Dans un tel cas, je suppose que le centrage de la moyenne des lignes pourrait être un "mauvais" choix comme indiqué ci-dessus. Bien entendu, une analyse plus rigoureuse est nécessaire pour formuler des allégations définitives.

Code de simulation de clustering

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

Code pour augmenter la simulation des fonctionnalités

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)

ÉDITER

1/(p1)

DataD'oh
la source
5

Il existe différentes formes de normalisation des rangées et l'OP n'indique pas laquelle il / elle a en tête.

Une forme spécifique de normalisation de ligne (normalisation de la norme euclédienne) où chaque ligne est normée (divisée par sa norme euclédienne) est très populaire.

3.2

xxp

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

p>1p

Par exemple, si vos données d'origine sont centrées (comme les points noirs sur cette image) et que vous leur appliquez une normalisation de ligne, vous obtenez les étoiles rouges.

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

Les points verts représentent un petit nombre de valeurs aberrantes dans les données d'origine. Si vous leur appliquez la transformation de normalisation de ligne, vous obtenez les étoiles bleues.

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

entrez la description de l'image ici

xFx

z

Vous pouvez le voir plus clairement en comparant les matrices de formes (ou ellipses de contour) ajustées tour à tour aux données, à leur version contaminée et à leur transformation normalisée en ligne:

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

  • [0] S. Visuri, V. Koivunen, H. Oja (2000). Signer et classer les matrices de covariance, Journal of Statistical Planning and Inference Volume 91, Numéro 2, 557–575.
user603
la source
4

Il existe des raisons spécifiques au champ pour effectuer la normalisation des lignes. En analyse de texte, il est assez courant de représenter un texte avec l'histogramme des mots qu'il contient. En partant du nombre de mots pour chaque ligne, la standardisation brute la transforme en histogramme.

Et la raison de calcul . Si vous travaillez avec une matrice clairsemée, vous ne pouvez pas centrer et mettre à l'échelle facilement les données colonne par colonne. Si vous l'intégrez dans une matrice dense, les données peuvent devenir trop volumineuses pour tenir en mémoire. Cependant, la mise à l'échelle ligne par ligne n'affecte pas la quantité totale de mémoire nécessaire.

RUser4512
la source
Pour la raison du calcul, dites-vous que nous prenons simplement la transposition et normalisons la ligne en raison de la façon dont les matrices clairsemées sont représentées? Je demande de plus en plus comment la normalisation des lignes affecte les résultats du plus proche voisin dans la pratique.
curiosity_delivers
3

La normalisation des lignes a un nom - mise à l'échelle ipsative - qui implique généralement la mise à l'échelle d'un ensemble d'entités en divisant par la valeur maximale de l'ensemble ou en soustrayant la moyenne des entités. Il existe de nombreuses motivations pour choisir cette approche de transformation des données, mais la principale d'entre elles est qu'elle conditionne les caractéristiques par rapport aux caractéristiques uniques de l'individu (la ligne ou l'unité d'analyse).

Mike Hunter
la source