所以这是一部分数学,部分红宝石,部分统计问题,我只是不知道从哪里开始这样的东西,因为它可能比我现在准备的要大得多,但是也许有人能够阐明如何为这类事情实施解决方案.
基本上,随着时间的推移,我有一组整数,说我的哈希看起来像:
{ :count => 20, :timestamp => 1304566372 }
{ :count => 23, :timestamp => 1304566382 }
{ :count => 23, :timestamp => 1304566392 }
{ :count => 24, :timestamp => 1304566402 }
{ :count => 25, :timestamp => 1304566412 }
{ :count => 22, :timestamp => 1304566422 }
{ :count => 12, :timestamp => 1304566432 } # <= outlier
{ :count => 21, :timestamp => 1304566442 }
{ :count => 20, :timestamp => 1304566452 }
Run Code Online (Sandbox Code Playgroud)
这组数据会大得多,但这可以作为一个例子,所以我想做的就是找到与平均值差别最大的结果,但整数将遵循一种曲线,所以你可以' t只是平均整套.图片就像对网站的访问者分析.
我想我的问题是,使用ruby,我可以使用数学来概括曲线并找出哪些项目与曲线的那一段上的平均值相差最远?
我不是最好的数学家,所以我可能完全用错误的术语来描述这个.非常感谢所有人的帮助或提示!
假设整数值属于正态分布,您可以应用3-sigma规则(标准差)来查找异常值.
假设您想快速计算整数列表的平均值和标准差.你可以像这样增强Enumerable:
module Enumerable
def sum
self.inject(0){|accum, i| accum + i }
end
def mean
self.sum/self.length.to_f
end
def sample_variance
m = self.mean
sum = self.inject(0){|accum, i| accum +(i-m)**2 }
(1/self.length.to_f*sum)
end
def standard_deviation
return Math.sqrt(self.sample_variance)
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您必须确定异常值的标准.在3-sigma规则下,所有整数值的95%将落在距平均值的标准偏差值(2 sigma)的两倍之内.因此,您可以说任何与平均值的差异大于2个标准差的值都是异常值.
例如,假设您将count值总结为一个名为的数组a:
a = [ 20, 23, 23, 24, 25, 22, 12, 21, 29 ]
m = a.mean
# => 22.11111111111111
sd = a.standard_deviation
# => 4.331908597692872
# assuming Ruby 1.9.2
a.keep_if { |n| (m-n).abs > (2*sd) }
# => results in 12 remaining
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |