Bu nispeten eski bir iş parçacığı ama son zamanlarda benim iş bu sorunla karşılaştı ve bu tartışma tökezledi. Soru cevaplandı, ancak analiz birimi olmadığında satırları normalleştirme tehlikesinin (bkz. Yukarıdaki @ DJohnson'ın cevabı) ele alınmadığını hissediyorum.
Ana nokta, normalleştirici sıraların, en yakın komşu veya k-araçları gibi herhangi bir sonraki analiz için zararlı olabileceğidir. Basit olması için, cevabı satırların ortalanmasına özgü tutacağım.
Bunu göstermek için, hiperküpün köşelerinde simüle edilmiş Gauss verileri kullanacağım. Neyse ki R
bunun için uygun bir fonksiyon var (kod cevabın sonunda). 2B durumda, satır ortalama merkezli verilerin başlangıç noktasından 135 dereceden geçen bir çizgiye düşmesi kolaydır. Simüle edilen veriler daha sonra doğru sayıda kümeye sahip k-araçları kullanılarak kümelenir. Veriler ve kümeleme sonuçları (orijinal verilerde PCA kullanılarak 2B olarak görüntülenir) şöyle görünür (en soldaki grafiğin eksenleri farklıdır). Kümelenme grafiklerindeki noktaların farklı şekilleri yer-doğruluk küme atamasına işaret eder ve renkler k-ortalama kümelemenin sonucudur.
Veriler satır ortalaması ortalandığında, sol üst ve sağ alt kümeler ikiye bölünür. Dolayısıyla, satır ortalama merkezlemesinden sonraki mesafeler çarpıtılmış ve çok anlamlı değildir (en azından verilerin bilgisine dayanarak).
2D'de bu kadar şaşırtıcı değil, ya daha fazla boyut kullanırsak? İşte 3D verilerde olanlar. Satır ortalama merkezlemesinden sonra kümeleme çözümü "kötü".
Ve 4D verileriyle benzer (şimdi kısalık için gösterilmiştir).
Bu neden oluyor? Satır ortalaması, verileri bazı özelliklerin diğerlerinden daha yakın olduğu bir alana iter. Bu, özellikler arasındaki korelasyona yansıtılmalıdır. Şuna bakalım (önce orijinal verilerde, ardından 2D ve 3D durumlar için satır ortalamalı verilerde).
[,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
Yani satır-ortalama-merkezleme özellikler arasında korelasyonlar getirmektedir. Bu özellik sayısından nasıl etkileniyor? Bunu anlamak için basit bir simülasyon yapabiliriz. Simülasyonun sonucu aşağıda gösterilmiştir (yine sondaki kod).
Dolayısıyla, özelliklerin sayısı arttıkça, satır-ortalama-merkezlemenin etkisi, en azından getirilen korelasyonlar açısından azalmaktadır. Ancak bu simülasyon için sadece eşit dağıtılmış rastgele veriler kullandık ( boyutsallığın lanetini incelerken yaygın olarak olduğu gibi ).
Peki gerçek verileri kullandığımızda ne olur? Birçok kez verinin içsel boyutu daha düşük olduğu için lanet geçerli olmayabilir . Böyle bir durumda, satır ortalama merkezlemesinin yukarıda gösterildiği gibi "kötü" bir seçim olabileceğini tahmin ediyorum. Tabii ki, kesin iddialarda bulunmak için daha titiz bir analize ihtiyaç vardır.
Kümeleme simülasyonu kodu
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)
}
Özellik simülasyonunu artırmak için kod
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)
DÜZENLE
- 1 / ( p - 1 )