我理解列归一化背后的原因,因为它会导致特征的权重相等,即使它们不是在相同的尺度上测量的 - 但是,通常在最近邻文献中,列和行都被归一化。什么是行规范化/为什么规范化行?具体来说,行归一化的结果如何影响行向量之间的相似度/距离?
行规范化的目的是什么
执行行规范化有一些特定于字段的原因。在文本分析中,用它包含的单词的直方图来表示文本是很常见的。从每行的字数开始,原始标准化将其转换为直方图。
和计算的原因。如果您使用的是稀疏矩阵,则无法轻松地按列居中和缩放数据。如果将其嵌入到密集矩阵中,则数据可能会变得太大而无法放入内存。但是,逐行缩放不会影响所需的内存总量。
这是一个相对较旧的线程,但我最近在工作中遇到了这个问题并偶然发现了这个讨论。该问题已得到解答,但我认为当它不是分析单位时对行进行规范化的危险(请参阅上面的@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)
编辑
在此页面上进行了一些谷歌搜索后,模拟显示出类似的行为,并建议 row-mean-centering 引入的相关性为。
行规范化有多种形式,OP 没有说明他/她想到的是哪一个。
行归一化(欧几里德范数归一化)的一种特定形式,其中每一行都被归一化(除以其欧几里德范数)是非常流行的。
使用这种形式的行规范化的原因在章节中有很好的总结本文[0] :
表示以列为中心的行-向量和
行归一化向量。考虑一下这种转换在几何上对您的数据做了什么。在几何上,如果您的原始数据有变量并居中,通过应用欧几里德行归一化,您可以将数据投影到维单位圆。
例如,如果您的原始数据居中(如该图像中的黑点)并且您对其应用行规范化,您将获得红色星星。
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')
绿点代表原始数据中的少量异常值。如果对它们应用行归一化变换,您将获得蓝色星星。
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')
现在这种转变的优势是显而易见的。单位圆上的投影抑制了远异常值的影响。如果你原始数据 从居中的模型中绘制除了一些很远的异常值(例如绿点)之外,任何基于数据形状的估计会被异常值宠坏。
如果您的估计基于标准化数据(星星,红色和蓝色),异常值(现在映射到蓝色星星)破坏您的估计的影响较小。
通过将依次拟合的形状矩阵(或轮廓椭圆)与数据、它们的污染版本及其行归一化变换进行比较,您可以最清楚地看到这一点:
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)
如您所见,与从受污染数据(绿色椭圆)获得的形状矩阵相比,拟合到转换后的污染数据(红色椭圆)的形状椭圆是对未污染数据(黑色椭圆)形状矩阵的更好估计。这是因为绿色星星对红色椭圆的拉力较小(由转换后的数据构成)比绿色的(由原始数据构建))。
- [0] S. Visuri、V. Koivunen、H. Oja (2000)。Sign and rank covariance matrices, Journal of Statistical Planning and Inference 第 91 卷,第 2 期,557–575。
行归一化有一个名字——ipsative scaling——它通常涉及通过除以集合的最大值或减去特征的平均值来重新缩放一组特征。选择这种方法来转换数据的动机有很多,但其中最主要的原因是它根据个人的独特特征(分析的行或单元)来调节特征。