计算Rails / MySQL中的值分布

时间:2011-07-29 21:53:10

标签: mysql ruby-on-rails statistics

在MYSQL中计算跨行的值分布的最佳方法是什么(或者可能是ruby中的某些计算值)。

示例是通过站点发送的消息的长度。所以我们可以查看所有消息,看看这个消息长100个字符,等等。

然后,对于给定的消息,我想以%返回,比如“此消息长度为90%”与其他消息相比。

注意事项

  • 这些不一定是线性分布,因此这里简单的平均值是不够的
  • 应该以某种方式缓存发行版以进行快速查找,可能需要为单个页面加载提取数十个这样的发行版

也许在ruby中有一些stats package / gem或者有什么好的例子吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以计算数据集的标准差,然后给出数据点,告诉您平均值与标准偏差的距离。

这样你可以说95%等等。

退房:

正态分布:http://www.regentsprep.org/Regents/math/algtrig/ATS2/NormalLesson.htm

答案 1 :(得分:0)

计算标准偏差和数据平均值以及进行反向正常查找的问题在于您正在做出非常严格的限制性假设。如果您的数据不正常怎么办?在很多情况下,这是一个非常糟糕的假设。

理想情况下,您希望回答此问题非参数,即无需依赖某些分布式假设。一种方法是使用MySQL视图:

http://www.mysqltutorial.org/mysql-views-tutorial.aspx

假设您要计算表中每行的消息长度的百分位数,您可以尝试创建一个MySQL视图,对于第i行,计算小于或等于消息长度的其他消息长度的数量对于我的行。由于每次插入时表都会更新一次,因此查找速度很快。

如果MySQL视图的计算速度太慢,您也可以尝试将以下逻辑插入数据访问层的写入中:

  1. 在表格中创建您自己的“#messages length less or equal me me”列。
  2. 在新行插入时,使用适当的直接SQL计数表达式填充此行的“#messages length less or equal me”列。
  3. 同样在新行插入时,遍历此表中的所有其他行,并对消息长度大于新行消息长度的所有行递增此“消息长度小于或等于我”。
  4. 因为你的问题在排名中非常线性,我们可以通过使用后一种方法将O(n ^ 2)复杂度降低到O(n)。希望这会有所帮助。

    此外,如果您有兴趣进行其他操作而不仅仅是百分位数,请查看此博客,了解有关规范化,缩放,排名等的信息。它包含一些关于数据发生情况的良好图形,尽管它是书面的对于

    http://www.redowlconsulting.com/Blog/post/2011/07/28/StatisticalTricksForLists.aspx