Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

ランダムウォーク

ランダムウォークは確率的な運動モデルの一種で、次にどちらに動くかを確率的に決めるため不規則な挙動を示します。 ここでは2次元のランダムウォークモデルとして、一ステップ毎に上下左右4方向に一定距離ランダムに移動する場合を考えます。ステップ数を10、100、1000、10000と変え各ステップで100回試行し、移動後の位置の分布を比べます。移動方向がランダムなのでステップ数が多くなると上下左右の出現数が収束し各方向への移動距離が均等化され、スタート位置に戻ってきそうですが実際はそうはならず、ステップ数が多い程、移動後の位置は広く分布します。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • opencv 4.0.0
コード

移動方向の選択は、以下の4つの移動距離の組み合わせをタプルにして、その内一つを標準ライブラリrandomのrandom.choiceを用いてランダムに選択しています。
x -1 y 0 ・・・左に移動
x 1 y 0 ・・・右に移動
x 0 y -1 ・・・上に移動
x 0 y 1・・・下に移動

import random
import numpy as np
import cv2

def randomwalk(points, steps):
    height, width = 500, 500
    
    step_list = ((-1, 0), (1, 0), (0, -1), (0, 1))
    img = np.zeros((height, width, 3), np.float64)
    
    for i in range(points):
        x = int(width/2)
        y = int(height/2)
        for t in range(steps):
            step = random.choice(step_list)
            x += step[0]*5
            y += step[1]*5
            
        cv2.rectangle(img, (x-2, y-2), (x+2, y+2), (0, 128, 255), -1)
    cv2.rectangle(img, (int(width/2)-2, int(height/2)-2), (int(width/2)+2, int(height/2)+2), (0, 255, 0), -1)
    filename = 'randomwalk'+str(points)+'_'+str(steps)+'.png'
    cv2.imwrite(filename, img)

randomwalk(points=100, steps=10)  
randomwalk(points=100, steps=100)
randomwalk(points=100, steps=1000)
randomwalk(points=100, steps=10000)

実行結果

10ステップ移動した場合(点は100個)
f:id:T_A_T:20200714193927p:plain

100ステップ移動した場合(点は100個)
f:id:T_A_T:20200714193953p:plain

1000ステップ移動した場合(点は100個)
f:id:T_A_T:20200714194008p:plain

10000ステップ移動した場合(点は100個) 。大半の点は画像の外に移動しています。
f:id:T_A_T:20200714194023p:plain

以下のサイトを参考にさせていただきました

ランダムウォーク『ウィキペディア(Wikipedia)』
Pythonの文法メモ >> 【標準ライブラリ】randomによる乱数生成
Pythonの文法メモ >> 【OpenCV】長方形を描画するrectangle

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村