質問

私は、1〜30,000の範囲にあるデータセットを持っている。

それは0.1〜10

となるように、

私は、それを正規化したいです

それを行うための最善の方法/機能は何ですか?

あなたには、いくつかのサンプルコードを与えることができれば、

非常に感謝でしょう!

役に立ちましたか?

解決

ここでは、のリニアの正規化をしたいと仮定すると、コードスニペットです。それは非常に単純化バージョン(単にストレートコード、ない方法)ですので、あなたは「それがどのように機能するか」を参照してくださいすることができますし、何にもそれを適用することができます。

xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0

xrange = xmax-xmin
yrange = ymax-ymin

y = ymin + (x-xmin) * (yrange / xrange) 
<時間>

そして、ここではそれが関数として実行されます:

def normalise(x, xmin, xmax, ymin, ymax)
  xrange = xmax - xmin
  yrange = ymax - ymin
  ymin + (x - xmin) * (yrange.to_f / xrange) 
end

puts normalise(2000, 1, 30000, 0.1, 10) 

(注:to_f我々は整数除算のブラックホールに該当しない保証)

他のヒント

ここではRubyの道は、0.0〜1.0とmaxに配列の分を設定する一般的なケースのためだ。

class Array
  def normalize!
    xMin,xMax = self.minmax
    dx = (xMax-xMin).to_f
    self.map! {|x| (x-xMin) / dx }
  end
end

a = [3.0, 6.0, 3.1416]
a.normalize!
=> [0.0, 1.0, 0.047199999999999985]

は、0と1以外の最小値と最大値の場合は、Elfstromの答えのようにしnormalize!に引数を追加します。

このコレクション数を拡張する有名な方法です。これは、より正確な名前を持っているが、私は覚えていて、それをGoogleに失敗することはできません。

def scale(numbers, min, max)
    current_min = numbers.min
    current_max = numbers.max
  numbers.map {|n| min + (n - current_min) * (max - min) / (current_max - current_min)}
end

dataset = [1,30000,15000,200,3000]
result = scale(dataset, 0.1, 10.0)
=> [0.1, 10.0, 5.04983499449982, 0.165672189072969, 1.08970299009967]
scale(result, 1, 30000)
=> [1.0, 30000.000000000004, 15000.0, 199.99999999999997, 3000.0000000000005] 
あなたが見ることができるように

は、丸め問題に注意する必要があります。おそらく、また、整数の除算は、結果が破損しますので、あなたが最小&最大として整数を取得しないことを確認する必要があります。

x = x / 3030.3031 + 0.1

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top