Was ist der Zweck der Zeilennormalisierung?


12

Ich verstehe die Gründe für die Spaltennormalisierung, da dadurch Merkmale gleich gewichtet werden, auch wenn sie nicht auf derselben Skala gemessen werden. In der Literatur zum nächsten Nachbarn werden jedoch häufig sowohl Spalten als auch Zeilen normalisiert. Was ist die Zeilennormalisierung für / warum Zeilen normalisieren? Wie wirkt sich das Ergebnis der Zeilennormalisierung speziell auf die Ähnlichkeit / den Abstand zwischen Zeilenvektoren aus?


Können Sie bitte die Literatur zitieren, die die Zeilen normalisiert? Mir ist klar, dass dies eine relativ alte Diskussion ist, aber ich bin kürzlich auf ein ähnliches Problem gestoßen und versuche, die Unterschiede herauszufinden. Ich werde meine Meinung als Antwort veröffentlichen.
DataD'oh

Antworten:


4

Dies ist ein relativ alter Thread, aber ich bin kürzlich in meiner Arbeit auf dieses Problem gestoßen und bin auf diese Diskussion gestoßen. Die Frage wurde beantwortet, aber ich bin der Meinung, dass die Gefahr der Normalisierung der Zeilen, wenn es sich nicht um die Analyseeinheit handelt (siehe Antwort von @ DJohnson oben), nicht angesprochen wurde.

Der Hauptpunkt ist, dass das Normalisieren von Zeilen für jede nachfolgende Analyse nachteilig sein kann, wie zum Beispiel für den nächsten Nachbarn oder k-Mittel. Der Einfachheit halber werde ich die Antwort speziell für die mittlere Zentrierung der Zeilen beibehalten.

Zur Veranschaulichung werde ich simulierte Gaußsche Daten an den Ecken eines Hyperwürfels verwenden. Zum Glück Rgibt es dafür eine praktische Funktion (der Code steht am Ende der Antwort). Im 2D-Fall ist es einfach, dass die Daten mit Zeilenmittelwert auf eine Linie fallen, die bei 135 Grad durch den Ursprung verläuft. Die simulierten Daten werden dann unter Verwendung von k-Mitteln mit der richtigen Anzahl von Clustern geclustert. Die Daten und die Clustering-Ergebnisse (in 2D mit PCA auf den Originaldaten visualisiert) sehen folgendermaßen aus (die Achsen für das Diagramm ganz links sind unterschiedlich). Die verschiedenen Formen der Punkte in den Clusterdiagrammen beziehen sich auf die Zuordnung der Grundwahrheitscluster, und die Farben sind das Ergebnis der k-Mittel-Clusterbildung.

Geben Sie hier die Bildbeschreibung ein

Die Cluster oben links und unten rechts werden halbiert, wenn die Daten zeilenmittelzentriert sind. Die Abstände nach der Zeilenmittelwertzentrierung werden also verzerrt und sind nicht sehr aussagekräftig (zumindest basierend auf der Kenntnis der Daten).

Nicht so überraschend in 2D, was ist, wenn wir mehr Dimensionen verwenden? Folgendes passiert mit 3D-Daten. Die Clustering-Lösung nach der Zeilenmittelwertzentrierung ist "schlecht".

Geben Sie hier die Bildbeschreibung ein

Und ähnlich mit 4D-Daten (der Kürze halber jetzt gezeigt).

Warum passiert dies? Durch die Zeilenmittelwertzentrierung werden die Daten in einen Bereich verschoben, in dem einige Funktionen näher kommen als sonst. Dies sollte sich in der Korrelation zwischen den Merkmalen widerspiegeln. Schauen wir uns das an (zuerst die Originaldaten und dann die zeilenmittelzentrierten Daten für 2D- und 3D-Fälle).

[,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 Es sieht also so aus, als würde die Zeilenmittelwertzentrierung Korrelationen zwischen den Merkmalen einführen. Wie wird dies durch die Anzahl der Funktionen beeinflusst? Wir können eine einfache Simulation durchführen, um das herauszufinden. Das Ergebnis der Simulation ist unten dargestellt (wieder der Code am Ende).

Geben Sie hier die Bildbeschreibung ein

Mit zunehmender Anzahl von Merkmalen scheint sich der Effekt der Zeilenmittelwertzentrierung zumindest in Bezug auf die eingeführten Korrelationen zu verringern. Wir haben für diese Simulation jedoch nur gleichmäßig verteilte Zufallsdaten verwendet (wie es bei der Untersuchung des Fluches der Dimensionalität üblich ist ).

Was passiert also, wenn wir echte Daten verwenden? Da die intrinsische Dimensionalität der Daten um ein Vielfaches geringer ist, trifft der Fluch möglicherweise nicht zu . In einem solchen Fall würde ich vermuten, dass die Zeilenmittelwertzentrierung eine "schlechte" Wahl sein könnte, wie oben gezeigt. Natürlich ist eine genauere Analyse erforderlich, um endgültige Ansprüche geltend zu machen.

Code für die Clustering-Simulation

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 zur Erhöhung der Funktionssimulation

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)

BEARBEITEN

- -1/.(p- -1)


5

Es gibt verschiedene Formen der Zeilennormalisierung, und das OP gibt nicht an, welche es im Sinn hat.

Eine spezielle Form der Zeilennormalisierung (Eukledianische Normnormalisierung), bei der jede Zeile normiert ist (geteilt durch ihre Eukledianische Norm), ist sehr beliebt.

3.2

xxp

(0)r(xx)=||xx||2- -1xx

p>1p

Wenn Ihre Originaldaten beispielsweise zentriert sind (wie die schwarzen Punkte in diesem Bild) und Sie eine Zeilennormalisierung darauf anwenden, erhalten Sie die roten Sterne.

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

Die grünen Punkte repräsentieren eine kleine Anzahl von Ausreißern in den Originaldaten. Wenn Sie die Zeilennormalisierungstransformation auf sie anwenden, erhalten Sie die blauen Sterne.

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

Geben Sie hier die Bildbeschreibung ein

xF.x

z

Sie können dies am deutlichsten erkennen, indem Sie die Formmatrizen (oder Konturellipsen) vergleichen, die nacheinander an die Daten, ihre kontaminierte Version und deren zeilennormalisierte Transformation angepasst sind:

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). Vorzeichen- und Rangkovarianzmatrizen, Journal of Statistical Planning and Inference, Band 91, Ausgabe 2, 557–575.

4

Es gibt einige feldspezifische Gründe für die Durchführung der Zeilennormalisierung. In der Textanalyse ist es durchaus üblich, einen Text mit dem Histogramm der darin enthaltenen Wörter darzustellen. Ausgehend von der Anzahl der Wörter für jede Zeile wird sie durch die Standardisierung in ein Histogramm umgewandelt.

Und der rechnerische Grund . Wenn Sie mit einer dünnen Matrix arbeiten, können Sie die Daten nicht einfach spaltenweise zentrieren und skalieren. Wenn Sie es in eine dichte Matrix einbetten, können die Daten zu groß werden, um in den Speicher zu passen. Die zeilenweise Skalierung wirkt sich jedoch nicht auf die insgesamt benötigte Speichermenge aus.


Wollen Sie aus rechnerischen Gründen nur die Transponierung nehmen und die Zeile normalisieren, weil die spärlichen Matrizen so dargestellt werden? Ich frage außerdem, wie sich die Zeilennormalisierung in der Praxis auf die Ergebnisse des nächsten Nachbarn auswirkt.
curiosity_delivers

3

Die Zeilennormalisierung hat einen Namen - ipsative Skalierung -, bei der normalerweise eine Reihe von Merkmalen neu skaliert wird, indem entweder durch den Maximalwert für die Menge dividiert oder der Mittelwert der Merkmale subtrahiert wird. Es gibt viele Gründe für die Wahl dieses Ansatzes zur Transformation von Daten, aber der wichtigste davon ist, dass er die Merkmale in Bezug auf die einzigartigen Merkmale des Individuums (die Zeile oder Analyseeinheit) konditioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.