やりたいこと
Pythonを利用して、モンテカルロ法の計算を行っています。
考えている問題点
コードは下記に記した通り、各パラメータに分布を与えて数値を発生させたうえで計算する方式を考えてます。
当初はそれらしい結果が出てきたので上手くいっていると思っていたのですが、比較すべき統計値との乖離が大きく、結果を分析してみたところ現状の計算で出てくる最大値(out[6]:577256)の結果と各パラメータの最大値で無理やり計算した結果(Out[7]:625780)の乖離が原因では無いかと考えています。
現状のコードではリストに収納された数値同士の組み合わせでの計算なので、必ずしもすべてのパラメータが最大値のケースは発生しないことが原因なのではと思っています。
考えている対応策
対応策としては、1.無理やり全通り計算させるような方式に変更するか、2.乱数の生成数(現状10000)と実際の計算トライアルの数を異なるものとすれば(例:乱数の生成を1000通り、本計算の回数を10万通り)、改善されるのではと思っていますが、Python初心者でしてうまいコードの書き方が判りません。
アドバイスよろしくお願い致します。
###Python
コード
#Monte Carlo
In [1]:import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
#Properties
In [2]:trials = 10000
A = np.random.uniform(0.1, 0.3, trials)
B = np.random.uniform(500, 700, trials)
C = np.random.triangular(10, 20, 30, trials)
D = 100
In [3]:x = A * B * C * D
x = x.astype(int)
count = np.bincount(x)
mode = np.argmax(count)
In [4]:fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.hist(x, bins=18, density=False, rwidth=0.6, Color="steelblue")
ax.set_title('Test')
ax.set_xlabel('x')
ax.set_ylabel('Frequency')
Out[4]:Text(0, 0.5, 'Frequency')
In [5]:print('P90: {:.0f} '.format(sorted(x)[int(trials * 0.1)]))
print('P50: {:.0f} '.format(sorted(x)[int(trials * 0.5)]))
print('P10: {:.0f} '.format(sorted(x)[int(trials * 0.9)]))
print('Mean: {:.0f} '.format(int(np.mean(x))))
print('Stdv: {:.0f} '.format(int(np.std(x))))
print('Mode: {:.0f} '.format(int(np.argmax(count))))
P90: 132027
P50: 229595
P10: 366067
Mean: 241177
Stdv: 90505
Mode: 199554
In [6]:max(x)
Out[6]:577256
In [7]:x2 = max(A) * max(B) * max(C) * D
x2
Out[7]:625780.9249227662
回答2件
あなたの回答
tips
プレビュー