Julia 此马尔可夫链模型中鼠标的预期寿命

Julia 此马尔可夫链模型中鼠标的预期寿命,julia,probability,markov-chains,Julia,Probability,Markov Chains,我正在阅读,并决定编写一些Julia代码来实证确认分析结果: P = [ 0 0 0.5 0 0.5 ; 0 0 1 0 0 ; 0.25 0.25 0 0.25 0.25; 0 0 0.5 0 0.5 ; 0 0 0 0 1 ] prob_states = transpose(

我正在阅读,并决定编写一些Julia代码来实证确认分析结果:

P = [ 
  0     0       0.5     0       0.5 ;
  0     0       1       0       0   ;
  0.25  0.25    0       0.25    0.25;
  0     0       0.5     0       0.5 ;
  0     0       0       0       1
]
prob_states = transpose([0.0, 1, 0, 0, 0])
prob_end = [0.0]
for i in 1:2000
  prob_states = prob_states * P
  prob_end_new = (1 - sum(prob_end)) * prob_states[end]
  push!(prob_end, prob_end_new)
  println("Ending probability: ", prob_end_new)
  println("Cumulative: ", sum(prob_end))
end
println("Expected lifetime: ", sum(prob_end .* Array(1:2001)))
这里,
p
是转移矩阵,
prob\u states
是每次迭代时状态的概率分布,
prob\u end
是每个步骤终止概率的数组(例如,
prob\u end[3]
是步骤3终止概率)

根据该脚本的结果,鼠标的预期寿命约为4.3,而分析结果为4.5。这个脚本对我来说很有意义,所以我真的不知道它哪里出了问题。有人能帮忙吗


另外,将迭代次数增加一个数量级几乎不会改变什么

老鼠存活的概率很快接近于零。这不仅对鼠标来说是不幸的,对我们来说也是不幸的,因为我们不能使用64位浮点数(Julia在这里默认使用)来精确地近似这些微小的生存时间值

事实上,在相对较低的迭代次数后,大多数值
prob_end
都相同为零,但从分析角度来看,这些值不应完全为零。
Float64
类型根本无法表示如此小的正数

这就是为什么数组的乘法和求和永远不会达到4.5;将总和推近该值的步骤失败,因为它们等于零。我们看到收敛到较低的值

也许可以使用一种不同的类型来表示任意微小的正值。这里有一些建议,但是当执行这个马尔可夫链模型的几百次迭代时,您可能会发现它们非常慢,而且内存非常大


另一种解决方案是将代码转换为可使用的代码(通常用于克服浮点数的这一限制)。

如果您只想根据经验确认结果,可以直接模拟模型:

const first_index=1
const last_index=5
常数cat_start=2
常数鼠标\u开始=4
功能移动(一)
如果i==第一个索引
返回第一个索引+1
elseif i==最后的索引
返回上一个索引-1
其他的
返回i+rand([-1,1])
结束
结束
功能步骤(猫、鼠标)
返回移动(cat),移动(鼠标)
结束
功能游戏(猫,鼠标)
i=1
当猫老鼠
猫,老鼠=步(猫,老鼠)
i+=1
结束
返回i
结束
函数运行()
res=[游戏(猫开始,鼠标开始)i=1:10\u 000\u 000]
返回平均值(res)、标准值(res)/sqrt(长度(res))
结束
μ、 σ=运行()
println(“平均寿命:$μ±$σ”)
示例输出:

平均寿命:4.5004993±0.0009083568998918751

在处理Hadoop贡献时,我已经多次运行M/R Monte Carlo Pi估算,后来我确信Pi truly的值为3。12当处理0和1时,对数概率解决方案很快会遇到新问题,例如,log(0+1)将使用维基百科页面上的公式返回NaN。