列の正規化の背後にある理由を理解します。これは、同じスケールで測定されていなくてもフィーチャに均等に重み付けされるためです。ただし、最近接文献では、列と行の両方が正規化されていることがよくあります。行の正規化とは何ですか?なぜ正規化するのですか?具体的には、行の正規化の結果は行ベクトル間の類似性/距離にどのように影響しますか?
列の正規化の背後にある理由を理解します。これは、同じスケールで測定されていなくてもフィーチャに均等に重み付けされるためです。ただし、最近接文献では、列と行の両方が正規化されていることがよくあります。行の正規化とは何ですか?なぜ正規化するのですか?具体的には、行の正規化の結果は行ベクトル間の類似性/距離にどのように影響しますか?
回答:
これは比較的古いスレッドですが、最近この問題に遭遇し、この議論に遭遇しました。質問には回答しましたが、分析の単位でないときに行を正規化する危険性(上記の@DJohnsonの回答を参照)は対処されていないと感じています。
重要な点は、行の正規化は、最近傍やk平均などの後続の分析に悪影響を与える可能性があるということです。簡単にするために、私は行の中央揃えに固有の答えを保持します。
それを説明するために、ハイパーキューブのコーナーでシミュレートされたガウスデータを使用します。幸いなことにR
、そのための便利な関数があります(コードは回答の最後にあります)。2Dの場合、行平均中心のデータが135度で原点を通る線上にあることは簡単です。次に、シミュレートされたデータは、正しい数のクラスターを持つk-meansを使用してクラスター化されます。データとクラスタリング結果(元のデータでPCAを使用して2Dで視覚化)は、次のようになります(左端のプロットの軸は異なります)。クラスタリングプロットのポイントのさまざまな形状は、グラウンドトゥルースのクラスター割り当てを参照しており、色はk平均クラスタリングの結果です。
左上と右下のクラスターは、データが行平均の中央にある場合、半分にカットされます。したがって、行平均の中心化後の距離は歪んでしまい、あまり意味がありません(少なくともデータの知識に基づくと)。
2Dではそれほど驚くべきことではありませんが、より多くの次元を使用するとどうなるでしょうか。これが3Dデータで何が起こるかです。行平均中心化後のクラスタリングソリューションは「悪い」ものです。
また、4Dデータと同様です(簡潔にするために、ここでは示しています)。
なぜこうなった?行平均の中央揃えは、一部の機能が他の機能よりも近くなる場所にデータをプッシュします。これは、機能間の相関関係に反映されます。それを見てみましょう(最初に元のデータ、次に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
したがって、行平均の中心化により、機能間に相関関係が生じているように見えます。これは機能の数によってどのように影響を受けますか?それを理解するために簡単なシミュレーションを行うことができます。シミュレーションの結果を以下に示します(これも最後のコードです)。
したがって、特徴の数が増えるにつれて、行平均のセンタリングの効果は、導入された相関の観点から、少なくとも減少するようです。ただし、このシミュレーションには一様に分布したランダムデータを使用しただけです(次元の呪いを研究するときによくあることです)。
では、実際のデータを使用するとどうなりますか?データの本質的な次元が低いほど、呪いは適用されない場合があります。このような場合、上に示したように、行平均の中央揃えは「悪い」選択になると思います。もちろん、決定的な主張を行うには、より厳密な分析が必要です。
クラスタリングシミュレーションのコード
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)
編集
いくつかのグーグル処理がこのページで終了した後、シミュレーションは同様の動作を示し、行平均中心化によって導入された相関がと提案しました。
行の正規化にはさまざまな形式があり、OPはどのユーザーが自分のことを考えているかを述べていません。
行の正規化(ユークリッドノルム正規化)の特定の形式は、各行が正規化される(そのユークレディアノルムで除算される)静かな人気があります。
この形式の行の正規化を使用する理由は、このペーパーのセクションまとめられています[0]:
示す列中心行 -ベクトルと p
行の正規化されたベクトル。この変換がデータに対して幾何学的に何をしているのかを考えてください。幾何学的に、元のデータに変数があり、中央に配置されている場合、ユークリッド行の正規化を適用して、データを次元の単位円の表面に投影します。p
たとえば、元のデータが中央に配置され(この画像の黒い点のように)、それに行の正規化を適用すると、赤い星が得られます。
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')
今、この変革の利点は明らかです。単位円への投影は、外れ値の影響を弱めます。元のデータ が中央のモデルから描画された場合、いくつかの遠い外れ値(緑のドットなど)を除いて、基づくデータの形状の推定は外れ値によって台無しになります。F x
正規化されたデータ(星、赤と青)に基づいて推定を行う場合、外れ値(青い星にマップされている)は、推定を損なうレバレッジが少なくなります。
形状行列(または等高線の楕円)をデータ、それらの汚染されたバージョン、およびその行の正規化された変換に順に比較することで、これを最も明確に見ることができます。
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)
ご覧のとおり、変換された汚染データ(赤い楕円)に当てはめられた形状の楕円は、汚染されたデータ(緑の楕円)から得られたものよりも、汚染されていないデータ(黒い楕円)の形状行列の推定が優れています。これは、緑の星の赤い楕円(変換されたデータから作成)の方が、緑の楕円(元のデータから作成)よりも小さいためです。x
行の正規化を実行するフィールド固有の理由がいくつかあります。テキスト分析では、テキストに含まれる単語のヒストグラムでテキストを表すのが一般的です。各行の単語数から始めて、生の標準化はそれをヒストグラムに変えます。
そして、計算上の理由。スパースマトリックスを使用している場合、データを列ごとに簡単にセンタリングおよびスケーリングすることはできません。密な行列に埋め込むと、データが大きくなりすぎてメモリに収まらない場合があります。ただし、行ごとのスケーリングは、必要なメモリの総量には影響しません。