Python 生成数据(随机漫步)

news/2025/3/20 21:37:20/

数据可视化 指的是通过可视化表示来探索数据,它与数据挖掘 紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表
示的小型数字列表,也可以是数以吉字节的数据。

随机漫步

在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步 是这样行走得到的路径:每次行走都完全是随机的,没有
明确的方向,结果是由一系列随机决策决定的。你可以这样认为,随机漫步就是蚂蚁在晕头转向的情况下,每次都沿随机的方向前行所经过的路径。

在自然界、物理学、生物学、化学和经济领域,随机漫步都有其实际用途。例如,漂浮在水滴上的花粉因不断受到水分子的挤压而在水面上移动。水滴中的分子运动是随机的,
因此花粉在水面上的运动路径犹如随机漫步。我们稍后将编写的代码模拟了现实世界的很多情形。

创建RandomWalk() 类

为模拟随机漫步,我们将创建一个名为RandomWalk 的类,它随机地选择前进方向。这个类需要三个属性,其中一个是存储随机漫步次数的变量,其他两个是列表,分别存储随
机漫步经过的每个点的 x 和 y 坐标。

RandomWalk 类只包含两个方法:init() 和fill_walk() ,其中后者计算随机漫步经过的所有点。下面先来看看__init__() ,如下所示:

❶ from random import choice
class RandomWalk():"""一个生成随机漫步数据的类"""
❷   def __init__(self, num_points=5000):"""初始化随机漫步的属性"""self.num_points = num_points# 所有随机漫步都始于(0, 0)
❸       self.x_values = [0]self.y_values = [0]

为做出随机决策,我们将所有可能的选择都存储在一个列表中,并在每次做决策时都使用choice() 来决定使用哪种选择(见❶)。接下来,我们将随机漫步包含的默认点数设
置为5000,这大到足以生成有趣的模式,同时又足够小,可确保能够快速地模拟随机漫步(见❷)。然后,在❸处,我们创建了两个用于存储x 和y 值的列表,并让每次漫步都从
点(0, 0)出发。

选择方向

我们将使用fill_walk() 来生成漫步包含的点,并决定每次漫步的方向,如下所示。请将这个方法添加到random_walk.py中:

def fill_walk(self):"""计算随机漫步包含的所有点"""# 不断漫步,直到列表达到指定的长度
❶   while len(self.x_values) < self.num_points:# 决定前进方向以及沿这个方向前进的距离
❷   x_direction = choice([1, -1])x_distance = choice([0, 1, 2, 3, 4])
❸   x_step = x_direction * x_distancey_direction = choice([1, -1])y_distance = choice([0, 1, 2, 3, 4])
❹   y_step = y_direction * y_distance# 拒绝原地踏步
❺   if x_step == 0 and y_step == 0:continue# 计算下一个点的x和y值
❻   next_x = self.x_values[-1] + x_stepnext_y = self.y_values[-1] + y_stepself.x_values.append(next_x)self.y_values.append(next_y)

在❶处,我们建立了一个循环,这个循环不断运行,直到漫步包含所需数量的点。这个方法的主要部分告诉Python如何模拟四种漫步决定:向右走还是向左走?沿指定的方向走多
远?向上走还是向下走?沿选定的方向走多远?

我们使用choice([1, -1]) 给x_direction 选择一个值,结果要么是表示向右走的1,要么是表示向左走的-1(见❷)。接下来,choice([0, 1, 2, 3, 4]) 随机地
选择一个0~4之间的整数,告诉Python 沿指定的方向走多远(x_distance )。(通过包含0,我们不仅能够沿两个轴移动,还能够沿y 轴移动。)

在❸和❹处,我们将移动方向乘以移动距离,以确定沿 x 和 y 轴移动的距离。如果x_step 为正,将向右移动,为负将向左移动,而为零将垂直移动;如果y_step 为正,就意
味着向上移动,为负意味着向下移动,而为零意味着水平移动。如果x_step 和y_step 都为零,则意味着原地踏步,我们拒绝这样的情况,接着执行下一次循环(见❺)。

为获取漫步中下一个点的 x 值,我们将x_step 与x_values 中的最后一个值相加(见❻),对于 y 值也做相同的处理。获得下一个点的 x 值和 y 值后,我们将它们分别附加到
列表x_values 和y_values 的末尾。

绘制随机漫步图

下面的代码将随机漫步的所有点都绘制出来:

import matplotlib.pyplot as plt
from random_walk import RandomWalk
# 创建一个RandomWalk实例,并将其包含的点都绘制出来
❶ rw = RandomWalk()
rw.fill_walk()
❷ plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()

我们首先导入了模块pyplot 和RandomWalk 类,然后创建了一个RandomWalk 实例,并将其存储到rw 中(见❶),再调用fill_walk() 。在❷处,我们将随机漫步包含的
x 和 y 值传递给scatter() ,并选择了合适的点尺寸。图15-8显示了包含5000个点的随机漫步图(本节的示意图未包含matplotlib查看器部分,但你运行rw_visual.py时,依然会看
到)。

image

模拟多次随机漫步

每次随机漫步都不同,因此探索可能生成的各种模式很有趣。要在不多次运行程序的情况下使用前面的代码模拟多次随机漫步,一种办法是将这些代码放在一个while 循环中,
如下所示:

import matplotlib.pyplot as plt
from random_walk import RandomWalk
# 只要程序处于活动状态,就不断地模拟随机漫步
while True:# 创建一个RandomWalk实例,并将其包含的点都绘制出来rw = RandomWalk()rw.fill_walk()plt.scatter(rw.x_values, rw.y_values, s=15)plt.show()
❶   keep_running = input("Make another walk? (y/n): ")if keep_running == 'n':
break

这些代码模拟一次随机漫步,在matplotlib查看器中显示结果,再在不关闭查看器的情况下暂停。如果你关闭查看器,程序将询问你是否要再模拟一次随机漫步。如果你输入y ,可
模拟多次随机漫步:这些随机漫步都在起点附近进行,大多沿特定方向偏离起点,漫步点分布不均匀等。要结束程序,请输入n 。

注意  如果你使用的是Python 2.7,别忘了将❶处的input() 替换为raw_input() 。

设置随机漫步图的样式

在本节中,我们将定制图表,以突出每次漫步的重要特征,并让分散注意力的元素不那么显眼。为此,我们确定要突出的元素,如漫步的起点、终点和经过的路径。接下来确定
要使其不那么显眼的元素,如刻度标记和标签。最终的结果是简单的可视化表示,清楚地指出了每次漫步经过的路径。

给点着色

我们将使用颜色映射来指出漫步中各点的先后顺序,并删除每个点的黑色轮廓,让它们的颜色更明显。为根据漫步中各点的先后顺序进行着色,我们传递参数c ,并将其设置为
一个列表,其中包含各点的先后顺序。由于这些点是按顺序绘制的,因此给参数c 指定的列表只需包含数字1~5000,如下所示:

--snip--
while True:# 创建一个RandomWalk实例,并将其包含的点都绘制出来rw = RandomWalk()rw.fill_walk()
❶   point_numbers = list(range(rw.num_points))plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues,edgecolor='none', s=15)plt.show()keep_running = input("Make another walk? (y/n): ")

在❶处,我们使用了range() 生成了一个数字列表,其中包含的数字个数与漫步包含的点数相同。接下来,我们将这个列表存储在point_numbers 中,以便后面使用它来设
置每个漫步点的颜色。我们将参数c 设置为point_numbers ,指定使用颜色映射Blues ,并传递实参edgecolor=none 以删除每个点周围的轮廓。最终的随机漫步图从浅蓝
色渐变为深蓝色,如图
image

重新绘制起点和终点

除了给随机漫步的各个点着色,以指出它们的先后顺序外,如果还能呈现随机漫步的起点和终点就更好了。为此,可在绘制随机漫步图后重新绘制起点和终点。我们让起点和终
点变得更大,并显示为不同的颜色,以突出它们,如下所示:

--snip--
while True:--snip--plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues,
edgecolor='none', s=15)# 突出起点和终点plt.scatter(0, 0, c='green', edgecolors='none', s=100)plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none',
s=100)plt.show()--snip--

为突出起点,我们使用绿色绘制点(0, 0),并使其比其他点大(s=100 )。为突出终点,我们在漫步包含的最后一个 x 和 y 值处绘制一个点,将其颜色设置为红色,并将尺寸设置
为100。请务必将这些代码放在调用plt.show() 的代码前面,确保在其他点的上面绘制起点和终点。
如果你现在运行这些代码,将能准确地知道每次随机漫步的起点和终点(如果起点和终点不明显,请调整它们的颜色和大小,直到明显为止)。

隐藏坐标轴

下面来隐藏这个图表中的坐标轴,以免我们注意的是坐标轴而不是随机漫步路径。要隐藏坐标轴,可使用如下代码:

while True:--snip--plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none',
s=100)# 隐藏坐标轴
❶   plt.axes().get_xaxis().set_visible(False)plt.axes().get_yaxis().set_visible(False)plt.show()--snip--

为修改坐标轴,使用了函数plt.axes() (见❶)来将每条坐标轴的可见性都设置为False 。随着你越来越多地进行数据可视化,经常会看到这种串接方法的方式。
如果你现在运行rw_visual.py,将看到一系列图形,但看不到坐标轴。

增加点数

下面来增加点数,以提供更多的数据。为此,我们在创建RandomWalk 实例时增大num_points 的值,并在绘图时调整每个点的大小,如下所示:

--snip--
while True:#创建一个RandomWalk实例,并将其包含的点都绘制出来rw = RandomWalk(50000)rw.fill_walk()# 绘制点并将图形显示出来point_numbers = list(range(rw.num_points))plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues,edgecolor='none', s=1)--snip--

这个示例模拟了一次包含50 000个点的随机漫步(以模拟现实情况),并将每个点的大小都设置为1。最终的随机漫步图更纤细,犹如云朵,如图15-10所示。正如你看到的,我们
使用简单的散点图制作出了一件艺术品!
请尝试修改上述代码,看看将漫步包含的点数增加到多少后,程序的运行速度变得极其缓慢或绘制出的图形变得很难看。

image

调整尺寸以适合屏幕

图表适合屏幕大小时,更能有效地将数据中的规律呈现出来。为让绘图窗口更适合屏幕大小,可像下面这样调整matplotlib输出的尺寸:

    --snip--while True:# 创建一个RandomWalk实例,并将其包含的点都绘制出来rw = RandomWalk()rw.fill_walk()# 设置绘图窗口的尺寸plt.figure(figsize=(10, 6))--snip--

函数figure() 用于指定图表的宽度、高度、分辨率和背景色。你需要给形参figsize 指定一个元组,向matplotlib指出绘图窗口的尺寸,单位为英寸。
Python假定屏幕分辨率为80像素/英寸,如果上述代码指定的图表尺寸不合适,可根据需要调整其中的数字。如果你知道自己的系统的分辨率,可使用形参dpi 向figure() 传递
该分辨率,以有效地利用可用的屏幕空间,如下所示:

plt.figure(dpi=128, figsize=(10, 6))

http://www.ppmy.cn/news/1580687.html

相关文章

POI和EasyExcel---处理Excel

01 Apache POI简介 Apache POI 是一个开源的Java库&#xff0c;用于处理Microsoft Office格式的文档。它提供了丰富的API&#xff0c;允许开发者在Java应用中读取、写入和操作Excel、Word、PowerPoint等文件&#xff0c;是处理Office文档的常用工具。 核心功能 • 支持多种格…

BFS,DFS带图详解+蓝桥杯算法题+经典例题

1.BFS和DFS的定义与实现方式 1.1 深度优先搜索&#xff08;DFS&#xff09; 基本概念&#xff1a;DFS 是一种用于遍历或搜索图或树的算法。它从起始节点开始&#xff0c;沿着一条路径尽可能深地探索下去&#xff0c;直到无法继续或者达到目标节点&#xff0c;然后回溯到上一个…

pytest 框架学习总结

视频&#xff1a;pytest01-快速上手_哔哩哔哩_bilibili 资料&#xff1a;pytest 框架 - 白月黑羽 基于 Python 语言的自动化测试框架 最知名的 有如下 3 款unittest、pytest、robotframework 前两款框架主要&#xff08;或者说很大程度上&#xff09;是 聚焦 在 白盒单元测试…

【图像处理基石】什么是HDR图片?

1. 什么是HDR图片&#xff1f; HDR&#xff08;高动态范围图像&#xff0c;High Dynamic Range&#xff09;是一种通过技术手段扩展照片明暗细节的成像方式。以下是关于HDR的详细说明&#xff1a; 核心原理 动态范围&#xff1a;指图像中最亮和最暗区域之间的亮度差。人眼能…

举例说明 牛顿法 Hessian 矩阵

矩阵求逆的方法及示例 目录 矩阵求逆的方法及示例1. 伴随矩阵法2. 初等行变换法矩阵逆的实际意义1. 求解线性方程组2. 线性变换的逆操作3. 数据分析和机器学习4. 优化问题牛顿法原理解释举例说明 牛顿法 Hessian 矩阵1. 伴随矩阵法 原理:对于一个 n n n 阶方阵 A A

大语言模型的“细胞“:拆解语言模型的DNA——Token

大语言模型的"细胞"&#xff1a;拆解语言模型的DNA——Token 你刚接触AI大模型时&#xff0c;一定听说过"token"这个词。就像生物体的基本单位是细胞&#xff0c;大语言模型处理信息的最小单元就是token。这个看似简单的概念&#xff0c;实则是理解AI如何…

Python驾驭大数据:从数据洪流中挖掘价值

Python驾驭大数据:从数据洪流中挖掘价值 在这个数据爆炸的时代,“数据即财富”已经成为不争的事实。然而,对于大多数企业与个人而言,仅拥有数据并不足够,关键是如何将数据转化为洞察与决策。Python,作为现代数据科学的核心工具,以其强大的生态和简单高效的特性,在大数…

网络安全与七层架构

网络安全与七层架构 随着互联网技术的迅猛发展&#xff0c;网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全&#xff0c;更是企业及国家安全的重要组成部分。而七层架构&#xff08;OSI模型&#xff09;为网络通信提供了理论支撑&#xff0c;能够有效地帮助我们理…