因此,这是一个部分数学,部分ruby,部分统计的问题,我只是不确定从哪里开始做这样的事情,因为它可能比我目前准备的要大得多,但也许有人能够为这类事情提供一些解决方案。
基本上,我有一组随时间变化的整数,假设我的哈希如下所示:
{ :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 }这组数据会大得多,但这只是一个例子,所以我想要做的是找出与平均值相差最大的结果,但是整数将遵循一种曲线,所以你不能只对整个集合进行平均。这就像一个网站的访问者分析。
我想我的问题是,使用ruby,我是否可以使用数学来概括一条曲线,并找出哪些项目在曲线的这一段上与平均值相差最远?
我不是最好的数学专家,所以我可能用了错误的术语来描述这个问题。非常感谢大家的帮助和建议!
发布于 2011-05-05 12:23:29
假设整数值服从正态分布,您也许能够应用3-sigma rule (标准差)来查找异常值。
假设您想要快速计算整数列表的平均值和标准差。你可以像这样增强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 然后,你必须决定异常值的标准是什么。在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发布于 2011-05-05 12:43:12
如果你只是在寻找一个起点,我建议你在文献中搜索“检测时间序列数据中的异常值”如果你能将某种方程拟合到数据中,你可以看看点离曲线有多远。如果系统比较复杂并且不容易建模,您可以遵循许多策略,例如……
count增量。在您的系列中,增量列表是[3,0,1,1,-3,-10,9,-1]。您可以查找超出此列表平均值几个标准差的值。实际上,你是在通过寻找直线斜率的较大变化来寻找尖峰。有了更多关于数据性质的信息,人们可能会选择某种最优算法,但快速和脏可能已经足够接近了。
这是一个老生常谈的术语,只是说"google“的一种花哨的方式。
https://stackoverflow.com/questions/5892408
复制相似问题