考虑一下下面的的问题:

你有一列浮点类型的数字。这绝不是令人讨厌的恶作剧----没有无穷个数字或无限大的数字,仅仅只是正常的“简单的”浮点型的数字。

现在:计算其平均值。你能做到吗?

事实证明这是一个很困难的问题,想要得到该平

使用Hypothesis库来考虑以下的测试案列:

这并不是关于正确性的测试,只是测试平均值是否在列表的合理的限制范围内:在不作为平均值的情况下,有许多函数可以满足这个要求。最小值和最大值函数都满足这个要求,中值函数也是如此。

然而,几乎没有人的平均值计算方法满足这个要求。

为了理解其中的原因,写下了我们自己的平均值计算方法:

这看起来十分合理--它正是平均值的定义--但是,它是错误的:

其问题在于有限的浮点数可能足够大,以至于它们的和溢出到无穷大。然后当你用无穷大除以一个有限的数时,你仍然会得到无穷大,这就意味着超出了范围。

所以,为了阻止有限的浮点数之和的溢出,我们尝试通过列表的长度来限制我们的数字大小:

在这种情况下,你遇到的问题不是溢出,而是浮点数的精度不够:浮点数只能精确到一个整数的2次幂,因此除以3会导致舍入错误。在这种情况下我们有一个问题,就是(x/3)* 3一般不等于x本身。

所以,现在我们理解了为什么求平均值可能非常困难。让我们看看现有的方法是如何满足这个测试的。

首先,我们尝试使用numpy库:

这遇到了我们在第一次实验中遇到的问题:

Python3.4还提供了新的统计模块。糟糕的是,这个模块也出现了问题(在Python3.5.2中得到了修复):

在之前溢出到无穷大的情况下,这反而会产生一个错误。该错误产生的原因是统计模块在内部将所有数字都转化成Fraction类型,这是一种任意精度的有理数类型。由于一些细节,即在何时何地被转化为浮点数,这就产生了一个不容易被转化为浮点数的有理数。

编写一个通过测试的方法相对容易,仅仅需要简单的作弊,而不需要实际计算出其平均值:

也就是说,将值限制在期望的范围内。

然而,编写一个真正地,正确的平均值计算方法(可以通过测试的)是相当困难的:

为了理解其困难程度,这里有一篇30页的关于计算两个数的平均值的论文。

如果我是你,我就不会去看那篇论文。我已经阅读过这篇论文了,但我并没有记得很多细节。

这个测试是一个很好的实例:一旦你编写的代码没有崩溃,测试工作正常进行,就可以开始在结果值上添加额外的约束。正如本例所示,即使你添加的约束非常宽松,它也常常会捕获到一些有趣的bug。

它还证明了一个问题:浮点数运算非常困难,这使得它不太适合用Hypothesis库进行验证。

这并不是因为Hypothesis库不擅长测试浮点代码,而是因为它善于向人们展示编程的实际难度,而浮点编码比人们所预想的要难得多。

因此,你或许并不会在意它将发现的一些bug:一般来说,大多数人对于浮点数错误的态度是,”那些数字好奇怪,我们并不真的在意它们。或许已经足够好了“。如果你希望你的浮点代码是正确的,那么数值敏感度分析工作是必不可少的,但是很少有人能够完成这种高要求的工作。

我过去经常用这个例子来向人们演示Hypothesis库,但由于这些问题,我不会再这样做了:告诉人们他们并不想要修复的bug,既不会修复bug,也不会得到朋友。

但是,值得知道的是,这是一个问题:编程是非常困难的,而忽略这些问题并不会使它变得容易。你可以忽略正确性问题,直到它们真正给你造成麻烦为止,但是当它们给你带来麻烦时,最好不要感到惊讶。

而且,一些通用的技术也值得被牢记,因为这不仅仅是对浮点数有用:大多数的代码可以从中受益,而且大多数时候它告诉你的bug不会那么令人不快。

英文原文:https://hypothesis.works/articles/calculating-the-mean/ 译者:Lyx

qregexp限制数字范围_计算一列数字的平均值相关推荐

  1. matlab朴素贝叶斯手写数字识别_从“手写数字识别”学习分类任务

    机器学习问题可以分为回归问题和分类问题,回归问题已经在线性回归讲过,本文学习分类问题.分类问题跟回归问题有明显的区别,回归问题是连续的数值,而分类问题是离散的类别,比如将性别分为[男,女],将图片分为 ...

  2. python如下函数返回两个数的平方和_计算Lis中数字平方和的函数

    我试着写一个平方和(xs)函数来计算列表xs中数字的平方和.例如,平方和([2,3,4])应返回4+9+16,即29: 我试过的是:import random xs = [] #create thre ...

  3. python两列时间间隔计算器_计算两列之间的Pandas DataFrame时间差异(以小时和分钟为单位)...

    熊猫的时间戳差异返回datetime.timedelta对象.可以使用* as_type *方法将其轻松转换为小时,就像这样 import pandas df = pandas.DataFrame(c ...

  4. python数字识别_利用Python进行数字识别

    思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...

  5. python 仪表数字识别_利用Python进行数字识别

    思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...

  6. 数字练习_为什么要练习数字简约

    数字练习 重点 (Top highlight) Disclaimer: This article does not contain any affliate links Back in 2018, R ...

  7. dsa数字签名算法_密码学中的数字签名算法(DSA)

    dsa数字签名算法 Digital Signature Algorithm (DSA) is one of the Federal Information Processing Standard fo ...

  8. h5 数字变化_基于JS实现数字动态变化显示效果附源码

    先给大家展示下效果,感觉不错,可以参考实现代码,文末附有源码哦. 1.目标 以液晶电子表样式,动态变化的在指定元素内显示数字. 目标关键词:动态变化(定时器),指定元素(DOM元素ID),数字(num ...

  9. python使用循环嵌套显示数字金字塔_循环嵌套的数字金字塔

    另一种使用列表理解的方法.在 总是将问题分解成可消化的部分.每行都是其自身的一面镜子,所以让我们先来处理我们需要的一组数字.在 这将生成一个包含所有二次幂的字符串的列表,这就是它所生成的lines = ...

最新文章

  1. 【AngularJS】—— 9 自定义过滤器
  2. composer安装其实可以很简单 两行命令就解决了
  3. 空except的慎用
  4. linux下创建用户及组
  5. 开放源代码GIS资源集锦
  6. java VM argument_java之program arguments与VM arguments
  7. Xcode的Architectures和Valid Architectures的区别
  8. JSP学习之include指令
  9. 给指定Python版本安装指定版本库的办法
  10. Mysql问题1862
  11. 使用systemd来构建你的服务
  12. oracle for扫描行,请教索引范围扫描具体IO行为?
  13. 计算机boot进入u盘启动,BIOS中设置U盘启动的几种方法
  14. 磊科linux无线网卡驱动安装步骤,磊科nw360无线网卡安装教程(附磊科nw360驱动下载)...
  15. project安装教程/包
  16. 华为存储iscsi配置_使用华为存储配置ISCSI存储方法和iSCSI建立连接提示目标错误...
  17. gopher对mysql的利用_gopher协议的攻击利用
  18. css 背景图片虚化磨砂效果
  19. 利用APPInventor开发手机APP,实现OBLOQ-IOT与Arduino设备通信
  20. Scratch3.0 二次开发环境部署(一)

热门文章

  1. 基础006 宏基因组入门理论以及分析环境的部署
  2. R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)
  3. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板、brewer、灰度比例)实战(density plot)
  4. 线性模型系数解读中的那些坑,以套索回归(LASSO)和岭回归(Ridege)为例
  5. java linux mysql数据库_Linux Java连接MySQL数据库
  6. FSWD_3_JavaScriptAdvance
  7. Ensembl数据库下载参考基因组(植物拟南芥)
  8. GEO,以GSM2309041这套数据为例,找到需要的sra数据,SRX2159543
  9. 三维基因组染色质环(loop)结构
  10. The Pediatric Cancer Genome Project   儿童癌症基因组计划