web-dev-qa-db-ja.com

2点間のシリーズのスケーリング

シリーズの最初の数が0、最後の数が1になるようにシリーズをスケーリングするにはどうすればよいですか。「約」、「スケール」を調べましたが、この目的を達成しません。

# generate series from exponential distr
s = sort(rexp(100))

# scale/interpolate 's' such that it starts at 0 and ends at 1?
# approx(s)
# scale(s)
45
user236215

基本的な算術を使用してこれを行う小さな関数を作成するのは簡単です。

s = sort(rexp(100))

range01 <- function(x){(x-min(x))/(max(x)-min(x))}

range01(s)

  [1] 0.000000000 0.003338782 0.007572326 0.012192201 0.016055006 0.017161145
  [7] 0.019949532 0.023839810 0.024421602 0.027197168 0.029889484 0.033039408
 [13] 0.033783376 0.038051265 0.045183382 0.049560233 0.056941611 0.057552543
 [19] 0.062674982 0.066001242 0.066420884 0.067689067 0.069247825 0.069432174
 [25] 0.070136067 0.076340460 0.078709590 0.080393512 0.085591881 0.087540132
 [31] 0.090517295 0.091026499 0.091251213 0.099218526 0.103236344 0.105724733
 [37] 0.107495340 0.113332392 0.116103438 0.124050331 0.125596034 0.126599323
 [43] 0.127154661 0.133392300 0.134258532 0.138253452 0.141933433 0.146748798
 [49] 0.147490227 0.149960293 0.153126478 0.154275371 0.167701855 0.170160948
 [55] 0.180313542 0.181834891 0.182554291 0.189188137 0.193807559 0.195903010
 [61] 0.208902645 0.211308713 0.232942314 0.236135220 0.251950116 0.260816843
 [67] 0.284090255 0.284150541 0.288498370 0.295515143 0.299408623 0.301264703
 [73] 0.306817872 0.307853369 0.324882091 0.353241217 0.366800517 0.389474449
 [79] 0.398838576 0.404266315 0.408936260 0.409198619 0.415165553 0.433960390
 [85] 0.440690262 0.458692639 0.464027428 0.474214070 0.517224262 0.538532221
 [91] 0.544911543 0.559945121 0.585390414 0.647030109 0.694095422 0.708385079
 [97] 0.736486707 0.787250428 0.870874773 1.000000000
48
Andrie

scalesパッケージには、これを行う関数rescaleがあります。

library("scales")
rescale(s)

デフォルトでは、これはsの指定された範囲を0から1にスケーリングしますが、これらのいずれかまたは両方を調整できます。たとえば、0から10にスケーリングする場合

rescale(s, to=c(0,10))

または、sの最大値を1にスケールしたいが、0(sの最小値ではなく)0にスケールしたい場合は、使用できます。

rescale(s, from=c(0, max(s)))
41
Brian Diggs

代わりに:

scale(x,center=min(x),scale=diff(range(x)))

(未テスト)

これには、元のセンタリング係数とスケーリング係数を属性として出力にアタッチする機能があり、それらを取得して後で必要に応じてデータのスケーリングを解除することができます。ベクトルが渡された場合でも、結果を常に(列方向の)行列として返すという奇妙な点があります。

16
Ben Bolker

これはそれを行う必要があります:

reshape::rescaler.default(s, type = "range")

[〜#〜] edit [〜#〜]

2つの方法のパフォーマンスに興味がありました

> system.time(replicate(100, range01(s)))
   user  system elapsed 
   0.56    0.12    0.69 
> system.time(replicate(100, reshape::rescaler.default(s, type = "range")))
   user  system elapsed 
   0.53    0.18    0.70 

reshape::rescaler.defaultから生のコードを抽出する

range02 <- function(x) {
    (x - min(x, na.rm=TRUE)) / diff(range(x, na.rm=TRUE))
    }

> system.time(replicate(100, range02(s)))
   user  system elapsed 
   0.56    0.12    0.68 

同様の結果が得られます。

13
Roman Luštrik

また、キャレットパッケージを使用して、preProcess関数を提供することもできます。

preProcValues <- preProcess(yourData, method = "range")
dataScaled <- predict(preProcValues, yourData)

パッケージヘルプ の詳細。

2
brunoazev

Rで次の関数を作成しました。

ReScale <- function(x,first,last){(last-first)/(max(x)-min(x))*(x-min(x))+first}

ここで、最初は開始点、最後は終了点です。

0
Satpal Singh