Ruby中的推理统计

Ruby中的推理统计,ruby,statistics,Ruby,Statistics,这是一个部分是数学,部分是ruby,部分是统计学的问题,我不确定从哪里开始,因为这可能比我目前准备的要大得多,但也许有人能够为如何实现这类问题的解决方案提供一些启示 基本上,随着时间的推移,我有一组整数,比如我的散列看起来像: { :count => 20, :timestamp => 1304566372 } { :count => 23, :timestamp => 1304566382 } { :count => 23, :timestamp => 13

这是一个部分是数学,部分是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 }
{:count=>20,:timestamp=>1304566372}
{:count=>23,:timestamp=>1304566382}
{:count=>23,:timestamp=>1304566392}
{:计数=>24,:时间戳=>1304566402}
{:计数=>25,:时间戳=>1304566412}
{:count=>22,:timestamp=>1304566422}
{:count=>12,:timestamp=>1304566432}21,:timestamp=>1304566442}
{:count=>20,:timestamp=>1304566452}
这组数据要大得多,但这可以作为一个例子,所以我想做的是找到与平均值相差最大的结果,但是整数将遵循一种曲线,所以你不能仅仅平均整组数据。像图片一样访问网站

我想我的问题是,使用ruby,我可以用数学来概括一条曲线,并找出哪些项目与该段曲线的平均值相差最大


我不是最好的数学人,所以我可能完全用了错误的术语来描述这一点。非常感谢大家的帮助和提示

假设整数值属于正态分布,您可以应用(标准偏差)来查找异常值

假设您希望快速计算整数列表的平均值和标准偏差。您可以这样增强可枚举性:

  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西格玛规则,所有整数值的95%将落在平均值标准偏差(2西格玛)值的两倍以内。所以,你可以说,任何与平均值的差值大于2个标准偏差的值都是异常值

例如,假设您将
计数
值汇总到一个名为
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

假设整数值属于正态分布,则可以应用(标准偏差)来查找异常值

假设您希望快速计算整数列表的平均值和标准偏差。您可以这样增强可枚举性:

  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西格玛规则,所有整数值的95%将落在平均值标准偏差(2西格玛)值的两倍以内。所以,你可以说,任何与平均值的差值大于2个标准偏差的值都是异常值

例如,假设您将
计数
值汇总到一个名为
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

如果你只是在寻找一个起点,我建议进行文献搜索[1],以“检测时间序列数据中的异常值”。如果你能将某种等式拟合到数据中,你可以查看点离曲线有多远。如果系统更复杂,并且不容易建模,那么有很多策略可以遵循,例如

  • 只需查看数据点之间
    count
    中的增量即可。在您的系列中,增量列表是
    [3,0,1,1,-3,-10,9,-1]
    。您可以查找比此列表的平均值超出几个标准偏差的值。实际上,通过查找直线坡度的较大变化来查找尖峰

  • 查看3到5个左右点的较小窗口,例如,首先查看点1,2,3,然后查看点2,3,4,然后查看点3,4,5,等等。这与第一种方法类似,但算法略有不同

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


[1] 这是一个老生常谈的术语,只是说“谷歌”的一种奇特方式。如果你只是在寻找一个起点,我建议你进行文献搜索[1]来“检测时间序列数据中的异常值”。如果你能将某种等式拟合到数据中,你可以看到点离曲线有多远。如果系统更复杂,并且不容易建模,那么有很多策略可以遵循,例如

  • 只需查看数据点之间
    count
    中的增量即可。在您的系列中,增量列表是
    [3,0,1,1,-3,-10,9,-1]
    。您可以查找比此列表的平均值超出几个标准偏差的值。实际上,通过查找直线坡度的较大变化来查找尖峰

  • 查看3到5个左右点的较小窗口,例如,首先查看点1,2,3,然后查看点2,3,4,然后查看点3,4,5,等等。这与第一种方法类似,但算法略有不同

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


[1] 这是一个古老的学校术语,只是用一种奇特的方式来表达“谷歌”

这是corse+1的优点,我想我从来没有在数学或统计方面成为全明星,所以我只是想知道其他人以前是否有过这种挑战,并认为可能有一种标准的方法来解决这个问题,但不是真的。。任何方式伟大的输入谢谢!嗯,是的。。。很多人以前都有过这样的挑战。。。我将在我的回答中添加一些关于非Ruby解决方案的信息……实际上,我没有任何具体的信息,但我怀疑可能有Python库可以处理这类事情。也许可以移植到Ruby。嗯。事实上,我也会先达到R。这里的分数很好,所以对于corse+1,我想我从来没有在数学o方面成为过全明星