import numpy as np
from numpy.linalg import inv,eig
import matplotlib.pyplot as plt
import pandas as pd
from scipy.stats import norm
蒙特卡洛是一个赌场的名字,我对他的理解大概是这一个使用随机数暴力求解的算法。其步骤主要为以下三个:
np.random.seed()
可以设置随机数种子,随机数种子有三位数的int,设置随机数种子后,每次生成的随机数均相同,不填入种子,则生成的随机数不同。np.random.normal(均值, 标准差, 样本个数)
生成服从 N ( 均值,标准差 ) N(均值,标准差) N(均值,标准差)的确定个数的样本。np.random.uniform(下界, 上界, n)
生成服从均匀分布 U ( a , b ) U(a,b) U(a,b)的确定个数的样本。np.random.binomial(n, p, n)
生成服从二项分布 b ( n , p ) b(n,p) b(n,p)的确定个数的样本。np.random.exponential(1/lambda)
: 指数分布,生成服从指数分布 E X P ( 1 λ ) EXP({1\over{\lambda}}) EXP(λ1)的确定个数的样本。np.random.poisson(lam)
:生成服从参数 λ \lambda λ确定的泊松分布的确定个数的样本。mu = 0;sigma = 1;n=10000
x = np.random.normal(mu,sigma,n)
# x =np.random.uniform(2,4,n)
plt.hist(x,bins=300)
plt.axvline(x=mu,color = "red",label="u")
plt.legend()
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #中文标签
a = 2;b = 5;n = 10000 #抽样个数
e = (a+b)/2 #计算得出的总体均值
E = list() #样本均值列表
mean_e = list() # 样本均值的均值存储列表
for i in range(1000):
x = np.random.uniform(a,b,n) #抽10000个样本
E.append(np.mean(x)) #储存每一次x的均值
mean_e.append(np.mean(E)) #储存每一次均值的均值
plt.figure("样本均值的分布")
plt.hist(E,bins = 100)
plt.axvline(x=e,color = "red")
plt.title("均值的分布情况")
Text(0.5, 1.0, ‘均值的分布情况’)
由大数定理可以得知,样本的均值是总体均值的无偏估计,即 E ( E ( X ˉ ) ) = μ E( E(\bar{X}) ) = \mu E(E(Xˉ))=μ
即当抽样检验的次数越多时,样本均值的数学期望(均值)会越来越接近总体均值
plt.figure(112)
plt.title("均值的期望趋势")
plt.scatter(range(1000),mean_e,label = "均值的期望")
plt.axhline(y=e,color = "red",label = "总体均值")
plt.legend()
from math import sqrt
n = 10000
a = 2;b=3
x = np.random.normal(0,1,n)
y = (x+a)/b #生成(x+a)/b的分布,
y.sort() # 将这些个体从小到大排列的话,便是在横坐标函数的横坐标,即分位数。
prob = (np.arange(n)+1/2)/n #生成[0,1]间连续分布的n个的采样值(概率值)
q = norm.ppf(prob,a/b,1/b) #ppf正态分布求解分位数的函数,第一个参数是对应的概率值,所以使用[0,1]均匀分布的函数
# y 是需要我们验证的分布,因为其是由x变换求得的,q是由a/b、1/b生成的,是用来对比的
plt.scatter(x=q,y=y,color='red',label = "理想计算值分位数散点")
plt.plot(y,y,color = 'blue',label = "y=x参考线")
plt.legend()
plt.title("Q-Q图")
plt.xlabel("理想的分布")
plt.ylabel("实际的散点分布")
Text(0, 0.5, ‘实际的散点分布’)
可以看出 y = x + a b y={x+a\over{b}} y=bx+a 服从 N ( a b , 1 b ) N({a\over{b}},{1\over{b}}) N(ba,b1),
符合我们的计算 E ( y ) = E ( x b ) + E ( a b ) = 0 + a b E(y)= E({x\over{b}})+E({a\over{b}})=0+{a\over{b}} E(y)=E(bx)+E(ba)=0+ba
D ( y ) = D ( x b ) + D ( a b ) = 1 b 2 ∗ 1 + 0 = 1 b 2 = = > σ = 1 b D(y) = D({x\over{b}})+D({a\over{b}}) = {1\over{b^2}}*1 + 0 = {1\over{b^2}} ==> \sigma = {1\over{b}} D(y)=D(bx)+D(ba)=b21∗1+0=b21==>σ=b1
jupyter源文件在此处