隨機漫步
這次我們將使用python生成隨機漫步資料,然后用matplotlib的方式將這些資料呈現出來,
隨機漫步每次行走都完全是隨機的,沒有明確的方向,結果是由一系列隨機決策決定的,你可以這樣認為,隨機漫步就是螞蟻在暈頭轉向的情況下,每次都沿隨機的方向所經過的路徑,
創建RandomWalk()類
為了模擬隨機漫步,我們創建一個RandownWalk的類,它隨機選擇前進的方向,這個類需要三個屬性,其中一個是存盤隨機漫步次數的變數,其他兩個是串列,分別存盤隨機漫步經過的每個點的x坐標和y坐標,
RandomWalk類只包含兩個方法,init()和fill_walk(),其中后者計算隨機漫步經過的所有點,下面是__init__():
from random import choice
class RandomWalk():
"""一個生成隨機漫步資料的類"""
def __init__(self, number_points=5000):
"""初始化隨機漫步的屬性"""
self.number_points = number_points
# 所有隨機漫步都始于(0,0)
self.x_values = [0]
self.y_values = [0]
為做出隨機決策,我們將所有可能的選擇都存盤到一個串列中,并在每次做出決策時都使用choice()來決定使用哪種選擇,然后我們將隨機漫步的默認點數設定為5000,然后我們創建了兩個用于存盤x值和y值的串列,并讓每次漫步都是從(0,0)開始出發,
選擇方向
def fill_walk(self):
"""計算隨機漫步中包含的所有點"""
# 不斷漫步,直到串列達到指定的長度
while len(self.x_values) < self.number_points:
# 決定前進方向以及沿這個方向前進的距離
x_direction = choice([1, -1])
x_distance = choice([0, 1, 2, 3, 4])
x_step = x_direction * x_distance
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
# 計算下一個點的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])隨機選擇一個0~4之間的數,告訴python沿著指定方向走多遠,
我們將移動方向乘以移動距離,以確定沿x軸和y軸移動的距離,如果x_step為正,就將向右移動,為負向左移動,而為0將垂直移動,y_step為正向上移動,為負向下移動,為0則水平移動,如果兩個都為0那么就以為著在原地踏步,我們拒絕這種情況,接著執行下一次回圈,
為獲取隨機漫步的下一個點的x值,我們將x_step和x_values的最后一個值相加,對于y值也做同樣的處理,獲得下一個點的x值和y值之后,我們將它分別附加到串列x_values和y_values的末尾,
繪制隨機漫步圖
我們將上面創建RandomWalk類的py檔案命名為random_walk.py,
下面的代碼將隨機漫步的所有點都繪制出來:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
# 創建一個RandWalk實體,并將其包含的點都繪制出來
rw = RandomWalk(5000)
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()
我們首先匯入了模塊pyplot和RandomWalk類,然后創建了一個RandomWalk實體,并將其存盤到rw中,再呼叫fill_walk(),下圖就是顯示了包含了5000個點的隨機漫步圖,
模擬多次隨機漫步
每次隨機漫步都不相同,因此探索可能生成的各種模式很有趣,在不多次運行程式的情況下使用前面的代碼模擬多次隨機漫步,一種辦法就是將前面的代碼放進一個while回圈中,如下所示:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 創建一個RandWalk實體,并將其包含的點都繪制出來
rw = RandomWalk(5000)
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=1)
plt.show()
keep_running = input('Make another walk? (y/n) : ')
if keep_running == 'n':
break
這些代碼模擬一次隨機漫步,如果你輸入y則再繼續模擬生成一次隨機漫步,輸入n的話就退出程式了,
給點著色
我們將使用顏色映射出漫步中個點的先后順序,并洗掉各個點的黑色輪廓,讓他們顏色更加明顯,為根據漫步中各點的先后順序進行著色,我們傳遞引數c,并設定一個串列,其中包含各點的先后順序,由于這些點都是按順序繪制的,因此引數c指定的串列只需包含數字1~5000即可,如下所示:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 創建一個RandWalk實體,并將其包含的點都繪制出來
rw = RandomWalk(5000)
rw.fill_walk()
point_numbers = list(range(rw.number_points))
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
plt.show()
keep_running = input('Make another walk? (y/n) : ')
if keep_running == 'n':
break
我們使用range生成了一個數字串列,其中包含的數字與漫步包含的點數相同,接下來,我們將這個串列存盤到point_numbers中,以方便使用它設定每個漫步點的顏色,我們將每個引數c設定為point_numbers,指定顏色映射為藍色,并傳遞實參edgecolors以洗掉每個點周圍的輪廓,最終的隨機漫步圖由淺藍色漸變為深藍色,如下圖所示:

重新繪制起點和終點
除了給隨機漫步各個點著色,以指出他們的先后順序外,如果還能呈現隨機漫步的終點和起點就更好了,為此,可在繪制隨機漫步圖后重新繪制隨機漫步的起點和終點,我們讓起點和終點變得更大,并顯示為不同的顏色,以突出它們,如下所示:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 創建一個RandWalk實體,并將其包含的點都繪制出來
rw = RandomWalk(5000)
rw.fill_walk()
point_numbers = list(range(rw.number_points))
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
# 突出起點和終點
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()
keep_running = input('Make another walk? (y/n) : ')
if keep_running == 'n':
break

為突出起點,我們使用綠色繪制點(0,0),并使其比其它點大,為突出終點,我們在漫步包含的最后一個x值和y值處繪制一個點,使其為紅色,并比其它點大,運行代碼,將準確知道每次隨機漫步的起點和終點,
隱藏坐標軸
下面來隱藏坐標軸,以免我們注意點是坐標軸而不是隨機漫步路徑,要隱藏坐標做代碼如下:
# 隱藏坐標軸
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
為修改坐標軸,使用函式plt.axes()來將每條坐標軸的可見性設定為False,圖如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248104.html
標籤:python
