【发布时间】:2012-04-09 21:10:04
【问题描述】:
我有一个更大的快速增长的数据集,大约 400 万行,为了定义和排除异常值(用于统计/分析用途),我需要算法来考虑该数据集中的所有条目。然而,这是太多的数据加载到内存和我的系统阻塞。我目前正在使用它来收集和处理数据:
@scoreInnerFences = innerFence Post.where( :source => 1 ).
order( :score ).
pluck( :score )
使用典型的分治法是行不通的,我不认为因为必须考虑每个条目以保持我的异常值计算准确。如何有效地实现这一目标?
innerFence 识别数据集的下四分位数和上四分位数,然后使用这些发现来计算异常值。这是(尚未重构,非 DRY)代码:
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的实际实现。 -
它正在识别我的数据集的下四分位数和上四分位数,然后计算异常值。我在上次编辑中添加了源代码。
标签: mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2