Jaki jest cel normalizacji wierszy

13

Rozumiem uzasadnienie normalizacji kolumn, ponieważ powoduje, że cechy są ważone równo, nawet jeśli nie są mierzone w tej samej skali - jednak często w literaturze najbliższego sąsiada zarówno kolumny, jak i wiersze są znormalizowane. Do czego służy normalizacja wierszy / dlaczego normalizować wiersze? W szczególności, w jaki sposób wynik normalizacji wiersza wpływa na podobieństwo / odległość między wektorami rzędów?

curiosity_delivers
źródło
czy możesz przytoczyć literaturę normalizującą wiersze? Zdaję sobie sprawę, że jest to stosunkowo stara dyskusja, ale ostatnio natknąłem się na podobny problem i próbuję znaleźć różnice. Jako odpowiedź opublikuję swoje zdanie.
DataD'oh

Odpowiedzi:

4

Jest to stosunkowo stary wątek, ale ostatnio spotkałem się z tym problemem w swojej pracy i natknąłem się na tę dyskusję. Odpowiedzi na to pytanie, ale uważam, że nie wyeliminowano niebezpieczeństwa normalizacji wierszy, gdy nie jest to jednostka analizy (patrz odpowiedź @ DJohnson powyżej).

Najważniejsze jest to, że normalizowanie wierszy może być szkodliwe dla każdej późniejszej analizy, na przykład najbliższego sąsiada lub k-średnich. Dla uproszczenia zachowam odpowiedź dotyczącą centrowania wierszy.

Aby to zilustrować, użyję symulowanych danych gaussowskich w rogach hipersześcianu. Na szczęście Rjest do tego wygodna funkcja (kod znajduje się na końcu odpowiedzi). W przypadku 2D jest oczywiste, że dane wyśrodkowane na rzędzie spadną na linię przechodzącą przez punkt początkowy pod kątem 135 stopni. Symulowane dane są następnie grupowane za pomocą k-średnich z prawidłową liczbą klastrów. Dane i wyniki grupowania (wizualizowane w 2D przy użyciu PCA na oryginalnych danych) wyglądają tak (osie dla wykresu najbardziej na lewo są różne). Różne kształty punktów na wykresach grupowania odnoszą się do przypisania klastra z podstawową prawdą, a kolory są wynikiem grupowania k-średnich.

wprowadź opis zdjęcia tutaj

Klastry u góry po lewej i po prawej u dołu zostają przecięte na pół, gdy dane są wyśrodkowane na środkowej linii. Tak więc odległości po centrowaniu średniego rzędu ulegają zniekształceniu i nie są zbyt znaczące (przynajmniej w oparciu o znajomość danych).

Nie jest to tak zaskakujące w 2D, co jeśli zastosujemy więcej wymiarów? Oto, co dzieje się z danymi 3D. Rozwiązanie grupujące po centrowaniu średniej rzędów jest „złe”.

wprowadź opis zdjęcia tutaj

I podobnie z danymi 4D (teraz pokazanymi dla zwięzłości).

Dlaczego to się dzieje? Centrowanie średniej rzędów wypycha dane do przestrzeni, w której niektóre funkcje są bliższe niż w innym przypadku. Powinno to znaleźć odzwierciedlenie w korelacji między funkcjami. Spójrzmy na to (najpierw na oryginalne dane, a następnie na dane ze średnim rzędem dla przypadków 2D i 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 Wygląda więc na to, że centrowanie średnich rzędów wprowadza korelacje między funkcjami. Jak wpływa na to liczba funkcji? Możemy wykonać prostą symulację, aby to rozgryźć. Wynik symulacji pokazano poniżej (ponownie kod na końcu).

wprowadź opis zdjęcia tutaj

Zatem wraz ze wzrostem liczby cech efekt centrowania średniej rzędów wydaje się zmniejszać, przynajmniej pod względem wprowadzonych korelacji. Ale do tej symulacji wykorzystaliśmy po prostu równomiernie rozłożone losowe dane (co jest powszechne przy badaniu przekleństwa wymiarowości ).

Co się dzieje, gdy wykorzystujemy prawdziwe dane? Ponieważ wiele razy istotna wymiarowość danych jest niższa, klątwa może nie mieć zastosowania . W takim przypadku zgaduję, że centrowanie średnich rzędów może być „złym” wyborem, jak pokazano powyżej. Oczywiście, bardziej rygorystyczna analiza jest potrzebna do sformułowania ostatecznych roszczeń.

Kod do symulacji klastrowania

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

Kod zwiększający symulację funkcji

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)

EDYTOWAĆ

Po pewnym googlowaniu skończyło się na tej stronie, gdzie symulacje pokazują podobne zachowanie i sugerują, że korelacja wprowadzona przez centrowanie średniego rzędu wynosi .1/(p1)

DataD'oh
źródło
5

Istnieją różne formy normalizacji wierszy, a OP nie określa, o której myśli.

Specyficzna forma normalizacji wiersza (normalizacja eukledowska), w której każdy rząd jest normowany (podzielony przez normę eukledyjską), jest bardzo popularna.

Powodów stosowania tej formy rzędu normalizacji są również przedstawione w części w tym papieru [0]3.2

Oznaczają kolumna wyśrodkowany rząd -wektor i pxxp

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

wektor znormalizowany wiersz. Zastanów się, co ta transformacja robi geometrycznie z twoimi danymi . Geometrycznie, jeśli twoje oryginalne dane mają zmienne i są wyśrodkowane, stosując normalizację euklidesową wiersza, rzutujesz swoje dane na powierzchnię okręgu jednostki wymiarowej .pp>1p

Na przykład, jeśli twoje oryginalne dane są wyśrodkowane (jak czarne kropki na tym obrazie) i zastosujesz do nich normalizację wierszy, otrzymasz czerwone gwiazdki.

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

Zielone kropki reprezentują niewielką liczbę wartości odstających w oryginalnych danych. Jeśli zastosujesz do nich transformację normalizacji wiersza, uzyskasz niebieskie gwiazdy.

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

wprowadź opis zdjęcia tutaj

Teraz zalety tej transformacji są oczywiste. Rzut na koło jednostki tłumi efekt odległych wartości odstających. Jeśli oryginalne dane są rysowane z modelu wycentrowanego z wyjątkiem kilku skrajnie oddalonych wartości (takich jak zielone kropki), wówczas wszelkie oszacowanie kształtu danych na podstawie zostanie zepsute przez wartości odstające.F xxFx

Jeśli oprzesz swoje szacunki na znormalizowanych danych (gwiazdach, czerwonym i niebieskim), wartości odstające (teraz mapowane na niebieskie gwiazdy) mają mniejszy wpływ na zepsucie twoich szacunków.z

Najwyraźniej to widać, porównując matryce kształtu (lub elipsy konturu) dopasowane kolejno z danymi, ich zanieczyszczoną wersją i ich znormalizowaną transformacją rzędu:

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)

Jak widać, elipsy kształtu dopasowane do przekształconych zanieczyszczonych danych (czerwona elipsa) lepiej oszacować matrycę kształtu niezanieczyszczonych danych (czarna elipsa) niż uzyskaną z zanieczyszczonych danych (zielona elipsa). Wynika to z faktu, że zielone gwiazdy mają mniejsze przyciąganie na czerwonej elipsie (zbudowanej z przekształconych danych ) niż na zielonej (zbudowanej z oryginalnych danych ).xzx

  • [0] S. Visuri, V. Koivunen, H. Oja (2000). Podpisz i uszereguj macierze kowariancji, Journal of Statistics Planning and Inference Volume 91, Issue 2, 557–575.
użytkownik603
źródło
4

Istnieje kilka powodów, dla których należy przeprowadzić normalizację wierszy. W analizie tekstu dość często reprezentuje się tekst z histogramem zawartych w nim słów. Zaczynając od liczby słów dla każdej linii, surowa standaryzacja zamienia ją w histogram.

I powód obliczeniowy . Jeśli pracujesz z rzadką macierzą, nie możesz łatwo wyśrodkować i skalować kolumny danych po kolumnie. Jeśli osadzisz go w gęstej matrycy, dane mogą stać się zbyt duże, aby zmieścić się w pamięci. Jednak skalowanie rząd po rzędzie nie wpływa na całkowitą potrzebną ilość pamięci.

RUser4512
źródło
Czy z powodów obliczeniowych mówisz, że po prostu bierzemy transpozycję i normalizujemy wiersz ze względu na sposób reprezentacji rzadkich macierzy? Zastanawiam się, jak w praktyce normalizacja rzędów wpływa na wyniki najbliższego sąsiada.
curiosity_delivers,
3

Normalizacja wiersza ma nazwę - skalowanie ipsatywne - która zwykle obejmuje przeskalowanie zestawu cech poprzez podzielenie przez maksymalną wartość zestawu lub odjęcie średniej cech. Istnieje wiele motywacji do wyboru tego podejścia do przekształcania danych, ale najważniejsze z nich polega na tym, że warunkuje ono cechy związane z unikalnymi cechami jednostki (wiersz lub jednostka analizy).

Mike Hunter
źródło