题目 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
实验结果及分析
实验结果
-
100 个独立等分布的样本
[-3.38703056e-01 1.25719737e+00 -5.95557220e-01 9.29009022e-03 2.33077360e-01 4.19338186e-01 -2.88219292e+00 1.01633331e+00 -3.57167334e-01 9.07019226e-01 -6.80304902e-02 -3.11649246e-02 -1.03941839e-01 -3.25470976e-01 -3.91938043e-01 -7.05427932e-01 -8.67716651e-01 5.24122765e-01 7.43172960e-01 2.67250765e-01 -1.87787053e+00 1.09831838e+00 1.54990829e+00 -5.62240957e-01 2.43603705e-01 6.86360286e-01 -1.14586607e-01 -1.46388942e+00 -1.64536828e-01 -1.38174863e-01 8.06547809e-01 2.64402058e-01 -6.91517587e-02 -1.75669500e-01 8.89946362e-01 -1.15527876e+00 -3.78578829e-01 6.99080994e-02 -1.89452630e-03 -2.36555011e-01 5.52770828e-01 -1.24656605e-01 -1.08180214e+00 -6.87375350e-01 -6.30115765e-01 -2.57973625e-01 -6.97239371e-01 -3.19449897e-01 3.34303406e-01 -5.14395853e-01 1.50611513e-01 1.00867531e+00 1.27424379e-01 5.44879745e-01 4.17240284e-01 9.81261243e-01 1.43866804e-02 6.41492600e-01 -2.96476452e-01 2.73054878e+00 -9.64058039e-01 2.17378149e+00 -7.92221308e-02 -4.63823570e-01 -3.13243717e-01 -1.11803396e-01 1.06766772e-01 -2.91342171e-01 6.31716602e-01 5.49117285e-01 -3.90605470e-01 9.14193373e-02 1.90674476e+00 1.12240620e-01 -9.48045416e-01 2.31648027e+00 2.05490973e+00 -1.83925851e+00 -1.10969893e+00 8.82463653e-01 9.26237922e-01 -7.55337073e-03 -2.74670974e-01 2.61457429e-01 9.81956271e-01 3.70477140e-02 1.00804189e+00 -3.24020226e-02 7.77463811e-03 -2.98610900e+00 3.43289462e+00 -3.15996113e-01 -1.57024575e-02 -4.43106666e-01 -1.88075617e-01 5.77781594e-03 4.37862073e-01 1.84532553e+00 4.15082412e-01 1.63258658e-01]
结果分析
- 将采样数据可视化统计在一定区间上的频率
- 绘制标准LaplaceX 随机变量X概率密度函数
由于采样点不足发现采样数据与标准概率密度函数有所偏差增大采样数
增大采样数发现采样结果更符合X分布,体现了大数定律。
最后环节——上源码
# -*- coding: utf-8 -*-
"""
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)