提交 5239e5ec 编写于 作者: W wizardforcel

ex43

上级 92e6d881
# 练习42:一个简单的统计引擎
# 练习43:一个简单的统计引擎
> 原文:[Exercise 43: A Simple Statistics Engine](http://c.learncodethehardway.org/book/ex43.html)
......@@ -308,3 +308,45 @@ RUN_TESTS(all_tests);
## 如何使用
你可以使用标准差和均值来决定一个新的样本是否是“有趣”的,或者你可以使用它们计算统计量的统计量。前者对于人们来说更容易理解,所以我用登录的例子来做个简短的解释。
假设你在跟踪人们花费多长时间在一台服务器上,并且你打算用统计来分析它。每次有人登录进来,你都对它们在这里的时长保持跟踪,之后调用`Stats_sample`函数。我会寻找停留“过长”时间的人,以及“过短”的人。
比起设定特殊的级别,我更倾向于将一个人的停留时间与`mean (plus or minus) 2 * stddev`这个范围进行比较。我计算出`mean``2 * stddev`,并且如果它们在这个范围之外,我就认为是“有趣”的。由于我使用了联机算法来维护这些统计量,所以它非常快,并且我可以使软件标记在这个范围外的用户。
这不仅仅用于找出行为异常的用户,更有助于标记一些潜在的问题,你可以查看它们来观察发生了什么。它基于所有用户的行为来计算,这也避免了你任意挑出一个数值而并不基于实际情况的问题。
你可以从中学到的通用规则是,`mean (plus or minus) 2 * stddev`是90%的值预期所属的范围预测值,任何在它之外的值都是有趣的。
第二种利用这些统计量的方式就是继续将其用于其它的`Stats`计算。基本上像通常一样使用`Stats_sample`,但是之后在`min``max``n``mean``stddev`上执行`Stats_sample`。这会提供二级的度量,并且让你对比样本的样本。
被搞晕了吗?我会以上面的例子基础,并且假设你拥有100台服务器,每台都运行一个应用。你已经在每个应用服务器上跟踪了用户的登录时长,但是你想要比较所有的这100和应用,并且标记它们当中任何登录时间过长的用户。最简单的方式就是每次有人登录进来时,计算新的登录统计量,之后将`Stats structs`的元素添加到第二个`Stats`中。
你最后应该会得到一些统计量,它们可以这样命名:
均值的均值
这是一个`Stats struct`,它向你提供所有服务器的均值的`mean``stddev`。你可以用全局视角来观察任何在此之外的用户或服务器。
标准差的均值
另一个`Stats struct`,计算这些服务器的分布的统计量。你之后可以分析每个服务器并且观察是否它们中的任何服务器具有异常分散的分布,通过将它们的`stddev`和这个`mean of stddevs`统计量进行对比。
你可以计算出全部统计量,但是这两个是最有用的。如果你打算监视服务器上的移除登录时间,你可以这样做:
+ 用户John登录并登出服务器A。获取服务器A的统计量,并更新它们。
+ 获取`mean of means`统计量,计算出A的均值并且将其加入样本。我叫它`m_of_m`
+ 获取`mean of stddev`统计量,将A的标准差添加到样本中。我叫它` m_of_s`
+ 如果A的`mean``m_of_m.mean + 2 * m_of_m.stddev`范围外,标记它可能存在问题。
+ 如果A的`stddev``m_of_s.mean + 2 * m_of_s.stddev`范围外,标记它可能存在行为异常。
+ 最后,如果John的登录时长在A的范围之外,或A的`m_of_m`范围之外,标记为有趣的。
通过计算“均值的均值”,或者“标准差的均值”,你可以以最小的执行和储存总量,有效地跟踪许多度量。
## 附加题
+`Stats_stddev``Stats_mean`转换为`static inline`函数,放到`stats.h`文件中,而不是`stats.c`文件。
+ 使用这份代码来编写`string_algos_test.c`的性能测试。使它为可选的,并且运行基准测试作为一系列样本,之后报告结果。
+ 编写它的另一个语言的版本。确保这个版本基于我的数据正确执行。
+ 编写一个小型程序,它能从文件读取所有数字,并执行这些统计。
+ 使程序接收一个数据表,其中第一行是表头,剩下的行含有任意数量空格分隔的数值。你的程序应该按照表头中的名称,打印出每一列的统计值。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册