如何通用地减少子集平均值的计算?

2024-05-10

Edit:由于似乎没有人阅读此链接的原始问题,因此让我在这里介绍一下它的概要。

正如其他人所问的,最初的问题是,给定大量值,总和将超过数据类型的值Double那么如何计算这些值的平均值呢?

有几个答案说要按集合计算,比如取50个和50个数字,计算这些集合内的平均值,然后最后取所有这些集合的平均值,然后将它们组合起来得到最终平均值。

我的立场是,除非你能保证所有这些值都可以分成多个大小相等的集合,你不能使用这种方法。有人鼓励我在这里问这个问题,以便提供答案,所以就在这里。

基本上,给定任意数量的值,其中:

  • 我事先知道值的数量(但同样,如果你不知道,你的答案会如何改变?)
  • 我无法收集所有数字,也无法对它们求和(对于您的编程语言中的正常数据类型来说,总和太大了)

我怎样才能计算平均值?

这里问题的其余部分概述了如何分割成相同大小的集合,以及该方法存在的问题,但我真的只是想知道如何做到这一点。

请注意,我对数学非常了解,知道用数学理论术语来说,计算A[1..N]/N会给我平均值,让我们假设有一些原因导致它不那么简单,并且我需要分割工作负载,并且值的数量不一定能被 3, 7, 50 整除、 1000 或其他。

换句话说,我所追求的解决方案必须是通用的。


从这个问题来看:

  • 当所有值的总和超过双精度限制时,计算平均值的好解决方案是什么? https://stackoverflow.com/questions/1930454/what-is-a-good-solution-for-calculating-an-average-where-the-sum-of-all-values-ex

我的立场是,将工作负载分成几组是不好的,除非您可以确保这些组的大小相等。


Edit:最初的问题是关于特定数据类型可以容纳的上限,并且由于他要对很多数字进行求和(示例中给出的计数是 10^9),因此该数据类型无法容纳总和。由于这是原始解决方案中的一个问题,我假设(这是我的问题的先决条件,很抱歉错过了)数字太大,无法给出任何有意义的答案。

因此,直接除以值的总数是不行的。正常的 SUM/COUNT 解决方案被淘汰的最初原因是 SUM 会溢出,但我们假设,对于这个问题 SET-SET/SET-SIZE 会下溢,或者其他什么。

重要的是我不能简单地求和,也不能简单地除以总值的数量。如果我做不到这一点,我的方法是否有效,我能做些什么来解决这个问题?


让我概述一下问题。

假设您要计算数字 1 到 6 的平均值,但您不能(无论出于何种原因)通过对数字求和、对数字进行计数,然后将总和除以计数来实现此目的。换句话说,你不能简单地做(1+2+3+4+5+6)/6。

换句话说,SUM(1..6)/COUNT(1..6)出来了。我们在这里不考虑 NULL(如数据库中的 NULL)。

该问题的几个答案提到能够将要平均的数字分成几组,例如 3、50 或 1000 个数字,然后计算一些数字,最后将这些值组合起来以获得最终平均值。

我的立场是,这在一般情况下是不可能的,因为这将使一些数字,即出现在最终集中的数字,比之前集中的所有数字或多或少有价值,除非你可以将所有数字平均分成大小的集合。

例如,要计算 1-6 的平均值,您可以将其分成 3 个数字组,如下所示:

/ 1   2   3 \   / 4   5   6 \
| - + - + - | + | - + - + - |
\ 3   3   3 /   \ 3   3   3 /  <-- 3 because 3 numbers in the set
 ----------      -----------
      2               2        <-- 2 because 2 equally sized groups

这给了你这个:

      2               5
      -       +       - = 3.5
      2               2

(注意:(1+2+3+4+5+6)/6 = 3.5,所以这里是正确的)

然而,我的观点是,一旦无法将值的数量拆分为多个相同大小的集合,则此方法就会失效。例如,序列 1-7 怎么样,其中包含质数个值。

可以采用类似的方法,但不能求和all值和计数all这些价值观一次性有效吗?

那么,有这样的做法吗?如何计算满足以下条件的任意数量的值的平均值:

  1. 无论出于何种原因,我都无法采用正常的求和/计数方法
  2. 我事先知道值的数量(如果不知道怎么办,这会改变答案吗?)

好吧,假设您将三个数字相加并除以三,然后将两个数字相加并除以二。你能从这些中得到平均值吗?

x = (a + b + c) / 3
y = (d + e) / 2
z = (f + g) / 2

而你想要

r = (a + b + c + d + e + f + g) / 7

那等于

r = (3 * (a + b + c) / 3 + 2 * (d + e) / 2 + 2 * (f + g) / 2) / 7
r = (3 * x + 2 * y + 2 * z) / 7

当然,上面的两行都会溢出,但由于除法是分配性的,所以我们这样做

r = (3.0 / 7.0) * x + (2.0 / 7.0) * y + (2.0 / 7.0) * z

这保证了你不会溢出,因为我将 x、y 和 z 乘以小于 1 的分数。

这是这里的基本点。我既没有预先将所有数字除以总数,也没有超过溢出。

所以...如果你不断向累加器添加,跟踪添加了多少个数字,并始终测试下一个数字是否会导致溢出,然后你可以获得部分平均值,并计算最终平均值。

不,如果您事先不知道这些值,则不会改变任何内容(前提是您可以在求和时对它们进行计数)。

这是一个执行此操作的 Scala 函数。这不是 Scala 惯用的,所以更容易理解:

def avg(input: List[Double]): Double = {
  var partialAverages: List[(Double, Int)] = Nil
  var inputLength = 0
  var currentSum = 0.0
  var currentCount = 0
  var numbers = input

  while (numbers.nonEmpty) {
    val number = numbers.head
    val rest = numbers.tail
    if (number > 0 && currentSum > 0 && Double.MaxValue - currentSum < number) {
      partialAverages = (currentSum / currentCount, currentCount) :: partialAverages
      currentSum = 0
      currentCount = 0
    } else if (number < 0 && currentSum < 0 && Double.MinValue - currentSum > number) {
      partialAverages = (currentSum / currentCount, currentCount) :: partialAverages
      currentSum = 0
      currentCount = 0
    }
    currentSum += number
    currentCount += 1
    inputLength += 1
    numbers = rest
  }
  partialAverages = (currentSum / currentCount, currentCount) :: partialAverages

  var result = 0.0
  while (partialAverages.nonEmpty) {
    val ((partialSum, partialCount) :: rest) = partialAverages
    result += partialSum * (partialCount.toDouble / inputLength)
    partialAverages = rest
  }

  result
}

编辑: 乘以 2 和 3 不会让我回到“不支持该数据类型”的范围吗?

不。如果你最后在 7 点跳水,那绝对不行。但在这里,您要对总和的每一步进行除法。即使在你的真实情况下,权重(2/7 and 3/7)将在可管理的数字范围内(例如1/10 ~ 1/10000)与您的体重相比不会产生太大差异(即1).

PS:我想知道为什么我要研究这个答案,而不是写我的答案,这样我就可以赢得我的代表:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通用地减少子集平均值的计算? 的相关文章

  • Python 小数.InvalidOperation 错误

    当我运行这样的东西时 我总是收到此错误 from decimal import getcontext prec 30 b 2 3 Decimal b Error Traceback most recent call last File Te
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • “此应用程序已请求运行时以异常方式终止它”的原因是什么?

    Visual C 运行时抛出一个常见错误 此应用程序已请求运行时以异常方式终止它 请联系应用程序的支持团队以获取更多信息 该错误消息实际上是什么意思mean 让我用一个比喻来准确地解释我的问题 如果我看到一条消息 异常 访问冲突 0xc00
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但
  • 有 JavaScript 的微积分库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 JavaScript 的微积分库吗 我做了一些谷歌搜索 但没有想出任何东西 我申请了 Wolf
  • R 中按时间划分的平均值

    我每秒测量一次化合物浓度 我想求 30 秒和 60 秒的平均值 我一直在阅读这里的帖子 我尝试过lubridate and dplyr 但没有运气 我正在努力完成这项工作 但我一直没能做到 我正在从 SAS 过渡到 R 所以请耐心等待 这是
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 重新创建 CSS3 过渡三次贝塞尔曲线

    在 CSS3 过渡中 您可以将计时函数指定为 cubic bezier 0 25 0 3 0 8 1 0 在该字符串中 您仅指定曲线上点 P1 和 P2 的 XY 因为 P0 和 P3 始终分别为 0 0 0 0 和 1 0 1 0 根据苹
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N

随机推荐