243

spamスパム メッセージに関連する 58 列と約 3500 行のデータを含むというデータセットがあります。

将来、このデータセットで線形回帰を実行する予定ですが、事前に前処理を行い、列を標準化して平均と単位分散をゼロにしたいと考えています。

これを行う最善の方法は R を使用することだと言われたので、どうすれば R で正規化を達成できますか? 私はすでにデータを適切にロードしており、このタスクを実行するためのパッケージまたはメソッドを探しています。

4

16 に答える 16

609

平均が 0 で標準偏差が 1 であると言うつもりだったと仮定する必要があります。データがデータフレームにあり、すべての列が数値である場合はscale、データに対して関数を呼び出すだけで、必要なことを行うことができます。

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)

# check that we get mean of 0 and sd of 1
colMeans(scaled.dat)  # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)

組み込み関数の使用は上品です。この猫のように:

ここに画像の説明を入力

于 2013-03-05T03:49:06.313 に答える
19

clusterSim パッケージの data.Normalization 関数を使用して、データを簡単に正規化することもできます。データ正規化のさまざまな方法を提供します。

    data.Normalization (x,type="n0",normalization="column")

引数

x
ベクトル、行列、またはデータセット タイプ
正規化のタイプ: n0 - 正規化なし

n1 - 標準化 ((x-mean)/sd)

n2 - 位置の標準化 ((x-median)/mad)

n3 - 単位化 ((x 平均)/範囲)

n3a - 位置の単位化 ((x-median)/range)

n4 - 最小値ゼロの単位化 ((x-min)/範囲)

n5 - 範囲 <-1,1> の正規化 ((x-mean)/max(abs(x-mean)))

n5a - 範囲 <-1,1> の位置の正規化 ((x-median)/max(abs(x-median)))

n6 - 商変換 (x/sd)

n6a - 位置商変換 (x/mad)

n7 - 商変換 (x/範囲)

n8 - 商変換 (x/max)

n9 - 商変換 (x/平均)

n9a - 位置商変換 (x/中央値)

n10 - 商変換 (x/合計)

n11 - 商変換 (x/sqrt(SSQ))

n12 - 正規化 ((x-mean)/sqrt(sum((x-mean)^2)))

n12a - 位置の正規化 ((x-median)/sqrt(sum((x-median)^2)))

n13 - ゼロを中心点とする正規化 ((x-midrange)/(range/2))

正規化
「列」 - 変数による正規化、「行」 - オブジェクトによる正規化

于 2016-02-16T08:11:17.077 に答える
17

v0.7.4ではdplyr、次を使用してすべての変数をスケーリングできますmutate_all()

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)

set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2), 
              y = runif(10, 3, 5),
              z = runif(10, 10, 20))

dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#>         x      y       z
#>     <dbl>  <dbl>   <dbl>
#>  1 -0.827 -0.300 -0.0602
#>  2  0.663 -0.342 -0.725 
#>  3  1.47  -0.774 -0.588 
#>  4 -1.97  -1.13   0.118 
#>  5  0.816 -0.595 -1.02  
#>  6  0.893  1.19   0.998 
#>  7 -0.192  0.328 -0.948 
#>  8 -0.164  1.50  -0.748 
#>  9 -0.182  1.25   1.81  
#> 10 -0.509 -1.12   1.16

特定の変数は、次を使用して除外できますmutate_at()

dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#>        x      y       z
#>    <dbl>  <dbl>   <dbl>
#>  1  29.8 -0.300 -0.0602
#>  2  30.1 -0.342 -0.725 
#>  3  30.2 -0.774 -0.588 
#>  4  29.5 -1.13   0.118 
#>  5  30.1 -0.595 -1.02  
#>  6  30.1  1.19   0.998 
#>  7  29.9  0.328 -0.948 
#>  8  29.9  1.50  -0.748 
#>  9  29.9  1.25   1.81  
#> 10  29.8 -1.12   1.16

reprex パッケージ(v0.2.0)によって 2018-04-24 に作成されました。

于 2018-04-24T13:03:33.607 に答える
1

@BBKim はほとんど最良の答えを出しましたが、もっと短くすることもできます。まだ誰も思いつかなかったことに驚いています。

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))

于 2020-04-07T01:17:21.600 に答える
0

パッケージ「recommenderlab」を使用してください。パッケージをダウンロードしてインストールします。このパッケージには、コマンド「Normalize」が組み込まれています。また、正規化の多くの方法、つまり「中心」または「Z スコア」のいずれかを選択することもできます。次の例に従います。

## create a matrix with ratings
m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=&rdquo;), items=paste('i', 1:10, sep=&rdquo;)))

## do normalization
r <- as(m, "realRatingMatrix")
#here, 'centre' is the default method
r_n1 <- normalize(r) 
#here "Z-score" is the used method used
r_n2 <- normalize(r, method="Z-score")

r
r_n1
r_n2

## show normalized data
image(r, main="Raw Data")
image(r_n1, main="Centered")
image(r_n2, main="Z-Score Normalization")
于 2015-09-18T12:13:50.373 に答える