私は、アウトライアを定義したり除外したりするために、約4百万行のデータセットが急激に増加しています(統計/解析用)このデータセットでしかし、これはあまりにも多くのデータをメモリにロードして、私のシステムはチョークします。私は現在、データを収集し処理するために、これを使用しています:データセットが大きすぎて処理のためにメモリにロードできない
@scoreInnerFences = innerFence Post.where(:source => 1).
order(:score).
pluck(:score)
を典型的な分割統治法は動作しません使用して、すべてのエントリは、正確な私の外れ値の計算を維持するために考慮しなければならないので、私は考えていません。どのようにこれを効率的に達成することができますか?
innerFence
は、データセットの下位四分位および上四分位を識別し、これらの結果を使用して異常値を計算します。大きなデータセットについて
def q1(s)
q = s.length/4
if s.length % 2 == 0
return (s[ q ] + s[ q - 1 ])/2
else
return s[ q ]
end
end
def q2(s)
q = s.length/4
if s.length % 2 == 0
return (s[ q * 3 ] + s[ (q * 3) - 1 ])/2
else
return s[ q * 3 ]
end
end
def innerFence(s)
q1 = q1(s)
q2 = q2(s)
iq = (q2 - q1) * 3
if1 = q1 - iq
if2 = q2 + iq
return [if1, if2]
end
'innerFence'とは何ですか?明らかな答えは、Rubyではなくデータベース内の 'innerFence'で何をしているのかを行うことですが、それが可能かどうかは' innerFence'の実際の実装に依存します。 –
これは、私のデータセットの下位および上位の四分位数を特定して、外れ値を計算しています。最後の編集でソースを追加しました。 –