Normalization

行規範化的目的是什麼

  • October 4, 2015

我理解列歸一化背後的原因,因為它會導致特徵的權重相等,即使它們不是在相同的尺度上測量的 - 但是,通常在最近鄰文獻中,列和行都被歸一化。什麼是行規範化/為什麼規範化行?具體來說,行歸一化的結果如何影響行向量之間的相似度/距離?

這是一個相對較舊的線程,但我最近在工作中遇到了這個問題並偶然發現了這個討論。該問題已得到解答,但我認為當它不是分析單位時對行進行規範化的危險(請參閱上面的@DJohnson 的回答)尚未得到解決。

要點是標準化行可能不利於任何後續分析,例如最近鄰或 k 均值。為簡單起見,我將保留特定於均值居中行的答案。

為了說明這一點,我將使用超立方體角上的模擬高斯數據。幸運的是,R有一個方便的功能(代碼在答案的末尾)。在 2D 情況下,以行均值為中心的數據將落在一條以 135 度通過原點的線上,這一點很簡單。然後使用具有正確聚類數的 k-means 對模擬數據進行聚類。數據和聚類結果(在原始數據上使用 PCA 在 2D 中可視化)看起來像這樣(最左邊的圖的軸不同)。聚類圖中點的不同形狀指的是真實聚類分配,顏色是 k-means 聚類的結果。

在此處輸入圖像描述

當數據以行均值為中心時,左上角和右下角的簇被切成兩半。因此,行均值居中後的距離會被扭曲並且不是很有意義(至少基於數據的知識)。

在 2D 中並不奇怪,如果我們使用更多維度呢?以下是 3D 數據發生的情況。行均值居中後的聚類解決方案是“壞的”。

在此處輸入圖像描述

與 4D 數據類似(為簡潔起見,現在顯示)。

為什麼會這樣?row-mean-centering 將數據推入某個空間,在這些空間中,某些特徵比其他特徵更接近。這應該體現在特徵之間的相關性上。讓我們看一下(首先是原始數據,然後是 2D 和 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 所以看起來 row-mean-centering 正在引入特徵之間的相關性。這如何受功能數量的影響?我們可以做一個簡單的模擬來解決這個問題。模擬結果如下所示(同樣是最後的代碼)。

在此處輸入圖像描述

因此,隨著特徵數量的增加,行均值居中的效果似乎減弱了,至少就引入的相關性而言。但是我們只是在這個模擬中使用了均勻分佈的隨機數據(這在研究維度災難時很常見)。

那麼當我們使用真實數據時會發生什麼?由於數據的內在維度多次降低,詛咒可能不適用。在這種情況下,我猜想 row-mean-centering 可能是一個“壞”的選擇,如上所示。當然,需要更嚴格的分析來做出任何明確的主張。

聚類仿真代碼

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

增加特徵模擬的代碼

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)

編輯

此頁面上進行了一些谷歌搜索後,模擬顯示出類似的行為,並建議行均值居中引入的相關性為.

引用自:https://stats.stackexchange.com/questions/175463

comments powered by Disqus