有偏差随机游走

318 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

有偏差随机游走

现在我们有一个工作模拟,我们可以开始修改它来研究其他类型的随机游走。例如,假设我们要考虑北半球一个醉酒的农民的行为,他讨厌寒冷,即使在他醉酒的昏迷中,当他的随机动作将他带到南方时,他也能以两倍的速度移动。或者也许是一个总是朝向太阳移动的食光醉汉(早上向东,下午向西)。这些是有偏见的随机游走的例子。步行仍然是随机的,但结果存在偏差。

Eigure 16-6定义了Drunk的两个附加子类。在每种情况下,专业化都涉及为step_choices选择适当的值。函数模拟全部迭代一系列

与原点的距离醉酒的子类,以生成有关每种类型行为的信息。

image.png

类 当我们运行时

image.png

它打印了:

image.png

看来,我们的求热醉酒者比其他两种醉酒更快地远离原点。但是,要消化此输出中的所有信息并不容易。现在又到了摆脱文本输出并开始使用绘图的时候了。

由于我们在同一情节上展示不同类型的醉汉,我们将为每种类型的醉汉关联不同的风格,以便于区分它们。风格将有三个方面:

·线条和标记的颜色

·标记的形状

·线条的种类,例如实线或虚线。

类 style_iterator(图 16-7)在参数定义的一系列样式中旋转style_iterator。init_

image.png

image.png

sim_drunk 和 sim_all_plot 中的打印语句对模拟结果没有任何贡献。它们之所以存在,是因为此模拟可能需要相当长的时间才能完成,并且偶尔打印一条消息,指示正在取得进展,这可能会让可能想知道程序是否确实在取得进展的用户放心。

图 16-9 中的绘图。通过执行

image.png

image.png

通常的醉酒和嗜光性的醉酒(Ew_drunk)似乎以大致相同的速度远离原点,但寻求热量的醉酒(cold_drunk)似乎以几个数量级的速度离开。这很有趣,因为平均而言,他的移动速度只有 25%(他平均每四步走五步)。

让我们构建一个不同的情节来帮助我们更深入地了解这三个类的行为。Eigure 16-10 中的代码不是绘制增加步数的距离随时间的变化,而是绘制单个步数的最终位置分布。

与原点的距离

image.png

plot locs 要做的第一件事是创建一个具有三种样式标记的style_iterator实例。然后,它使用 plt.plot 在对应于每个试验结束的位置放置一个标记。对 plt.plot 的调用使用迭代器style_iterator返回的值设置要绘制的标记的颜色和形状。调用plot_locs(Usual_drunk, Cold_drunk, EW_drunk), 100, 200) 生成图 16-11 中的绘图。

image.png

首先要说的是,我们的醉汉似乎表现得像广告上所说的那样。EW_drunk最终落在x轴上,Cold_drunk似乎向南前进,Usual_drunk似乎漫无目的地徘徊。

但是为什么圆形标记似乎比三角形或+标记少得多?因为EW_drunk的许多散步最终都在同一个地方。考虑到Ew_drunk的可能端点数量(200)很少,这并不奇怪。此外,圆形标记似乎在 x 轴上相当均匀地分布。

至少对我们来说,为什么Cold_drunk平均而言,比其他种类的醉汉离原点更远,这仍然不是很明显的。也许是时候不看许多步道的终点了,而是看一条走路所遵循的路径。Eigure 16-12 中的代码产生了 Eigure 16-13 中的绘图。

原点北/南阶

image.png

image.png

由于步行长达200步,而Ew_drunk的步行不到30个不同的地点,很明显他花了很多时间追溯他的脚步。同样的观察也适用于Usual_drunk。相比之下,虽然Cold_drunk并没有直奔佛罗里达,但他设法花在相对较少的时间参观他已经去过的地方。

这些模拟本身都不是有趣的。(在第18章中,我们将研究更有趣的模拟。但有几点值得带走:

最初,我们将仿真代码分为四个独立的块。其中三个是类(位置、字段和醉酒),对应于出现在

问题的非正式描述。第四个块是一组函数,它们使用这些类来执行简单的模拟。

然后,我们将Drunk详细阐述为类的层次结构,以便我们可以观察不同类型的有偏见的随机游走。代码

原点北/南阶

位置和字段保持不变,但模拟代码已更改为遍历 Drunk 的不同子类。在这样做时,我们利用了类本身就是一个对象,因此可以作为参数传递的事实。最后,我们对模拟进行了一系列增量更改,这些更改不涉及对表示抽象类型的类进行任何更改。这些变化主要涉及引入旨在提供对不同步行的洞察力的地块。这是模拟的典型方式

发达。首先让基本模拟工作,然后开始添加功能。