3

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

  1. 选择一些 epsilon 并与 epsilon error 进行比较。当然它现在会接受一些违反转移矩阵属性的矩阵,但一般来说,如果有人偶尔将一些坏数据传递给构造函数,他会得到一个异常。
  2. 什么都不检查,靠班级的用户,如果他通过了不好的东西,那完全是他的错,班级的行为会出乎意料。

哪种方法更好,更“真实”?我喜欢第一个,但同样,我不确定我应该如何选择 epsilon。

4

1 回答 1

3

做第二个。

你的班级不是在总结浮点数列表并决定什么“足够接近”1,什么不是。你的用户是。你的类代表马尔可夫链。您将无法选择 epsilon 的值,以便您的类以有用的方式表示马尔可夫链。

想想你将要实施的操作。也许您将拥有一个函数,该函数使用链的转移矩阵在链的状态上达到概率分布。该函数是否应该检查输入概率分布是否是某个 epsilon 内的概率分布?

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

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

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

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

于 2013-04-13T05:48:29.687 回答