首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby中的推断统计

Ruby中的推断统计
EN

Stack Overflow用户
提问于 2011-05-05 11:40:47
回答 2查看 698关注 0票数 1

因此,这是一个部分数学,部分ruby,部分统计的问题,我只是不确定从哪里开始做这样的事情,因为它可能比我目前准备的要大得多,但也许有人能够为这类事情提供一些解决方案。

基本上,我有一组随时间变化的整数,假设我的哈希如下所示:

代码语言:javascript
复制
{ :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,我是否可以使用数学来概括一条曲线,并找出哪些项目在曲线的这一段上与平均值相差最远?

我不是最好的数学专家,所以我可能用了错误的术语来描述这个问题。非常感谢大家的帮助和建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 12:23:29

假设整数值服从正态分布,您也许能够应用3-sigma rule (标准差)来查找异常值。

假设您想要快速计算整数列表的平均值和标准差。你可以像这样增强Enumerable:

代码语言:javascript
复制
  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的数组中

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2011-05-05 12:43:12

如果你只是在寻找一个起点,我建议你在文献中搜索“检测时间序列数据中的异常值”如果你能将某种方程拟合到数据中,你可以看看点离曲线有多远。如果系统比较复杂并且不容易建模,您可以遵循许多策略,例如……

  • 只需查看数据点之间的count增量。在您的系列中,增量列表是[3,0,1,1,-3,-10,9,-1]。您可以查找超出此列表平均值几个标准差的值。实际上,你是在通过寻找直线斜率的较大变化来寻找尖峰。
  • 查看由3到5个左右的点组成的较小窗口,例如,首先查看点1、2、3、4,然后是3、4、5,等等。这与第一种方法类似,但算法略有不同。

有了更多关于数据性质的信息,人们可能会选择某种最优算法,但快速和脏可能已经足够接近了。

这是一个老生常谈的术语,只是说"google“的一种花哨的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5892408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档