УПРАЖНЕНИЯ
15-1 . Кубы: число, возведенное в третью степень, называется «кубом» . Нанесите на диа-
грамму первые пять кубов, а затем первые 5000 кубов .
15-2 . Цветные кубы: примените цветовую карту к диаграмме с кубами .
Случайное блуждание
В этом разделе мы используем Python для генерирования данных для случайного
обхода, а затем при помощи
matplotlib
создадим привлекательное представление
сгенерированных данных. Случайным блужданием (random walk) называется путь,
который не имеет четкого направления, но определяется серией полностью случай-
ных решений. Представьте, что муравей сошел с ума и делает каждый новый шаг
в случайном направлении; его путь напоминает случайное блуждание.
Случайное блуждание находит практическое применение в естественных науках:
физике, биологии, химии и экономике. Например, пыльцевое зерно на поверх-
ности водяной капли движется по поверхности воды, потому что его постоянно
подталкивают молекулы воды. Молекулярное движение в капле воды случайно,
320 Глава 15 • Генерирование данных
поэтому путь пыльцевого зерна на поверхности представляет собой случайное
блуждание. Код, который мы напишем, найдет применение при моделировании
многих реальных ситуаций.
Создание класса RandomWalk()
Чтобы создать путь случайного блуждания, мы создадим класс
RandomWalk
, кото-
рый принимает случайные решения по выбору направления. Классу нужны три
атрибута: переменная для хранения количества точек в пути и два списка для
координат x и y каждой точки.
Класс
RandomWalk
содержит всего два метода:
__init__()
и
fill_walk()
для вычис-
ления точек случайного блуждания. Начнем с метода
__init__()
:
random_walk.py
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
:
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_distance
Случайное блуждание 321
y_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_step
next_y = self.y_values[-1] + y_step
self.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])
определяет дальность перемещения в этом направлении (
x_distance
)
случайным выбором целого числа от 0 до 4. (Включение 0 позволяет выполнять
шаги по оси
y
, а также шаги со смещением по обеим осям.)
В точках и определяется длина каждого шага в направлениях
x
и
y
, для чего
направление движения умножается на выбранное расстояние. При положительном
результате
x_step
смещает вправо, при отрицательном — влево, при нулевом —
вертикально. При положительном результате
y_step
смещает вверх, при отрица-
тельном — вниз, при нулевом — горизонтально. Если оба значения
x_step
и
y_step
равны 0, то блуждание останавливается, но цикл продолжается .
Чтобы получить следующее значение
x
, мы прибавляем значение
x_step
к по-
следнему значению, хранящемуся в
x_values
, и делаем то же самое для значе-
ний
y
. После того как значения будут получены, они присоединяются к
x_values
и
y_values
.
Вывод случайного блуждания
Ниже приведен код отображения всех точек блуждания:
rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk
# Построение случайного блуждания и нанесение точек на диаграмму.
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()
322 Глава 15 • Генерирование данных
Сначала программа импортирует
pyplot
и
RandomWalk
. Затем она создает случайное
блуждание и сохраняет его в
rw
, не забывая вызвать
fill_walk()
. В точке про-
грамма передает
scatter()
координаты
x
и
y
блуждания и выбирает подходящий
размер точки.
На рис. 15.8 показана диаграмма с 5000 точками. (В изображениях этого раз-
дела область просмотра
matplotlib
не показана, но вы увидите ее при запуске
rw_visual .py
.)
Достарыңызбен бөлісу: |