检查浮点参数是否正确

2023-12-29

我想编写一个代表马尔可夫链的类(让我们将其命名为MC)。它有一个构造函数,它接受状态转换矩阵(即vector<vector<double>>。我想,检查它是否确实是一个矩阵(具有相同的行数和列数)并且是否确实是一个转换矩阵是一个好主意:其中的所有数字都是概率,即不小于0.0并且不大于1.0,对于每一行,其元素之和为1.0。然而,存在一个由浮点限制引起的问题:例如,求和0.3 + 0.3 + 0.3 + 0.1将不等于1.0,所以检查不会那么容易。所以我看到这个问题的两种可能的解决方案:

  1. 选择一些 epsilon 并与 epsilon 误差进行比较。当然,它现在会接受一些违反转换矩阵属性的矩阵,但一般来说,如果有人偶尔将一些坏数据传递到构造函数中,他就会得到异常。
  2. 不检查任何东西,依赖班级的用户,如果他传递了不好的东西,那完全是他的错,班级的行为将是意想不到的。

什么方法更好、更“真实”?我喜欢第一个,但再次不确定我应该如何选择 epsilon。


做第二个。

您的课程并不负责对浮点数列表进行求和并确定哪些“足够接近”1,哪些不是。你的用户是。你的班级代表马尔可夫链。您将无法选择 epsilon 的值,以便您的类以有用的方式表示马尔可夫链。

考虑一下您要实施的操作。也许您将拥有一个函数,该函数通过链的转移矩阵来满足链状态的概率分布。该函数是否应该检查输入概率分布是否是某个 epsilon 内的概率分布?

您的函数几乎肯定不会保留“是概率分布”属性;当您通过马尔可夫链反复命中概率分布时,由于舍入误差远离概率分布空间,您会得到一些漂移。您可以通过事后标准化来纠正这个问题,但这会导致更多的不准确。

现在想想“给定一个马尔可夫链和一个整数k,返回通过迭代输入链k次形成的马尔可夫链”操作。您可以看到,这将累积舍入并遇到与“马尔可夫链的命中概率分布”相同的问题。

如果您只能在使用 12 小时后损坏的东西和不必要的不​​准确的东西之间做出选择,那不是很糟糕吗?

(当然,检查方阵参数的方性和矩阵性是完全合理的。)

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

检查浮点参数是否正确 的相关文章

随机推荐