機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

【Python実装】モンテカルロ法

本記事のアルゴリズムの記事はこちらです。

アルゴリズムが単純なので、ソースを貼り付けるだけにします。

###############################
#       モンテカルロ法
###############################
import numpy as np
import matplotlib.pyplot as plt

# 乱数を固定
np.random.seed(1)

# 円作成
x, y = [],[]

for d in np.linspace(-180, 180, 360):
    x.append(np.sin(np.deg2rad(d))) # sinの値をxとする
    y.append(np.cos(np.deg2rad(d))) # cosの値をyとする

# 点を発生
N = 100   # 発生させる点の個数

xmc = np.random.uniform(-1, 1, N)   # -1 から 1 まで N個乱数を発生させる
ymc = np.random.uniform(-1, 1, N)   # -1 から 1 まで N個乱数を発生させる
r = (xmc ** 2 + ymc ** 2) ** 0.5    # 原点からの距離を計算
accept = np.where(r <= 1, 1, 0)     # 円の中に点を1, 円の外にある点を0とする
accept_ratio = np.sum(accept) / N   # 円の中に点がある確率を求める
print("発生させた点の数: ", N)
print("数値的に計算 π: ", accept_ratio * 4)
print("真の値 π: ", np.pi)

# 円描画
plt.gca().set_aspect('equal', adjustable='box') # グラフを正方形にする
plt.plot(x,y)   # 円の線分をプロット

# 点描画
plt.scatter(xmc, ymc, color = "red", marker = ".")  # 点をプロット
plt.show()  # グラフを描画

実行結果は以下です。

f:id:olj611:20210408164027p:plain:w400

おまけ

プログラムをちょっと変えて、Nを増やして数値的に求めた\piが真の値に近づくか調べてみました。
グラフの横軸は\log_{10}Nで、対数を取っていることに注意してください。

f:id:olj611:20210408162607p:plain:w400

点の数N\log_{10}N\piの値
101.03.2
501.692.64
1002.02.88
5002.693.168
10003.03.08
50003.693.1552
100004.03.1188
500004.693.12816
1000005.03.1474
5000005.693.14216
10000006.03.140636
50000006.693.141756
100000007.03.1407636

偉人の名言

f:id:olj611:20210408150232p:plain:w300
どんなに悔いても過去は変わらない。どれほど心配したところで未来もどうなるものでもない。
いま、現在に最善を尽くすことである。
松下幸之助

動画

目次へ戻る