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 R
gibt 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.
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".
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).
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 )