現有的答案有正確的想法,但我懷疑你要總結所有的值在size
作爲nicogen已經完成。
我假設你是選擇一個比較大的size
證明在直方圖的形狀,而是想從每個類別總結一個值。例如,我們要計算每個活動的一個實例的總數,而不是1000個實例。
第一個代碼塊假設你知道你的函數是一個總和,因此可以使用快速numpy的總和來計算的總和。
import numpy as np
import matplotlib.pyplot as plt
mc_trials = 10000
gym = np.random.choice([30, 30, 35, 35, 35, 35,
35, 35, 40, 40, 40, 45, 45], mc_trials)
brush_my_teeth = np.random.choice([2], mc_trials)
argument = np.random.choice([0, 45], size=mc_trials, p=[0.9, 0.1])
dinner = np.random.normal(15, 5/3, size=mc_trials)
work = np.random.normal(45, 15/3, size=mc_trials)
shower = np.random.triangular(left=5, mode=9, right=10, size=mc_trials)
col_per_trial = np.vstack([gym, brush_my_teeth, argument,
dinner, work, shower])
mc_function_trials = np.sum(col_per_trial,axis=0)
plt.figure()
plt.hist(mc_function_trials,30)
plt.xlim([0,200])
plt.show()
![histogram](https://i.stack.imgur.com/ItoST.png)
如果你不知道你的函數,或不能輕易重鑄是作爲numpy的元素智能矩陣運算,你還可以遍歷像這樣:
def total_time(variables):
return np.sum(variables)
mc_function_trials = [total_time(col) for col in col_per_trial.T]
你問關於獲得「概率分佈」。如上所述獲取直方圖並不適合你。它給你一個視覺表示,但不是分配功能。爲了獲得函數,我們需要使用核密度估計。 scikit學會有一個罐頭function and example這樣做。
from sklearn.neighbors import KernelDensity
mc_function_trials = np.array(mc_function_trials)
kde = (KernelDensity(kernel='gaussian', bandwidth=2)
.fit(mc_function_trials[:, np.newaxis]))
density_function = lambda x: np.exp(kde.score_samples(x))
time_values = np.arange(200)[:, np.newaxis]
plt.plot(time_values, density_function(time_values))
![enter image description here](https://i.stack.imgur.com/9i3sm.png)
現在你可以計算總和小於100的概率,比如:
import scipy.integrate as integrate
probability, accuracy = integrate.quad(density_function, 0, 100)
print(probability)
# prints 0.15809
您是否試過[pymc](https://pymc-devs.github.io/pymc/tutorial.html)軟件包? – elphz