题目 3:随机采样
小透明
任务定义
已知 LaplaceX 随机变量X,它的均值为 0,方差为 1
通过一个均匀分布的随机抽样,实现对x~p(x)的抽样,并得到对应的 100 个独立等分布的样本
实验环境
windows系统、spyder软件
方法描述
-
逆函数采样
Y符合[0-1]均匀分布,通过随机取样、逆函数变换实现对X的采样
-
编程实现
逆函数构造
def inserve(y):
if y>0.5:
x=-1/(np.sqrt(2))*np.log(2-2*y)
else:
x=1/(np.sqrt(2))*np.log(2*y)
return x
随机采样
X=np.zeros(num)
for i in range(num):
y=random.random()
x=inserve(y)
X[i]=x
实验结果及分析
实验结果
结果分析
由于采样点不足发现采样数据与标准概率密度函数有所偏差增大采样数
增大采样数发现采样结果更符合X分布,体现了大数定律。
最后环节——上源码
"""
Created on Thu May 6 15:09:50 2021
@author: Administrator
"""
import random
import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import math
num=200
def pdf(x):
if x>0:
y=1/(np.sqrt(2))*np.exp(-1*x*np.sqrt(2))
else:
y=1/(np.sqrt(2))*np.exp(x*np.sqrt(2))
return y
def inserve(y):
if y>0.5:
x=-1/(np.sqrt(2))*np.log(2-2*y)
else:
x=1/(np.sqrt(2))*np.log(2*y)
return x
X=np.zeros(num)
for i in range(num):
y=random.random()
x=inserve(y)
X[i]=x
bins = np.linspace(X.min(), X.max(), 20)
b = np.linspace(X.min(), X.max(), 40)
out=np.zeros(40)
for i in range(40):
out[i]=pdf(b[i])
frequency_each, _1, _2 = plt.hist(X,
bins,
alpha=1,
density=True)
plt.xlim(X.min(), X.max())
gap=(X.max()-X.min())/20
for i in range(20):
bins[i]+=gap/2
plt.plot(b,out,color='g')
plt.xlabel('sample')
plt.ylabel('frequency')
plt.legend('p')
plt.title('N:200')
plt.show()
print(X)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)