行規範化的目的是什麼
我理解列歸一化背後的原因,因為它會導致特徵的權重相等,即使它們不是在相同的尺度上測量的 - 但是,通常在最近鄰文獻中,列和行都被歸一化。什麼是行規範化/為什麼規範化行?具體來說,行歸一化的結果如何影響行向量之間的相似度/距離?
這是一個相對較舊的線程,但我最近在工作中遇到了這個問題並偶然發現了這個討論。該問題已得到解答,但我認為當它不是分析單位時對行進行規範化的危險(請參閱上面的@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)
編輯
在此頁面上進行了一些谷歌搜索後,模擬顯示出類似的行為,並建議行均值居中引入的相關性為.