log-sum-exp 技巧为什么不递归

2023-11-22

我一直在研究 log-sum-exp 问题。我有一个以对数形式存储的数字列表,我想将其求和并以对数形式存储。

朴素的算法是

def naive(listOfLogs):
    return math.log10(sum(10**x for x in listOfLogs))

许多网站包括:logsumexp 在 C 中的实现? and http://machineintelligence.tumblr.com/post/4998477107/推荐使用

def recommend(listOfLogs):
    maxLog = max(listOfLogs)
    return maxLog + math.log10(sum(10**(x-maxLog) for x in listOfLogs))

aka

def recommend(listOfLogs):
    maxLog = max(listOfLogs)
    return maxLog + naive((x-maxLog) for x in listOfLogs)

我不明白的是,如果推荐的算法更好,为什么我们要递归地调用它? 这会带来更多好处吗?

def recursive(listOfLogs):
    maxLog = max(listOfLogs)
    return maxLog + recursive((x-maxLog) for x in listOfLogs)

当我问是否还有其他技巧可以使该计算在数值上更加稳定?


其他人的一些背景:当您直接计算以下类型的表达式时

ln( exp(x_1) + exp(x_2) + ... )

你可能会遇到两种问题:

  • exp(x_i)可以溢出(x_i太大),导致数字无法相加
  • exp(x_i)可以下溢(x_i太小),导致一堆零

如果所有的值都很大,或者都很小,我们可以除以一些exp(const)并添加const到外面的ln以获得相同的值。因此,如果我们能够选择正确的const,我们可以将值移动到某个范围以防止上溢/下溢。

OP的问题是,我们为什么选择max(x_i)对于这个 const 而不是任何其他值?为什么我们不递归地进行此计算,从每个子集中选取最大值并重复计算对数?

答案:因为没关系.

原因?比方说x_1 = 10很大,并且x_2 = -10是小。 (这些数字甚至不是很大,对吧?)表达式

ln( exp(10) + exp(-10) ) 

会给你一个非常接近10的值。如果你不相信我,那就去试试吧。事实上,一般来说,ln( exp(x_1) + exp(x_2) + ... )将非常接近max(x_i)如果有一些特定的x_i比其他所有的都大得多。 (顺便说一句,这种渐近函数形式实际上可以让您从数学上从一组数字中选择最大值。)

因此,我们选择最大值而不是任何其他值的原因是因为较小的值几乎不会影响结果。如果它们下溢,它们就太小了,无论如何都不会影响总和,因为它会被最大的数字和任何接近它的数字所支配。在计算方面,小数字的贡献将小于ulp计算后ln。因此,如果较小值无论如何都会在最终结果中丢失,则没有理由浪费时间递归计算较小值的表达式。

如果你想对实现这个非常挑剔,你可以除以exp(max(x_i) - some_constant)左右将结果值“居中”在 1 附近以避免溢出和下溢,这可能会给结果带来一些额外的精度。但避免上溢比避免下溢更重要,因为前者决定结果,而后者则不决定,所以这样做要简单得多。

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

log-sum-exp 技巧为什么不递归 的相关文章

  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • Lua 的标准(或最好支持的)大数(任意精度)库是什么?

    我正在处理大量无法四舍五入的数字 使用 Lua 的标准数学库 似乎没有方便的方法来保持精度超过某些内部限制 我还看到有几个库可以加载以处理大数字 http oss digirati com br luabignum http oss dig
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 为什么 Math.Atan(Math.Tan(x)) != x?

    如果 tan x y 并且 atan y x 为什么 Math Atan Math Tan x x 我正在尝试计算 x 例如 tan 2 x 3 5 so atan tan 2 x 3 atan 5 等等 但我已经尝试过 double d
  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 如何将数学公式转换为Python代码?

    有没有简单的方法可以将数学公式转换为 Python 代码 也许是译者 网络参考 具体的书籍章节 任何东西 对于正则表达式 有诸如Kodos http kodos sourceforge net 和网站 例如pythonregex com h
  • 使用浏览器内的 JS 数值求解三角方程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定变量值s v and h 并给定一个库 例如数字 js http www numericjs com index php我怎样才能用数
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • 为什么反向传播神经网络中必须使用非线性激活函数? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在阅读一些有关神经网络的内容 并且了解单层神经网络的一般原理 我理解需要额外的层 但为什么要使用非线性激活函数 这个问题后面跟着这个
  • 转换 google.maps.Point 中的 (x, y) 像素坐标

    我试图根据我的 x y 像素坐标 当然还有地图选项 例如缩放和中心 找出 LatLng 为了做到这一点 我发布了另一个question https stackoverflow com questions 25219346 how to co
  • 构建协同过滤/推荐系统

    我正在设计一个网站 该网站的概念是根据用户的口味向他们推荐各种商品 即他们评价过的项目 添加到收藏夹列表中的项目等 亚马逊 Movielens 和 Netflix 就是这样的例子 现在 我的问题是 我不知道从哪里开始了解这个系统的数学部分
  • 有没有办法根据值是大于 0.5 还是小于 0.5 来进行下限/上限?

    我正在尝试舍入我的价值观 以便如果它是0 5或更大 则变为1 否则就变成0 例如 3 7 gt 4 1 3 gt 1 2 5 gt 3 有任何想法吗 Math Round 3 7 MidpointRounding AwayFromZero
  • 将大数字转换为字母(然后再转换回来)

    是否有一个术语来描述将大数字存储为字母的想法 例如 假设我有 相对较小的 数字 138201162401719 并且我想将字符数缩小到尽可能少的字符数 我知道这无助于节省磁盘空间 英文字母表中有 26 个字母 但我将它们算作 25 个 因为
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • 如何在 C# 中计算 power-of?

    我不太擅长数学 而且 C 似乎没有提供幂函数 所以我想知道是否有人知道我将如何进行这样的计算 var dimensions 100 100 100 00 3 00 See Math Pow http msdn microsoft com e
  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满

随机推荐

  • 如何使用反射将事件处理程序附加到事件?

    我知道关于EventInfo AddEventHandler 可用于将处理程序附加到事件的方法 但是 如果我什至无法定义事件处理程序的正确签名 例如 我什至没有引用处理程序所需的事件参数 该怎么办 我将用正确的代码解释问题 当我的解决方案中
  • 如何在 PdfPCell 中居中对齐模板元素

    我正在构建一个垂直的月份列表 以及每个月的水平天数列表 我每天都会添加一个尺寸和颜色的矩形 大小和颜色取决于数据库查询的值 我在用PdfPTable PdfPCell and cbCreateTemplate提供于这个答案 除了矩形的位置之
  • 无法运行 Robolectric 测试

    我继续得到 java lang NoClassDefFoundError android content pm PackageManager NameNotFoundException java lang ClassNotFoundExce
  • 使用基于 Java 密钥存储中的别名的单个证书

    我有一个密钥库 其中添加了多个密钥和证书 我想使用基于密钥存储中的别名的证书并将其用于 SSL 我尝试设置以下系统属性但没有任何帮助 System setProperty javax net ssl keyAlias abcd System
  • 哪个 iOS 类/代码返回磁北?

    我想获取设备与磁北的偏差 以度为单位 并在我正在编写的一些代码中使用该值 我不想使用设备的定位服务 因此我对获取真北不感兴趣 而是对磁北感兴趣 仅使用设备的磁力计 哪个类 或编码过程 可以为我提供该值 仅依赖于磁力计 CLLocationM
  • PHP 中可以有嵌套类吗?

    我不是在谈论继承 我不是在谈论嵌套对象 我在说话 System Web Templating 一种筑巢 这些是您不应该创建实例的类 所以 No 但是 您可以通过在 getInstance 中返回实例化对象来执行类似的操作 myClass g
  • 谷歌地图使用 PHP 在 MySQL 中保存多边形和点

    现在我有一个应用程序 允许用户在谷歌地图上绘制多边形 我需要使用 PHP 和 MySQL 保存这个多边形 但我不确定最佳实践 我应该启用空间扩展并保存几何图形吗 我应该将每个垂直 纬度 经度对 保存在数组中吗 我不知道的另一种方法 我想知道
  • Internet Explorer 中触发 window.resize 事件

    如您所知 在 Internet Explorer 中 当页面上的任何元素调整大小时 将触发 window resize 事件 页面元素是否通过分配 更改其高度或样式属性 通过简单地向其添加子元素或其他方式来调整页面元素的大小并不重要 即使元
  • C# 数据集访问数据库

    我有一个从 csv 文件动态创建的数据集 我想要做的是将行插入到我的 MS Access 表中 但我不知道从哪里开始 数据集中数据的标头可能会因顺序而异 但标头的名称将始终与 Access 数据库匹配 我是否必须在插入命令中静态调用标头名称
  • WPF 将用户控件属性绑定到父属性

    我创建了一个用户控件 它有 2 个依赖属性 我想将这些依赖属性绑定到 mainViewModel 的属性 以便每当用户控件中的某些内容发生更改时 父级的属性都会更新 我尝试过 可以正常绑定 但没有成功 如何将用户控件的 DP 绑定到父级的属
  • javascript中的第n个孩子

    这是我的 jquery 代码 我需要 javascript 代码来选择第 n 个孩子 是否可以使用 javascript 选择第 n 个孩子
  • 如何剪辑或剪切可组合项?

    如何剪辑或剪切可组合内容以使图像 按钮或可组合项具有自定义形状 这个问题不是关于使用Modifier clip 更像是用替代方法来完成任务 这些方法允许产生不可能的结果 或者当很难创建像云或方圆这样的形状时 This is 分享您的知识 问
  • 如何显示 HTML 资源文件?

    我有一个 html文件在我的assets目录 如何在 Flutter 中显示 渲染它 包裹来自颤动团队昨天发布 webview flutter 如何加载本地资源 将文件添加到项目并更新您的 pubspec assets assets you
  • 在 jQuery 中设置日期格式

    var date Fri Jan 29 2012 06 12 00 GMT 0100 我怎样才能以格式显示它2012 01 29 06 12 在 PHP 中是函数 gt 格式 在 Javascript 中也是格式 但如果我尝试使用它 则会出
  • 使用 useEffect 和异步函数反应错误边界,我缺少什么?

    In my Hello jsx我正在调用一个可能会失败的 API 组件 这里调用了一个假APIloader import React useEffect from react export const Hello gt const load
  • 是否可以更改 docker 容器中的日期?

    我有一个容器 里面有一个正在运行的程序 tomcat 我只需要更改此容器中的日期并测试我的程序行为 我有时间敏感的逻辑 有时需要看看几天或几个月后会发生什么 在docker中可以吗 我读到 如果我更改容器中的日期 主机系统上的日期也会更改
  • 为 Firebase 部署单独的 Cloud Function

    我希望能够为 Firebase 部署单独的 Cloud Function 这样我就不必每次都部署整个项目 没有通过 CLI 的选项 但如果 Google 或 Firebase 公开了一个 REST API 或其他一些接口来简化此操作 那就太
  • 如何将表情符号与 R 正则表达式匹配?

    我想确定矢量的哪些元素包含表情符号 x c no no x 1 U0001f602 no U0001f379 U0001f600 no U0001f61b 相关文章仅涵盖其他语言 并且因为它们大多引用专门的库 所以我无法找到翻译为 R 的方
  • 使用大量控件填充 FlowLayoutPanel 并按需绘制缩略图

    我正在尝试做一个ImageListBox一种可以显示大量缩略图的控件 就像 Picasa 使用的控件一样 这是我的设计 我有一个FlowLayoutPanel那里居住着很多UserControl对象 例如 4 000 个 每个UserCon
  • log-sum-exp 技巧为什么不递归

    我一直在研究 log sum exp 问题 我有一个以对数形式存储的数字列表 我想将其求和并以对数形式存储 朴素的算法是 def naive listOfLogs return math log10 sum 10 x for x in li