質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1389閲覧

ランダムウォーク3次元プロットについて(x, y, probability)

Fallout_18

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/03 17:11

すみません。。
前回の質問も込みで、3,4日以上かけて考えたのですが、x,y平面上をランダムウォークしたときの、それぞれの位置に依存した確率をz軸として3次元plotしたく、苦戦しています。。
(*私が質問しているのは、大学の課題ではないです。独学でやっております)

python

1import random 2import matplotlib.pyplot as plt 3import numpy as np 4from mpl_toolkits.mplot3d import Axes3D 5import sympy as sym 6from sympy import* 7 8N=0 9P=1 10def random_walk_2d(N): #関数を定義します 11 x , y = 0, 0 12 step_x, step_y= [x],[y] 13 for i in range(N): #今回は100に設定したから、iは100の範囲 14 x += random.choice([1, -1]) #xに-1,1のどれかを足す 15 P *=sym.Rational(1,4) 16 y += random.choice([1, -1]) 17 P *=sym.Rationla(1.4) 18 step_x.append(x) #足したxをstep_xに格納する 19 step_y.append(y) 20 return [step_x, step_y, P]#Nステップ終わったら値を返す 21###定義終わり 22#怪しい 23#定義した関数を使う 24walk = random_walk_2d(1000) 25#print(walk) 26plt.plot(walk[0], walk[1], P)#xとyのそれぞれのwalk 27plt.axis([-100,100,-100,100]) 28plt.xlabel("x") 29plt.ylabel("y") 30plt.zlabel("probilty") 31plt.show()

設定】
原点スタートで、1回のステップでx=1 or -1 かつ y= 1 or -1 を移動していきます。

つまり、確率1/4でどれかに移動してくのですが、この確率を(x,y)の関数としなければ、3次元プロットができないということなのでしょうか?
確率をどのように、x,yと絡めるのかわからず、正直、コードはぐちゃぐちゃです。

ご教授の方、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2018/03/04 03:40

「それぞれの位置に依存した確率」とは、どういう意味ですか? それぞれの位置が何を意味しているのか、”何の”確率なのか、等が判りません。
Fallout_18

2018/03/05 08:27

説明不十分で申し訳ないです。例えば、(1,1)にいる確率と(100,100)にいる確率だと、明らかに(100,100)の確率のほうが低いと思いました。距離が長くなれば、確率が低くなるとの意味で申しました。僕の考えが違っていたら申し訳ないです。
Fallout_18

2018/03/05 08:30

x,y方向(x:-1 or 1 ,y: -1 or 1)のいずれかに等確率で等距離(=1)でランダムに移動する物体を考えています。
guest

回答2

0

ベストアンサー

2次元平面上に一匹の猫がいて、単位時間あたり平面上で東西南北いずれかの方向へ単位距離だけランダムに進む。進む方向は同確率。

といったイメージでよいのですよね・・・処理の都合上移動可能範囲を限定して南北、北西それぞれNの大きさの平面とし、そこからは「でられない」と仮定します。(これは質問者さんの設定ではなく自分なりの設定です)

質問者さんのコードで区画制約と何単位時間経過後の確率を計算しようとしているかわからなかったので、区画範囲をSIZE, 異動階数をMOVE_TIMESと置きコードを書いてみました。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4 5SIZE = 100 6MIN = 0 7MAX = SIZE - 1 8MOVE_TIMES = 1000 9 10 11# まずは確率を計算してしまおう 12p = np.zeros((SIZE, SIZE), dtype=np.float) 13# 初期位置 14p[SIZE//2, SIZE//2] = 1.0 15# 4隅は2方向にしか進めない, 境界線上は3方向にしか進めない, それ以外は4方向へ進める 16p_factor = np.ones((SIZE, SIZE), dtype=np.float) 17p_factor[[0, SIZE-1], :] = 4 / 3 18p_factor[:, [0, SIZE-1]] = 4 / 3 19p_factor[0, [0, SIZE-1]] = 2 20p_factor[SIZE-1, [0, SIZE-1]] = 2 21p_factor /= 4 22for count in range(MOVE_TIMES): 23 pn = p * p_factor 24 p = np.zeros((SIZE, SIZE), dtype=np.float) 25 # 北へ 26 p[:, :-1] += pn[:, 1:] 27 # 南へ 28 p[:, 1:] += pn[:, :-1] 29 # 東へ 30 p[1:, :] += pn[:-1, :] 31 # 西へ 32 p[:-1, :] += pn[1:, :] 33 34 35def probability(x, y): 36 return p[x, y] 37 38 39def probabilities(xm, ym): 40 pf = np.vectorize(probability) 41 return pf(xm, ym) 42 43 44xs = np.array(range(SIZE)) 45ys = np.array(range(SIZE)) 46 47xm, ym = np.meshgrid(xs, ys) 48 49vm = probabilities(xm, ym) 50 51fig = plt.figure() 52ax = fig.add_subplot(111, projection='3d') 53surf = ax.plot_surface(xm, ym, vm, cmap='bwr', linewidth=0) 54fig.colorbar(surf) 55ax.set_title("Random walk ({} times)".format(MOVE_TIMES)) 56 57plt.show() 58

この確率を(x,y)の関数としなければ、3次元プロットができない

matplotlibが要求するのは関数というよりプロットすべき系列データですのでそれが用意できれいればよいと思います。上のコードでは実際の確率は平明座標上の各確率を表す二次元の配列で直接系列データを生成しています。

ところで、上のコードはN回目の移動後の確率がどうなるかを計算によって求めており、randomな試行による「近似値」を求めるというアプローチはしていません。上下左右に1/4の確率で移動するのですからある時間Tに(x,y)に猫がいる確率がpだった場合はT+1にはp/4の確率で(x,y)の東西南北に隣接した座標の確率になるということに基いて直接確率計算ができると思ったからです。端点だけちょっと工夫しており4隅は2方向にしか移動できず4辺は3方向、それ以外は4方向へ移動可能となっていることをp_factorという確率配列を用いて表現しています。

probability(x, y), probabilitiesという関数を用意はしていますが本コードではそれ自体にあまり意味はありません。しかし確率がx, yの関数として計算できる場合は「まずは確率密度を計算してしまおう」とコメントしているブロックは不要になり、probability(x, y)にしかるべき定義を入れてやればグラフがプロットできるという意味であえて冗長なコードを残してあります。


SIZE=8, MOVE_TIMES=1およびSIZE=100, MOVE_TIMES=1000でやってみるとこんなふうになりました。

イメージ説明
イメージ説明

投稿2018/03/04 13:44

編集2018/03/05 01:49
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/03/04 13:57

すみませんが、matplotlibの使い方をほとんど知らず見様見真似でやっているため冗長な点、おかしな点があるかも知れません。それについてはご容赦の程を。
Fallout_18

2018/03/05 08:44

私の、設定の説明不十分で申し訳ありませんでした。 しかし、私が言いたかったのは上記のおっしゃる通りです。 そうですね、制約条件をすっかり忘れていました。 一度、お答えして頂いたコードを、嚙み砕いて落とし込んでみます、解説も書いていただいて、非常にありがたく思っています。 ありがとうございました。
Fallout_18

2018/03/05 13:52

申し訳ないです、文字列演算を使っている以下について、少し説明いただけないでしょうか。。。。? p_factor[[0, SIZE-1], :] = 4 / 3 p[:, :-1] += pn[:, 1:]
guest

0

間違えました。ああああああ

投稿2018/07/15 06:45

編集2018/07/15 06:46
Fallout_18

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問